useSelector hook第二参数shallowEqual正确用法及本例使用差异
useSelector传入shallowEqual和默认对比逻辑的区别(结合当前场景)
结论先行:在你当前的代码场景下,传入shallowEqual和不传入没有任何区别。
- 默认情况下,
useSelector对两次selector返回值的对比采用**严格相等(===)**规则,只有返回值和上一次结果严格不等时,才会触发当前组件重新渲染。 shallowEqual是Redux提供的浅对比方法,规则如下:- 如果对比的是原始类型值(数字、字符串、布尔值、null、undefined),逻辑和
===完全一致,直接对比值本身 - 如果对比的是引用类型(对象、数组),不会递归校验深层属性,只会对比两个值的引用是否一致,或是第一层的所有属性值是否严格相等
- 如果对比的是原始类型值(数字、字符串、布尔值、null、undefined),逻辑和
- 你的当前场景中,Redux根state本身就是数字类型的原始值,所以不管用默认的严格相等还是
shallowEqual,对比逻辑完全相同,触发组件重渲染的时机没有任何差异。
只有当你的
useSelector返回引用类型值(比如每次selector执行都会返回新的对象/数组)时,才需要传入shallowEqual来避免不必要的重渲染。比如以下场景:// 这种写法每次selector执行都会返回新对象,默认严格相等会认为值发生变化,导致多余重渲染 const { count, name } = useSelector(state => ({ count: state.count, name: state.user.name }), shallowEqual)
内容的提问来源于stack exchange,提问作者Manfre
相关产品推荐
相关产品推荐

