FlatList单选单元格

时间:2018-05-07 14:24:21

标签: react-native react-native-flatlist

我按照官方文档中的示例,这里是如何实现多选功能:

state = { selected: (new Map(): Map<string, boolean>) };

onPressItem = (id) => {
  this.setState((state) => {
    const selected = new Map(state.selected);
    selected.set(id, !selected.get(id)); 
    return { selected };
  });
};

我正努力让它单挑。在任何时候点击单元格时,很容易返回带有错误值的新Map,但这意味着无法通过另一次点击取消选择单元格,这是我所需的功能。

onPressItem = (id) => {
  this.setState((state) => {
    const selected = new Map();
    selected.set(id, !selected.get(id)); 
    return { selected };
  });
};

你会如何实现它?我是否应该使用lodash迭代Map来找到已经存在的那个并改变它的值(现在确定如何迭代Map),或者我现在还缺少一些更好的方法?

修改

迭代selected地图的元素似乎是一个非常难看的想法,但它很简单,它确实有效。有没有更好的办法,我错过了?

onPressItem = (id: string) => {
  this.setState((state) => {
    const selected = new Map(state.selected);
    selected.set(id, !selected.get(id));
    for (const key of selected.keys()) {
      if (key !== id) {
        selected.set(key, false);  
      } 
    }
    return { selected };
  });
 };

提前致谢

2 个答案:

答案 0 :(得分:4)

您只能设置一个值而不是像这样的地图

| Attributes  | Field type | value |  description
| - | - | - | -
| required | `*` | boolean`(default=false)` | check if field has a value if set true.
| requiredPhrase | `*` | string`(default=This field is required.)` | error shown when field is required and empty.

答案 1 :(得分:0)

我遇到了同样的问题,我的解决方法是:

_onPressItem = (id: string) => {
        // updater functions are preferred for transactional updates
        this.setState((state) => {
            // copy the map rather than modifying state.
            const selected = new Map(state.selected);

            // save selected value
            let isSelected = selected.get(id);

            // reset all to false
            selected.forEach((value, key) => {
                selected.set(key, false);
            });

            // then only activate the selected
            selected.set(id, !isSelected);

            return { selected };
        });
    };