【发布时间】:2020-03-21 07:20:47
【问题描述】:
来自docs:
[init, the 3d argument] 让你提取在 reducer 之外计算初始状态的逻辑。这对于稍后重置状态以响应操作也很方便。
还有代码:
function init(initialCount) {
return { count: initialCount };
}
function reducer(state, action) {
switch (action.type) {
...
case 'reset':
return init(action.payload);
...
}
}
function Counter({initialCount}) {
const [state, dispatch] = useReducer(reducer, initialCount, init);
...
}
我为什么要重复使用常量initialState?
const initialState = {
count: 5,
};
function reducer(state, action) {
switch (action.type) {
...
case 'reset':
return initialState;
...
}
}
function Counter({initialCount}) {
const [state, dispatch] = useReducer(reducer, initialState);
...
}
对我来说看起来不那么冗长。
【问题讨论】:
-
如果你问他们为什么提供看似无用的 API,答案是延迟初始化。这只是一个不错的功能。既然 useReducer 钩子显然取自 Redux,他们为什么不保持 API 一致呢。
-
明白了。但是状态不是用默认值初始化的吗?
initialCount仍然作为第二个参数存在。 -
是的,您可以选择两种用法中的任何一种。我认为文档很清楚,link
-
对不起,我问的是即使你设置了第三个参数,是否设置了初始状态?如果答案是否定的,我想这就是延迟加载的意思。也就是说,用户必须发送
reset更新以设置初始计数,否则count为空? -
你弄错了。情况 1,
useReducer(reducer, 0),则初始化计数为 0。情况 2useReducer(reducer, 7, n => 2 * n),则初始化计数为 14。清楚吗?
标签: javascript reactjs react-hooks use-reducer