【问题标题】:Redux - Define new state in reducer switch statement with new variable each time?Redux - 每次使用新变量在reducer switch语句中定义新状态?
【发布时间】: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语句之外做

标签: reactjs redux react-redux flux


【解决方案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 来说这是不寻常的做法,尤其是对于这种简单的用例。
    猜你喜欢
    • 2018-04-29
    • 2019-07-28
    • 2018-08-04
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2013-12-31
    • 2021-08-11
    相关资源
    最近更新 更多