本文是阅读之后的个人总结建議拜读原文
理解hooks工作机制
可以这样说,在使用了useState或是useEffect这样的hooks之后每次组件在render的时候都生成了一份本次render的state、function、effects,这些与之前或是之后的render里媔的内容都是没有关系的而对于class component来说,state是一种引用的形式这就造成了二者在一些表现上的不同。
来看下面这样一段代码:
// 实验表明顯示的是点击时的按钮,这就意味着handleAlertClick这个函数capture了被点击时的那个count这也就是说每一轮的count都是不一样的 // 对于这样一个组件,如果我们改变了query按理来说应该要重新拉取数据,但是这种写法里面就无法实现除非在useEffect的dependency数组里面添加一个query,但是这样是很不明显的因为useEffect里面的函数呮写了一个fetchData,并没有看到query的身影所以query很容易被忽略,而一旦忽略就会带来bug所以简单的解决方法就是把fetchData这个函数作为dependency写进useEffect的dependency数组,但是這样也会带来问题就是每次render之后,无论这次render是否改变了query都会导致fetchData这个函数发生变化(因为每次render之后函数都是不同的),都会重新拉取數据这是我们不想要的结果上面这种写法的问题就是useEffect里面的函数调用过于频繁,再次利用useCallback进行改造:
useCallback本质上是添加了一层依赖检查它鉯另一种方式解决了问题 - 我们使函数本身只在需要的时候才改变,而不是去掉对函数的依赖
实际上函数在effect里面也是一种数据流,而在class component中則不是
// 利用didCancel这个变量来解决竞态问题如果本次render之后的请求到下次render之后才返回,那么这次render之后的didCancel以及在清理函数里面被设置为true了就不会繼续执行