react-native - React Native 选择器在值更改后重置
问题描述
我使用了反应选择器并重置回以前的值。OValueChange 上的 setState 也不起作用
pickerChange(index) {
this.setState({
ingred_value: this.props.filterData.ingredients[index].value,
ingred_id: this.props.filterData.ingredients[index].id
});
<Picker
mode='dropdown'
selectedValue={this.state.ingred_value}
style={{ marginStart: 10 }}
onValueChange={(itemIndex) => this.pickerChange(itemIndex)}
>
{
this.props.filterData.ingredients.map((v) =>
{
return <Picker.Item label={v.value} value={v.id} key={v.id} />
})
}
</Picker>
解决方案
您的代码有 2 个潜在问题:
- 您
selectedValue
的组件的属性Picker
设置为this.state.ingred_value
(其中包含值而不是 id),但value
您的组件的属性PickerItem
设置为v.id
. 这意味着当您更改ingred_value
状态值时,Picker 将无法将新状态与 PickerItem 中的 id 值匹配以将其选中selectedValue
。你应该ingred_id
改用。 - 该
onValueChange
方法的第一个参数是值 (v.id) 而不是所选项目的索引(看这里)。因此,除非您的项目 id 从 0 开始并且是连续的,否则它可能与索引不匹配,在这种情况下,您不会在数组 (ingredients[index]
) 中选择正确的项目,并且如果该项目不存在,则会引发错误。您应该将其更改为onValueChange={(itemValue, itemIndex) => this.pickerChange(itemIndex)}
.
下面的代码应该可以工作:
pickerChange(index) {
this.setState({
ingred_value: this.state.filterData.ingredients[index].value,
ingred_id: this.state.filterData.ingredients[index].id
})
}
render() {
return (
<Picker
mode='dropdown'
selectedValue={this.state.ingred_id}
style={{ marginStart: 10 }}
onValueChange={(itemValue, itemIndex) => this.pickerChange(itemIndex)}
>
{
this.state.filterData.ingredients.map((v) =>
{
return <Picker.Item label={v.value} value={v.id} key={v.id} />
})
}
</Picker>
);
}
推荐阅读
- c++ - 尝试使用数组在字符串中找到最短的句子
- javascript - 如何使用 JavaScript 或 jQuery 动态处理复选框事件(使用动态 id 创建)?
- scala - 将多列转换为数据框中的单列
- java - 使用邮递员为 SLACK 生成身份验证令牌
- hyperledger-fabric - 无法组装交易,错误提案响应不成功,错误代码 500,msg 链码注册失败:容器以 1 退出
- python - 了解 CNN 超参数
- html - 如何解决nodejs中结束错误后的写入?
- php - 显示来自 @foreach 的 Laravel 刀片中的所有输入
- python - XHR 请求被阻止并使用 Python Selenium 显示 HTTP 状态代码 405
- mysql - 跨所有数据库的 mySQL 查询