美文网首页
高阶组件实现方式

高阶组件实现方式

作者: 苍色骑士 | 来源:发表于2020-09-09 11:30 被阅读0次

    参考: 深入理解高阶组件

    社区推荐 组合由于继承

    高阶组件的主流实现方式:

    属性代理 prop proxy

    1. 添加prop

    2. ref访问被包装组件实例

    3. 提升状态,变为容器组件

    4. 和其他react元素组装UI

    反向继承 inheritance inversion

    1. 渲染劫持 props.visible == true 则渲染原组件,否则不渲染内容
    
    function iiHOC(WrappedComponent) {
    
      return class Enhancer extends WrappedComponent {
    
        render() {
    
          if (this.props.loggedIn) {
    
            return super.render()
    
          } else {
    
            return null
    
          }
    
        }
    
      }
    
    }
    
    function iiHOC(WrappedComponent) {
    
      return class Enhancer extends WrappedComponent {
    
        render() {
    
          const elementsTree = super.render()
    
          let newProps = {};
    
          if (elementsTree && elementsTree.type === 'input') {
    
            newProps = {value: 'may the force be with you'}
    
          }
    
          const props = Object.assign({}, elementsTree.props, newProps)
    
          const newElementsTree = React.cloneElement(elementsTree, props, elementsTree.props.children)
    
          return newElementsTree
    
        }
    
      }
    
    }
    
    
    1. 生命周期钩子附加额外的逻辑

    2. 读取或添加state

    
    export function IIHOCDEBUGGER(WrappedComponent) {
    
      return class II extends WrappedComponent {
    
        render() {
    
          return (
    
            <div>
    
              <h2>HOC Debugger Component</h2>
    
              <p>Props</p> <pre>{JSON.stringify(this.props, null, 2)}</pre>
    
              <p>State</p><pre>{JSON.stringify(this.state, null, 2)}</pre>
    
              {super.render()}
    
            </div>
    
          )
    
        }
    
      }
    
    }
    
    

    带参数的高阶组件

    
    function HOCFactoryFactory(...params) {
    
      // do something with params
    
      return function HOCFactory(WrappedComponent) {
    
        return class HOC extends React.Component {
    
          render() {
    
            return <WrappedComponent {...this.props}/>
    
          }
    
        }
    
      }
    
    }
    
    // 使用
    
    HOCFactoryFactory(params)(WrappedComponent)
    
    //or
    
    @HOCFatoryFactory(params)
    
    class WrappedComponent extends React.Component{}
    
    

    相关文章

      网友评论

          本文标题:高阶组件实现方式

          本文链接:https://www.haomeiwen.com/subject/qxleektx.html