【问题标题】:immutable helper updating value in object in array不可变助手更新数组中对象中的值
【发布时间】:2018-09-09 06:17:16
【问题描述】:

我试图在我正在尝试做的事情的背景下理解不可变助手。 我正在尝试根据 onChange 事件何时调用 INPUT_CHANGE 操作来更新内部的对象。它应该添加到 formData 值而不是替换它。我尝试了 $add 但这也没有按照我想要的方式工作。 此外,每次更改新的输入文件时,它都会添加一个具有相同更新更改的新对象。

Array[index] -> input1 -> INPUT_CHANGE -> 使用输入字段的键和值在对象更改时更新对象。

inputs=[{key:{key:'input name', value: mew}}]

Array[index] -> input2 -> INPUT_CHANGE -> 使用输入字段的键和值在对象更改时更新对象。

 inputs=[{key:{key:'input name', value: mew}}, {key:{key:'input name', value: mew}}]

等等……

   const setupState = {
      count: 0,
      inputs: [{}],
    };

export default (state = setupState, action) => {
  switch (action.type) {
    case INPUT_CHANGE: {
      // const formDataArr = state.inputs[count];
      return update(state, {
        inputs: [{
          key: { $set: action.key },
          value: { $set: action.value },
        }],
      });
    }

    default: return state;
  }
};

对于如何为此使用不可变助手有点困惑?

更新: 这是用户更新每个输入时对象的外观。

inputs: [
  {
    "score": {
      "key": "score",
      "value": "20....",
    },
    "hits": {
      "key": "hits",
      "value": "ss..",
    }
  }
]

【问题讨论】:

  • 即使没有不可变的助手,任何人都知道如何做到这一点? ?最好使用不可变助手,因为我想知道它们是如何工作的,因为他们的文档并没有完全简化它。

标签: reactjs redux immutability


【解决方案1】:

试试这个。

export default (state = setupState, action) => {
switch (action.type) {
    case INPUT_CHANGE: {
        // const formDataArr = state.inputs[count];
        return update(state, {
            inputs: [
            // contain origin state.inputs!!!!!!!!!!!!!!!!!!!
            ...state.inputs,
            {
                key: { $set: action.key },
                value: { $set: action.value },
            }],
        });
    }

    default: return state;
}

【讨论】:

  • 谢谢 Ben,当我在更新密钥之前登录 action.key 时,我收到错误“index.js:84 Uncaught TypeError: Cannot read property 'key' of undefined”定义和那里。看起来它被更新覆盖了。有什么线索吗?
  • 我的输入对象在更新输入后看起来像这样:[{}] 看起来更新失败,只是将其设置回原来的状态。
  • TypeError: 无法读取未定义(匿名函数)node_modules/immutability-helper/index.js:84 81 的属性“键”变量 nextValueForKey = 82 |类型(对象) === '地图' 83 | ?更新(object.get(key), spec[key]) > 84 | :更新(对象[键],规格[键]); 85 | if (!update.isEquals(nextValueForKey, nextObject[key]) || typeof nextValueForKey === 'undefined' && !hasOwnProperty.call(object, key)) { 86 |如果(下一个对象 === 对象){ 87 | nextObject = 复制(对象);
  • 正如我第一次做 console.log('key = ', action.key);它显示为正确的键,因此它被定义到下一行调用 update() 然后它抛出该错误。
  • 我正在尝试找到一个 CDN 版本的不可变助手添加到 jsfiddle,以便我可以更轻松地向您展示。但也不是很幸运。
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
相关资源
最近更新 更多