林秀栋的技术博客

为什么要引入hooks

文章来源

防止关注点分离

其他遇到的问题

  1. 高阶组件和 renderProps 的使用使组件嵌套过深,难以追踪数据流 2、 类组件的逻辑穿插在各种生命周期,如订阅和取消订阅或设置定时器和取消定时器等等…不相关的逻辑会在一个生命周期里,相关的逻辑却被分割在不同的生命周期中
  2. 类比较复杂(特别是 this 的处理);需要把函数组件转为类时需要大量的样板代码;即使一个类的方法没有被使用编译执行时也很难被删除(因为很难知道方法不会被调用);难以可靠地实现热重载。

存在的解决方案

mixin 可以解决一些问题(逻辑复用和嵌套地狱)

var SetIntervalMixin = {
  componentWillMount: function () {
    this.intervals = [];
  },
  setInterval: function () {
    this.intervals.push(setInterval.apply(null, arguments));
  },
  componentWillUnmount: function () {
    this.intervals.forEach(clearInterval);
  },
};

var createReactClass = require("create-react-class");

var TickTock = createReactClass({
  mixins: [SetIntervalMixin], // 使用 mixin
  getInitialState: function () {
    return { seconds: 0 };
  },
  componentDidMount: function () {
    this.setInterval(this.tick, 1000); // 调用 mixin 上的方法
  },
  tick: function () {
    this.setState({ seconds: this.state.seconds + 1 });
  },
  render: function () {
    return <p>React has been running for {this.state.seconds} seconds.</p>;
  },
});

ReactDOM.render(<TickTock />, document.getElementById("example"));

为什么没有采用 mixin 的方案:

就像你看到的,上述三个问题解决以一个问题可能会导致其余问题变得更复杂

hook 如何解决