【发布时间】:2019-07-05 21:23:48
【问题描述】:
当您有涉及多个子值的复杂状态逻辑或下一个状态取决于前一个状态时,useReducer 通常比 useState 更可取。 useReducer 还允许您优化触发深度更新的组件的性能,因为您可以向下传递调度而不是回调。
(引自https://reactjs.org/docs/hooks-reference.html#usereducer)
我对粗体部分感兴趣,它指出在上下文中使用时应使用useReducer 而不是useState。
我尝试了这两种变体,但它们似乎没有什么不同。
我比较这两种方法的方式如下:
const [state, updateState] = useState();
const [reducerState, dispatch] = useReducer(myReducerFunction);
我将它们中的每一个都传递给一个上下文对象,该对象在更深层次的子对象中使用(我只是运行了单独的测试,将值替换为我想要测试的函数)。
<ContextObject.Provider value={updateState // dispatch}>
孩子包含这些功能
const updateFunction = useContext(ContextObject);
useEffect(
() => {
console.log('effect triggered');
console.log(updateFunction);
},
[updateFunction]
);
在这两种情况下,当父级重新渲染时(由于另一个本地状态更改),效果从未运行,表明更新函数在两次渲染之间没有更改。 我读错了引用中的粗体句子吗?还是我忽略了什么?
【问题讨论】:
-
我的猜测是 dispatch 是一个不可变的函数,并且在嵌套函数中创建的回调每次都会创建新的引用,因此会破坏
shouldComponentUpdate中的相等性检查
标签: reactjs react-hooks