React Native ios FlatList 中的开关在值更改后不切换
React Native ios Switch in FlatList not toggling after value changed
我正在尝试切换 ios
Switch in react native。但是我一改变开关就回到初始位置。
我有:
class ABC extends Component {
constructor(props) {
super(props)
this.state = {
obj: []
}
}
fetch(){
// fetch something from remote server, set it to state object array
}
setStatus(id, value){
var temp = [...this.state.obj]
temp.map((t) => {
if (t.id == id) {
t.flag = value
}
})
this.setState({ obj: temp })
}
render() {
return (
<View>
<FlatList
data={this.state.obj}
renderItem={({ item }) =>
<View>
<Text>{item.name}</Text>
<Switch
onValueChange={(val) => this.setStatus(item.id, val)}
value={item.flag}
/>
</View>
}
keyExtractor={({ id }, index) => id.toString()}
/>
</View>
);
}
}
我记录了 obj
状态的前后值,它们似乎在更新。 FlatList 是否应该再次呈现(如网页刷新)?还是我缺少什么?搜索 SO
寻找答案,找不到我的错误。
Flatlist
有一个名为 extraData
的道具。
这个属性告诉 Flatlist
是否重新渲染。
如果 extraData
中的数据发生变化,则平面列表会根据 data
prop.
中提供的新数据重新呈现
因此,每当您需要重新渲染平面列表时,只需更改 extraData
中的内容即可。
最好的方法是将状态传递给 extraData
,然后再传递给 Data
。
所以,只需传递 extraData={this.state.obj}
。
还有其他方法叫做 forceUpdate
。
你可以打电话给this.forceUpdate()
.
但不推荐这样做,因为这不仅会呈现平面列表,还会呈现您调用它的整个组件。
我正在尝试切换 ios
Switch in react native。但是我一改变开关就回到初始位置。
我有:
class ABC extends Component {
constructor(props) {
super(props)
this.state = {
obj: []
}
}
fetch(){
// fetch something from remote server, set it to state object array
}
setStatus(id, value){
var temp = [...this.state.obj]
temp.map((t) => {
if (t.id == id) {
t.flag = value
}
})
this.setState({ obj: temp })
}
render() {
return (
<View>
<FlatList
data={this.state.obj}
renderItem={({ item }) =>
<View>
<Text>{item.name}</Text>
<Switch
onValueChange={(val) => this.setStatus(item.id, val)}
value={item.flag}
/>
</View>
}
keyExtractor={({ id }, index) => id.toString()}
/>
</View>
);
}
}
我记录了 obj
状态的前后值,它们似乎在更新。 FlatList 是否应该再次呈现(如网页刷新)?还是我缺少什么?搜索 SO
寻找答案,找不到我的错误。
Flatlist
有一个名为 extraData
的道具。
这个属性告诉 Flatlist
是否重新渲染。
如果 extraData
中的数据发生变化,则平面列表会根据 data
prop.
因此,每当您需要重新渲染平面列表时,只需更改 extraData
中的内容即可。
最好的方法是将状态传递给 extraData
,然后再传递给 Data
。
所以,只需传递 extraData={this.state.obj}
。
还有其他方法叫做 forceUpdate
。
你可以打电话给this.forceUpdate()
.
但不推荐这样做,因为这不仅会呈现平面列表,还会呈现您调用它的整个组件。