在React中对Redux action creators进行memoize是否有必要?
关于Redux Action Creators Memoize的性能疑问解答
你的质疑完全正确——在你给出的这个场景里,用useMemo包裹actions对象不会带来任何性能提升,纯粹是多余的代码。具体原因如下:
- dispatch的稳定性:
useDispatch返回的dispatch函数在组件的整个生命周期中是固定不变的,所以useMemo的依赖数组[dispatch]永远不会触发重新计算,等于这个useMemo从头到尾只执行一次,和直接创建对象没有区别。 - 原生组件的事件回调优化:就算不用
useMemo,每次组件重渲染都会生成一个新的actions对象,但你只是把它的方法传给原生<button>的onClick属性。React对原生DOM组件的props变化有专门优化:只要事件回调的实际逻辑没有改变(这里不管函数引用变不变,最终都是调用dispatch(clearAllFields())),不会触发DOM元素的重新渲染或额外开销。 - 只有传给memoized子组件时才需要稳定引用:这种memoize写法唯一有用的场景,是把这个actions对象作为props传给一个用
React.memo包裹的自定义子组件时——此时稳定对象引用可以避免子组件因为props引用变化而不必要重渲染。但你的示例里完全没有这种场景。
另外补充一句:Redux官方更推荐直接在事件回调里写() => dispatch(clearAllFields()),如果需要把这个回调传给memo子组件,单独用useCallback包裹单个方法即可,没必要把多个action creators整合成一个对象用useMemo包裹。
内容的提问来源于stack exchange,提问作者Isaac Corbrey
相关产品推荐
相关产品推荐

