目前我的代码正在保留我放入Switch的默认值,而不是更改它。 onValueChange被触发,我从中获取正确的值,但无论我做什么,开关都会移动并返回到默认位置,就像没有更新状态一样。
我想要使用的主要代码是:
<Switch style={styles.select} value={this.state.banks[rowData.code].status} onValueChange={(newValue) => this.saveValue(rowData,newValue)}/>
saveValue = (rowData,newValue) => {
//var row = rowData[Object.keys(rowData)[0]];
rowData.status = newValue;
this._sh.set('@Banks:'+rowData.code,newValue.toString()).then(
(result) => {
this._banks[rowData.code].status = newValue;
this.setState({
banks: this._banks
});
}
);
return newValue;
}
起初我认为这是一个非常复杂的状态场景,所以我也尝试在行外部和常规视图(而不是数据源)中使用Switch。我也尝试使用默认实现,如Switch的文档示例中所示,并且也不起作用。
我正在尝试使用iPhone 6s模拟器和真正的5s设备。还是一样的行为。
我即将认为这是RN中的一个错误,但没有找到任何相关的东西,我正在失去理智,因为这应该是非常容易的。
最终,我所拥有的是一个带有银行列表的JSON文件,用户可以选择是否需要启用,我使用该数组存储值并使Switch从那里获取状态。 _sh是来自AsyncStorage的StorageHelper包装器,但我也从代码中删除了该部分,但仍然是同一个问题。
任何意见都表示赞赏。
答案 0 :(得分:0)
好吧,我会被拦截,因为我把它放在ListView中,我正在更新同一个对象,而不是创建副本。此代码有效:
saveValue = (rowData,newValue) => {
//var row = rowData[Object.keys(rowData)[0]];
var banksAux = JSON.parse(JSON.stringify(this.state.banks));
rowData.status = newValue;
this._sh.set('@Banks:'+rowData.code,newValue.toString()).then(
(result) => {
banksAux[rowData.code].status = newValue;
this.setState({
banks: banksAux,
dsBanks: this.state.dsBanks.cloneWithRows(banksAux)
});
}
);
return newValue;
}
非常难看,但显然我做了一些研究,并且是要走的路。