【问题标题】:Updating a value that's within an array within an array in a state更新处于状态的数组中的数组中的值
【发布时间】:2020-07-06 13:47:07
【问题描述】:

我正在尝试更新 shoeList 中 id 值的状态。目前我有一个允许输入新 ID 的文本字段,并且我希望在单击“确定”按钮时更新状态。

以下是一些相关代码:

state = {
    editingToggle: false,
    shoeList : [
      {name: 'bob', id: '123213-0', shoeSize: 'L'}
     ],
}

<TextInput className='text-area-header' id="textM" width="m" type="text" placeholder={this.state.shoeList[0].id}  />
<Button className="ok-button" variant="tertiary" size ='xs' type="button" handleClick={this.saveHeader}>OK</Button>

 saveHeader(e) {
    this.setState(state=> ({
     shoeList[0].name: 
    }))
    alert('Header changed to ' + this.state.shoeList[0].id);
    e.preventDefault();
  }

我不确定在 this.setState 中放什么,因为我没有找到任何关于如何通过谷歌搜索更新嵌套值的信息。此外,每当我将 value 属性添加到 TextInput 标签时,它都不允许我再在网页上的 textinput 中进行编辑。任何帮助都会很棒

【问题讨论】:

  • 我认为这是因为您没有在 saveHeader 中正确设置状态。您没有列出您要更新的状态。
  • 是的,我不知道该放什么
  • 您有一个属性,但您没有为其设置值。冒号后面什么都没有。
  • 也许this 可以帮助您设置嵌套状态。immer 也不错。而here 是如何用 es6 来做的(它有点冗长,所以我更喜欢前面提到的一个或另一个助手)

标签: reactjs components state


【解决方案1】:

考虑这个例子:

saveHeader() {
    this.state.shoeList[0].id = 'newid'
    this.setState({ shoeList: this.state.shoeList })
}

setState() 检查值是否已更改,如果没有更改,则不会更新组件。更改嵌套值不会更改对数组的引用,这意味着仅调用 setState() 是不够的。

有两种方法可以解决这个问题。首先是使用forceUpdate():

saveHeader() {
    this.state.shoeList[0].id = 'newid'
    this.forceUpdate()
}

这会强制组件重新渲染,即使状态没有改变。

第二种方法是通过创建一个新的来实际更改 shoeList 数组:

saveHeader() {
    let newShoeList = this.state.shoeList.slice()
    newShoeList[0].id = 'newid'
    this.setState({ shoeList: newShoeList })
}

在数组上使用 .slice() 会创建一个完全相同的新数组。但是因为是新数组,所以 React 会注意到状态发生了变化并重新渲染组件。

【讨论】:

  • 当我实现这些选项之一时,我得到一个 TypeError: Cannot read property '0' of undefined。我将 ref="theTextInput" 放在 元素上,并用 this.refs.theTextInput.shoeList[0].id 替换了 'newid'。如果它只是 'newid' 但 this.refs.theTextInput.shoeList[0].id 会导致错误,我不知道为什么哈哈
  • 该错误意味着 shoeList 不是 TextInput 上的属性。我不明白为什么会这样,你为什么要那样访问它?
  • 我只想用文本输入中的任何内容更新状态值。我查阅了一些教程,似乎这是通过引用输入元素上的 ref 来实现的方法。那么我将如何根据输入元素中当前的内容来设置状态呢?
  • 要访问该值,您应该改为使用 this.refs.theTextInput.value。喜欢:newShoeList[0].id = this.refs.theTextInput.value
  • @taystack 是的,一般来说这是不好的做法。因此,我会说我的第二种选择更好。 (另外,你不应该在 setState 中做 ...state,因为 React 只更新包含在更新对象中的属性。这样做实际上可能会引入错误)
猜你喜欢
  • 2020-10-21
  • 1970-01-01
  • 2019-03-30
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2020-08-16
  • 1970-01-01
相关资源
最近更新 更多