React Hooks解析(七)

72 阅读2分钟

自定义Hook

自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算React的特性。

需求:所有的组件在创建和销毁时都进行打印

组件被创建:打印 组件被创建了;

组件被销毁:打印 组件被销毁了;

redux hooks

在之前的redux开发中,为了让组件和redux结合起来,我们使用了react-redux中的connect:

但是这种方式必须使用高阶函数结合返回的高阶组件;

并且必须编写:mapStateToProps和 mapDispatchToProps映射的函数;

在Redux7.1开始,提供了Hook的方式,我们再也不需要编写connect以及对应的映射函数了

useSelector的作用是将state映射到组件中:

参数一:将state映射到需要的数据中;

参数二:可以进行比较来决定是否组件重新渲染;(后续讲解)

useSelector默认会比较我们返回的两个对象是否相等;

如何比较呢? const refEquality = (a, b) => a === b;

也就是我们必须返回两个完全相等的对象才可以不引起重新渲染;

当App组件中修改了counter时, App组件会重新渲染这个是没问题的; 但是Home组件中使用的是message, 并没有使用counter, 却也会重新渲染; 同样的在Home子组件中修改了message, 根组件App也会重新渲染; 这是因为在默认情况下useSelector是监听的整个state, 当state发生改变就会导致组件重新渲染

要解决这个问题就需要使用useSelector的第二个参数来控制是否需要重新渲染, 我们只需要在useSelector函数中传入react-redux库中的shallowEqual函数即可, 它内部会自动进行一个浅层比较, 当使用的state中的数据确实发生变化的时候才会重新渲染

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情