Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为Redux状态项生成新密钥?_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 如何为Redux状态项生成新密钥?

Javascript 如何为Redux状态项生成新密钥?,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我很难弄清楚用新键向React/Redux状态添加新项的最佳实践是什么 鉴于国家: const initialState = { "routines": { "1": { "id": 1, "name": "Routine 1", }, "2": { "id": 2, "name": "Routine 2", } } } 假设我想在此状态中添加一个新项。我应该把产生新ID的逻辑放在哪里 该属性是否应为表单的

我很难弄清楚用新键向React/Redux状态添加新项的最佳实践是什么

鉴于国家:

const initialState = {
  "routines": {
    "1": {
      "id": 1,
      "name": "Routine 1",
    },
    "2": {
      "id": 2,
      "name": "Routine 2",
    }
  }
}
假设我想在此状态中添加一个新项。我应该把产生新ID的逻辑放在哪里

  • 该属性是否应为表单的属性,其提交将触发“添加”常规操作
  • 生成新id的逻辑是否应该在减速器中
  • 这是我最好的尝试,但我想知道是否有更好的方法来做到这一点

    import { ADD_ROUTINE } from '../actions/routineActions'
    
    function routineReducer(state={}, action) {
      switch (action.type) {
        case ADD_ROUTINE:
          newState = {...state}
          number_of_keys = Object.keys(newState).length
          new_id = number_of_keys + 1
          return {
            ...state,
            new_id: {
              id: new_id,
              name: action.name,
              days: []
            }
          }
        default:
          return state
      }
    }
    
    export default routineReducer
    

    以下是我对结构变更的意见和建议,以下是我将如何编写您的减速机:

    从“../actions/routineActions”导入{ADD_ROUTINE}
    //重要提示:这假设要更改结构
    //将初始状态更改为以下状态:
    //例程=[
    //{id:1,名称:'routine 1'},
    //{id:2,名称:'routine 2'},
    // ]
    函数RoutineEducer(状态=[],操作){
    开关(动作类型){
    案例添加程序:
    返回[
    ……国家,
    {
    id:state[state.length-1].id+1,
    名称:action.payload,
    }
    ]
    违约:
    返回状态
    }
    }
    
    导出默认路由导出器
    我觉得这很好。减速器用于计算新状态,您可以在计算中使用旧状态。仅供参考,减速器中有一个小虫子。尝试
    [new_id]:{
    而不是
    new_id:{
    只要不删除例程,基于长度的id(即前一状态中的例程数量)就可以工作。最好是获取前一状态中的最后一个例程,并将其id增加1。我个人也会更改“例程”的结构对象,但这是另一个讨论。或者,您可以使用类似于生成RFC兼容的unique的包IDs@Jaxx谢谢!我来看看那个软件包!出于好奇,将例程作为数组与对象相比有什么好处。@BenLorantfy谢谢你指出这一点,我会解决它:)我们应该使用state.l长度!==0?状态[state.length-1]。id+1:1,因为如果长度==0,我们会得到错误