3

我有一个要在 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>
    );
  }
}
4

1 回答 1

2

您的代码工作正常,仅extraData缺少 FlatList 组件的属性。

查看文档

通过传递extraData={this.state}给 FlatList,我们确保 FlatList 本身会在state.selected更改时重新渲染。如果不设置这个 prop,FlatList 将不知道它需要重新渲染任何项目,因为它也是一个 PureComponent,并且 prop 比较不会显示任何更改。

在您的情况下,它必须是:

<FlatList
     data={this.state.persons}
     renderItem={this.renderItem}
     extraData={this.state}
/>

这是一个工作演示

于 2019-04-19T08:35:27.517 回答