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;
  

由于letconst 是块范围的局部变量,它们仅在当前块中可见。

我你的代码你正在使用未声明的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]

redux工程化结构

React + Redux:reducer 不会重新加载组件

在组件内调用多个操作时 Redux Reducer 的行为

[Redux/Mobx] 在redux中,什么是reducer?它有什么作用?

Redux学习——redux-saga的使用编写中间件函数Reducer文件拆分