react反向继承注意点

react高阶组件有一种实现方式叫反向继承(Inheritance Inversion),简称II

案例.png
场景:需要开发一堆有相同特性的按钮组件,相同特性包括内容初始值为零,每次点击后自增1,使用反向继承看看

在线代码地址

class Button1 extends Component {
  componentDidMount() {
    console.log("didMount1");
  }
  render() {
    console.log("render1");
    return <button />;
  }
}
// 高阶组件函数
const Hoc = WrappedComponent => {
  return class extends WrappedComponent {
    state = {
      num: 0
    };
    componentDidMount() {
      console.log("didMountHoc");
    }
    handleClick = () => {
      this.setState({
        num: this.state.num + 1
      });
    };
    render() {
      console.log("renderHoc");
      // 核心代码
      let renderTree = super.render();
      let newProps = {
        ...renderTree.props,
        onClick: this.handleClick
      };
      const newRenderTree = React.cloneElement(
        renderTree,
        newProps,
        this.state.num
      );
      return newRenderTree;
    }
  };
};

反向继承两大作用,一是渲染劫持,二是操作state

看看控制台,发现Button1(被包裹组件)的componentDidMount没触发,发现被Hoc的相同方法覆盖了


生命周期被覆盖.png

处理方法就是不出现同名方法(生命周期),或者手动super[function]调用被包裹组件的方法


手动覆盖.png

注意state,props也会覆盖的

state被覆盖.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在今社会无论是企业白领,还是知名人士,无论是从政大员,还是普通百姓,都会存在着一个问题,那就是是:争高比低,没有人...
    天涯孤影人阅读 2,338评论 0 0
  • 01 我不敢哭,因为有人告诉我,哭代表软弱;我不敢放弃,因为有人告诉我,放弃代表没用。当我面对一切我无法面对的事时...
    喵小忧私语阅读 4,214评论 0 0
  • 重庆万州公交坠江事件持续发酵,人们都在反思。 今日读到爱克曼先生著《歌德访谈录》(以大致日记形式记录...
    润树阅读 1,904评论 1 2