高阶组件实现方式

2020-09-09  本文已影响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{}

上一篇 下一篇

猜你喜欢

热点阅读