1.state修改
2.props修改
3.父组件rerender

useSelector

redux里的hook useSelector
如果useSelector返回值改变,则会导致组件重渲染。返回值的改变为浅比较

  1. const count = useSelector((state) => state.count)

1.useSelector如何将组件强制render的?

useSelector源码中使用了useReducer的修改state的dispatch函数,需要更新时执行该函数即可。本质上也是修改组件的state。

  1. const [, forceRender] = useReducer((s) => s + 1, 0)
  2. forceRender()

2.如何防止useSelector导致的多余渲染?

工作中项目中以下的写法,在store中其他数据修改,但count和name都没有修改的时候,useSelector返回的是一个新对象,则会导致组件重渲染。

  1. const { count, name } = useSelector((state) => {
  2. return {
  3. count: state.count,
  4. name: state.name
  5. })

解决方法:使用react-redux提供的对对象的浅比较的方法shallowEqual(不是说比较值的地址,比较到第一层属性的值),也可以用lodash的_.isEqual(正儿八经的深比较)

  1. shallowEqual({name: 'lily'}, {name: 'lily'}) // true
  2. _.isEqual({name: 'lily'}, {name: 'lily'}) // true
  3. shallowEqual({name: 'lily', arr: [1,2]}, {name: 'lily', arr: [1,2]}) // false
  4. _.isEqual({name: 'lily', arr: [1,2]}, {name: 'lily', arr: [1,2]}) // true