我目前正在开发一个具有简单形式的 React 组件(没有 redux,只是使用 react-bootstrap 进行样式设置)
我正在以下列形式从数据库中提取数据:
[
{
"id":"123",
"name":"Amy Pond",
"age":"22",
"reputation":22000
},
{
"id":"124",
"name":"Clara Oswald",
"age":"24",
"reputation":35000
}
...
]
并将其放入一个对象中:
let userlist = [];
userlist = addUsers(this.state.users);
我使用 map 根据这些数据填充了一个下拉列表,并且可以正确地将用户状态设置为从下拉列表中选择的状态:
<FormControl
id = "user"
componentClass="select"
onChange={this.handleChange}
>
{userlist.map((r , i) =>
<option
key={i}
value={r.name}>
{r.name}
</option>
)}
</FormControl>
使用 handleChange()
handleChange(event) {
this.setState({
value: event.target.value,
// reputation: ???? // here's where I'm running into issues
// age: ??????? // and here
});
我的问题是,我需要 handleChange 函数中的用户年龄和声誉来相应地设置他们的状态。我试过只传递 r
而不是 r.name
但我得到了 [object Object]
。
console.log ("Handle Change Value: " + event.target.value);
如果我尝试 event.target.value.name
,我会返回 undefined
。
到目前为止唯一可行的方法是使用 JSON.stringify,但我觉得这不是正确的方法。我也考虑过只在获得名称后搜索对象,但如果有很多对象,我认为那会非常低效吗?我也不确定该怎么做。
任何人都可以帮我找到一种方法来传递这两个额外的值,以便我可以设置状态吗? map 甚至是创建选项的最佳方式吗?老实说,我觉得这是一件很简单的事情,但我对 react 还是陌生的,而且我已经为此苦苦挣扎了太久了!
如果有任何想法/更改/评论/方法可以使它变得更好,我们将不胜感激!我意识到也许使用像 redux-form 这样的东西会让这更容易,但我希望现在有一种简单的方法可以做到这一点。
编辑:
onChange 应该设置为 onChange = {this.handleChange}
,只是粘贴了我尝试进行故障排除时的错误代码。我在构造函数中绑定(bind)它:
constructor(props) {
super(props);
...
this.handleChange = this.handleChange.bind(this);
}
最佳答案
使用用户 ID 作为每个 option
中的值,然后在 handleChange
中找到您的 userlist
中的用户以访问该用户的所有属性:
<FormControl
id = "user"
componentClass="select"
onChange={this.handleChange.bind(this)}
>
{userlist.map((r , i) =>
<option
key={i}
value={r.id}>
{r.name}
</option>
)}
</FormControl>
handleChange(event) {
const userId = event.target.value;
const user = userlist.find(u => u.id === userId);
this.setState({
value: user
});
}
此外,您传递 onChange
属性的方式可能会导致问题。如果不查看所有代码就很难判断,但请确保传递对 handleChange
函数的引用(见上文我的回答),而不是就在那里调用它(如你的问题:onChange={this.handleChange()}
,除非你的 this.handleChange
函数返回一个函数)。
关于javascript - 如何在表单的选择字段 onChange 中传递对象值(使用 React,不使用 Redux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48159169/