【问题标题】:Can't update an input value inside specific array item in redux无法更新redux中特定数组项内的输入值
【发布时间】:2017-11-06 18:09:32
【问题描述】:

我在一个 react-native projetc 工作,我不太了解 Redux。我需要帮助。:D 我们得到了一个对象数组,例如:

lines[
    {"cant":2, "ref":"bar"}, {"cant":5, "ref":"foo"}
]

每一行都是一张卡片信息。这些卡片有输入(cant, ref)来改变它的值。 整个对象是:

obj:{
  "a": '',
  "b": '',
  "lines": [
    {"cant":2, "ref":"bar}",
    {"cant":5, "ref":"foo"}
  ]
}

当用户在某个输入中插入一些值时,它调用 onChangeText()。

    <Input
        placeholder="Cant"
        value={this.props.newOrder.lines[index].cant}
        onChangeText={(text)=> {
            this.props.onChangeCant({"cant":text,"index":index});
        }}
    />

同时在 Reducer 中(我们使用 react-addons-update):

case ON_CHANGE_CANT:
        return update(state, {
          lineas: {
            [action.payload.index]: {
              cant: {$set: action.payload.cant}
            }
          }
        });

一切都很好,只是它只更新了一个字符。例如: Cant: 1. 那么输入焦点丢失。如果您键入:Cant:22。只有它更新2。打字快没关系。仅更新您输入的第一个字符。 我们怀疑 Redux 的行为是问题所在,但我们不知道为什么。

我们尝试使用 debounce(lodash) 但没有成功

有什么想法吗?

非常感谢!我希望它能理解我的解释。

摇滚乐

【问题讨论】:

  • 注意到lines 是一个数组,但是在你的reducer 中你把它当作一个对象来对待。
  • 你能说明你是如何尝试使用_.debounce
  • 您是否使用地图创建输入?问题可能是由于组件的重新渲染。由于道具正在改变,它会触发重新渲染,如果您没有使用key 道具,可能会导致输入失去焦点。
  • 是的。我知道@RickJolly。我读了那个解决方案stackoverflow.com/questions/35628774/…。我尝试了您的解决方案,但它给出了一个错误“您提供了一个不包含 $push、$unshift、...之一的更新()的关键路径”。感谢您的回复;)
  • @Aaqib 我试过这个例子stackoverflow.com/a/41215941/4774393 debounce 工作正常,但在函数 onChangeText(text) 无法访问 this.props..cause is undefined ...我不知道为什么 ..:( ..thanx 回复 ;)

标签: javascript reactjs react-native redux debounce


【解决方案1】:

只需阅读react-addons-update 文档即可。您希望您的减速机外壳看起来像这样:

return update(state, {
    lines: {$splice: [[action.payload.index, 1, action.payload.cant]]}
});

但请注意,action.payload.cant 必须是您要替换的整个对象。所以要么通过它,要么事先从状态中获取它。

【讨论】:

  • 好的。我已经尝试过您的解决方案并且它可以正确更新,但我仍然无法集中注意力。我输入一个字符并渲染组件。谢谢
猜你喜欢
  • 2016-06-08
  • 2020-11-08
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
相关资源
最近更新 更多