解析react 高阶组件(withRouter)

最近正在学前端的react框架中的路由,觉得withRouter这一个高阶组件有点小难度,今天在这里总结了一下关于withRouter的一些主要操作和一些独家见解给大家分享一下

  1. 先简单介绍一下什么是高阶组件(withRouter)

高阶组件(HOC): 一个包装了另一个基础组件的组件。(相对高阶组件来说,我习惯把被包装的组件称为基础组件)
注意: 这里说的是包装,可以理解成包裹和组装;

定义: 高阶组件就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件

  • 了解了定义,给大家来段代码认识一下
function WithCom(component){//这里的参数接受的是一个组件return class  extends React.Component{render(){return (<div>这是一个高阶组件</div>)}}
}
  • 上面这段代码就是高阶组件(HOC)的简单描述,

  • 其实高阶组件就是一个函数不过他的参数和返回值都是组件

  • 高阶组件还是一个没有副作用的纯函数

  • 接下来给大家详细介绍一个HOC的两个作用

a) 属性代理(Props Proxy)

可以说是对组件的包裹,在包裹的过程中对被包裹的组件做了点什么(props的处理,把基础组件和其他元素组合),然后返回,这就成了一个高阶组件;

  • 举个栗子:
 class App extends React.Component {componentDidMount(){console.log(this.props)}render(){return (</div>);}
}
export default (App);

输出的结果: {}

  • 如上代码因为他不是路由切换组件所以他就没有this.props值,所以上面代码输出的结果是 {} 一个空对象
  • 如果通过HOC的属性代理可实现代理属性,可以达到组件可获得属性继承,如下:
 class App extends React.Component {componentDidMount(){console.log(this.props)}render(){return (</div>);}
}
export default withRouter(App);

输出的结果:{history: {…}, location: {…}, match: {…}, staticContext: undefined}

b) 反向继承(Inheritance Inversion)

可以理解成是组装,和属性代理不同的是,反向继承是继承自基础组件,所有很自然,它可以直接获取基础组件的props,操作基础组件的state。可以通过 反向继承的形式,配合compose将携带不同功能模块的高阶组件组装到基础组件上,加强基础组件。

  • 举个栗子:
function WithCom(Com){return class  extends React.Component{render(){console.log(this.props)if(sessionStorage.getItem("user")==="admin"){return <div>true</div>}else{return <div>false</div>}}}
}
export default WithCom;
  • 上图是一个反向继承的一种 典型的使用方式叫做渲染劫持,这种方式充分的体现了反向继承的特点

渲染劫持
所谓渲染劫持就是,高阶组件控制了基础组件渲染生成的结果,因为基础组件的渲染被控制,高阶组件就可以对它做点什么。。。比如:
   (1)、根据条件,控制渲染的结果;
      (2)、改变dom树的样式;
      (3)、改变基础组件中一下被渲染元素的props;
      (4)、操作dom树中的元素。

今天小白的分享先就这些了,如果有什么疑问,可以在留言去留言,小白会尽力给大家解疑,最后感谢大家的观赏和支持,下期见。

(逆战班)

react withRouter相关推荐

  1. react withRouter的用法

    withRouter的作用就是, 如果我们某个东西不是一个Router, 但是我们要依靠它去跳转一个页面, 比如点击页面的logo, 返回首页, 这时候就可以使用withRouter来做.withRo ...

  2. react ——withRouter——页面隐式传值—嵌套路由——渲染方式——自定义导航组件

    withRouter import {Route,Switch,withRouter} from "react-router-dom" withRouter高阶组件增强组件--获取 ...

  3. react withRouter和connect 同时使用的案例

    在react中,如果遇到redux的connect  和 一般组件跳转的withRouter 同时使用 ... import React from 'react'; import {connect} ...

  4. react withRouter 离开页面触发

    componentDidMount(){ this.props.router.setRouteLeaveHook(this.props.route, () => { //if (this.sta ...

  5. react中@withrouter_为什么 withRouter 高阶组件应该 处于最外层?

    这篇文章的主要内容是说 React 16.3 以前的 getChildContext 这个老 Context API 存在会被 PureComponent 截断的问题,React-Router 4.3 ...

  6. React 路由报错 You should not use Route or withRouter() outside a Router

    App.js在中的代码 import React, {Component , Fragment} from 'react'; import {withRouter , Route , Switch , ...

  7. 使用react 高阶组件withRouter

    使用react 高阶组件withRouter withRouter 是一个高阶组件,把 match,location,history 三个对象注入到组件的 props 中.这是一个非常实用的函数 re ...

  8. react之withRouter的作用

    withRouter的作用:把不是通过路由切换过来的组件,将react-router的history.location和match三个对象传入到props对象上: 默认情况下必须是经过路由匹配渲染的组 ...

  9. react+ts项目实战:如何使用withRouter?

    1.我使用withRouter使解决什么问题? 我在项目中使用了antd的Menu组件,其中defaultOpenKeys和defaultSelectedKeys两个属性要是设为一个固定的值,每次刷新 ...

最新文章

  1. JavaScript 的使用简单总结
  2. MyBatis源码骨架分析
  3. SVN:This client is too old to work with working copy…解决的方法
  4. python cmd命令大全-详解python调用cmd命令三种方法
  5. RHEL 6.x 搭建企业级FTP
  6. 283. Move Zeroes(数组篇)
  7. laravel5.4之artisan使用总结一
  8. IntelliJ IDEA 学习笔记
  9. 一旦上云,欲罢不能,带大家薅一薅“云羊毛”
  10. 蔚来:4月交付7102台 同比增长125.1%
  11. TensorFlow VGG16
  12. 8.19 NOIP模拟测试26(B) 嚎叫响彻在贪婪的厂房+主仆见证了 Hobo 的离别+征途堆积出友情的永恒...
  13. MFC 对话框 添加 工具栏
  14. 了解Go编译处理(三)—— 初识go compile
  15. 8个顶级云安全解决方案
  16. 点击click触发两次事件解决办法
  17. bug还没找到,程序员同志,快醒醒
  18. Android NFC识别CPU卡和m1卡
  19. 9. Enhancing Aspect Term Extraction with Soft Prototypes论文阅读笔记
  20. iOS 推送及bundle ID provision生成教程

热门文章

  1. 2020年过氧化工艺新版试题及过氧化工艺复审考试
  2. ‘npm‘不是内部或外部命令,也不是可运行的程序 或批处理文件
  3. acs cisco 查看log_ACS常用操作(实战)
  4. java map遍历删除_Java Map在遍历过程中删除元素
  5. OpenStack入门以及一些资料之(四、Heat)
  6. CCFL、LED、QDEFF、ALD、Mini LED、双面发光
  7. JS slice()方法返回数组中指定元素
  8. 大连爱在海边儿童村第三期电子杂志draft
  9. 计算机毕业论文内容参考|基于神经网络的网络安全态势感知技术研究
  10. 《SQL》SQL查询数据库注释