我有一个要在FlatList中显示的对象列表。列表项还应该具有一个选择或取消选择条目的开关。但是,每当我单击开关时,状态都保持未选中状态。我不知道这是ListItem组件的错误还是我的代码中的错误。 onValueChange事件已正确触发,但在更改状态或数据集未更新后,似乎没有重新呈现FlatList。
这是我的课程:
class Person {
constructor() {
this._name = '';
this._selected = false;
}
getName() {
return this._name;
}
setName(value) {
this._name = value;
}
isSelected() {
return this._selected;
}
setSelected(value) {
this._selected = value;
}
}
class App extends Component {
constructor(props) {
super(props);
let p1 = new Person();
p1.setName('Superman');
let p2 = new Person();
p2.setName('Batman');
let list = [ p1, p2 ];
this.state = { persons: list };
}
renderItem = ({item, index}) => (
<ListItem
title={item.getName()}
switch={{
value: item.isSelected(),
onValueChange: (value) => {
let list = this.state.persons;
list[index].setSelected(value);
this.setState({ persons: list });
},
}}
/>
);
render() {
return (
<View style={styles.container}>
<FlatList
data={this.state.persons}
renderItem={this.renderItem}
/>
</View>
);
}
}
答案 0 :(得分:0)
您的代码工作正常,只有FlatList组件的extraData
属性丢失。
通过将
extraData={this.state}
传递给FlatList,我们可以确保FlatListstate.selected
更改时,其自身将重新呈现。没有设定 这个道具,FlatList不知道它需要重新渲染任何物品 因为它也是一个PureComponent并且prop比较不会 显示任何更改。
您的情况必须是:
<FlatList
data={this.state.persons}
renderItem={this.renderItem}
extraData={this.state}
/>
这里是工作中的demo。