加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

【React深入】从Mixin到HOC再到Hook

发布时间:2019-04-12 18:52:59 所属栏目:优化 来源:ConardLi
导读:副标题#e# 导读 前端发展速度非常之快,页面和组件变得越来越复杂,如何更好的实现状态逻辑复用一直都是应用程序中重要的一部分,这直接关系着应用程序的质量以及维护的难易程度。 本文介绍了React采用的三种实现状态逻辑复用的技术,并分析了他们的实现原

通过反向继承实现

  1. function styleHOC(WrappedComponent) {  
  2.   return class extends WrappedComponent {  
  3.     render() {  
  4.       return <div>  
  5.         <div className="title">{this.props.title}</div>  
  6.         {super.render()}  
  7.       </div>  
  8.     }  
  9.   }  

条件渲染

根据特定的属性决定原组件是否渲染

通过属性代理实现

  1. function visibleHOC(WrappedComponent) {  
  2.   return class extends Component {  
  3.     render() {  
  4.       if (this.props.visible === false) return null;  
  5.       return <WrappedComponent {...props} />;  
  6.     }  
  7.   }  

通过反向继承实现

  1. function visibleHOC(WrappedComponent) {  
  2.   return class extends WrappedComponent {  
  3.     render() {  
  4.       if (this.props.visible === false) {  
  5.         return null  
  6.       } else {  
  7.         return super.render()  
  8.       }  
  9.     }  
  10.   }  

操作props

可以对传入组件的props进行增加、修改、删除或者根据特定的props进行特殊的操作。

通过属性代理实现

  1. function proxyHOC(WrappedComponent) {  
  2.   return class extends Component {  
  3.     render() {  
  4.       const newProps = {  
  5.         ...this.props,  
  6.         user: 'ConardLi'  
  7.       }  
  8.       return <WrappedComponent {...newProps} />;  
  9.     }  
  10.   }  

获取refs

高阶组件中可获取原组件的ref,通过ref获取组件实力,如下面的代码,当程序初始化完成后调用原组件的log方法。(不知道refs怎么用,请👇Refs & DOM)

通过属性代理实现

  1. function refHOC(WrappedComponent) {  
  2.   return class extends Component {  
  3.     componentDidMount() {  
  4.       this.wapperRef.log()  
  5.     }  
  6.     render() {  
  7.       return <WrappedComponent {...this.props} ref={ref => { this.wapperRef = ref }} />;  
  8.     }  
  9.   }  

这里注意:调用高阶组件的时候并不能获取到原组件的真实ref,需要手动进行传递,具体请看传递refs

状态管理

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读