Redux - 每次使用新变量在reducer switch语句中定义新状态?
Posted
技术标签:
【中文标题】Redux - 每次使用新变量在reducer switch语句中定义新状态?【英文标题】:Redux - Define new state in reducer switch statement with new variable each time? 【发布时间】:2017-11-10 01:34:05 【问题描述】:我的减速器是这样的:
switch (action.type)
case "UPDATE_CURRENT_USER":
let newState = ...state, ...action.payload ;
return newState;
case "GET_CURRENT_USER":
return state;
case "UPDATE_USERNAME":
newState = ...state, name: action.payload.name;
return state;
现在,我第二次使用newState
我不再定义它了。我只是使用上面定义的变量。这个可以吗?
我想重新定义它,但出错了。但我不确定这种方式是否仍然会给我正确的结果 - 尽管一切似乎都工作正常?
【问题讨论】:
不要在case语句中声明变量,你也想在其他地方使用它,在switch语句之外做 【参考方案1】:您无需为新状态创建变量,为其赋值并返回它。相反,您可以立即返回新的状态值。并且不要忘记在最后添加一个默认情况。
switch (action.type)
case 'UPDATE_CURRENT_USER':
return ...state, ...action.payload ;
case 'GET_CURRENT_USER':
return state;
case 'UPDATE_USERNAME':
return ...state, name: action.payload.name ;
default:
return state;
【讨论】:
【参考方案2】:使用花括号 在 case 语句内创建新的块作用域:
switch (action.type)
case "UPDATE_CURRENT_USER":
let newState = ...state, ...action.payload ;
return newState;
case "GET_CURRENT_USER":
return state;
case "UPDATE_USERNAME":
let newState = ...state, name: action.payload.name;
return newState;
由于let
和const
是块范围的局部变量,它们仅在当前块中可见。
我你的代码你正在使用未声明的newState
变量:
switch (action.type)
case "UPDATE_CURRENT_USER":
// (conditionaly) declaring block scoped variable newState
let newState = ...state, ...action.payload ;
return newState;
case "UPDATE_USERNAME":
// here you cannot declare newState variable because it might be declared before
// however the variable is not declared since we are in other case
// so that here you are using global window variable window.newState
newState = ...state, name: action.payload.name;
return state;
【讨论】:
谢谢。您能否解释一下为什么我应该这样做,以及我当前的代码可能出错/应该避免的地方? 一般来说它是可行的,但我不会使用这种方法,因为对于 reducer 来说这是不寻常的做法,尤其是对于这种简单的用例。以上是关于Redux - 每次使用新变量在reducer switch语句中定义新状态?的主要内容,如果未能解决你的问题,请参考以下文章
Reducer 状态没有被新对象更新 [redux, redux-toolkit, normalize]
React + Redux:reducer 不会重新加载组件