如果我要更新的状态不在users数组之外,则更新状态有效。但是由于我有多个用户,所以我需要状态在对象内部并始终更新
我不断收到错误TypeError: Cannot read property 'name' of undefined
我曾经考虑过在循环中设置状态,但有人告诉我那是个坏主意。
所以[e.target.name]: e.target.value
是我唯一可以找到的下拉菜单代码。
我尝试为每个用户传递ID,但不知道如何使用该ID或放置什么条件来更改状态。
import React, { Component } from 'react'
export default class App extends Component {
state = {
users: [
{
id: uuid(),
firstName: 'John',
lastName: 'Doe',
favColor: 'None'
},
{
id: uuid(),
firstName: 'Jane',
lastName: 'Doe',
favColor: 'None'
}
]
}
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value
})
}
render() {
return (
<div>
{this.state.users.map((user) => {
return <div key={user.id}>
<h1>{user.firstName}</h1>
<h1>{user.lastName}</h1>
<form>
<select
name="favColor"
value={user.favColor}
onChange={() => this.handleChange(user.id)}
>
<option value="None" disabled>None</option>
<option value="Blue">Blue</option>
<option value="Red">Red</option>
<option value="Green">Green</option>
</select>
</form>
<h1>Fav Color: {user.favColor}</h1>
<hr />
</div>
})}
</div>
)
}
}
我希望下拉菜单分别为每个用户更改状态
答案 0 :(得分:2)
您的handleChange
方法未接受正确的参数。
如果您希望更新阵列中的一个用户项目,则需要创建阵列的新更新副本并保存回状态
handleChange = (e,id) => {
const updatedUser = {...this.state.users.find(x=>x.id ===id), favColor: e.target.value}
this.setState({
users: [...this.state.users.filter(x==>x.id!==id),updatedUser]
})
}
...
onChange={(e) => this.handleChange(e,user.id)}
为简化状态的突变,我建议您看一下Immer
正如@JosephD正确指出的那样,这不会维持顺序,因此您需要执行类似this.state.users.map(u => u.id === id ? { ...u, favColor: e.target.value } : u)
这是一个基于您的代码的代码框: https://codesandbox.io/s/loving-cohen-do56l?fontsize=14
答案 1 :(得分:1)
<select
name="favColor"
value={this.state.favColor}
onChange={(e) => this.handleChange(e)}> // first Change
handleChange = (e) => {
this.setState({
favColor: e.target.value
})
} // Second Change
这将为您服务
答案 2 :(得分:1)
您以错误的方式更新状态; </ p>
您的状态:
users: [
{ id: 1, ... },
{ id: 1, ... }
]
您的更新/意图:
users: [
{ id: 1, ... },
{ id: 1, ... }
]
favColor: color // intention, because you don’t pass event
要更新正确的方法,您需要:
此示例应为您工作。