FlatList SectionList 泛型解析

问题

在使用FlatList和SectionList的时候, 我们需要提供几个渲染的方法。

renderItem({ item, index, separators });

但renderItem方法的item类型, 并不是我们data中直接提供的那个对象, 。

例如:

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

在使用TS开发时,希望renderItem方法能够指定类型。

renderItem = (item: ListRenderItemInfo<DataItem>) => {}
<FlatList<DataItem>
    data={this.state.data}
    keyExtractor={this.keyExtractor}
    renderItem={this.renderItem}
/>

数据类型

interface DataItem {
  id: string;
  title: string;
}

interface DataSectionItem {
  title: string;
  data: DataItem[];
}

FlatList用法

<FlatList<DataItem>
          data={DATA}
          renderItem={this.renderItem}
          keyExtractor={(item) => item.id}
          extraData={this.state}
/>
  
renderItem = (item: ListRenderItemInfo<DataItem>) => {
    const backgroundColor =
      item.item.id === this.state?.selectedId ? '#6e3b6e' : '#f9c2ff';
    return (
      <Item
        item={item.item}
        onPress={() => this.setState({selectedId: item.item.id})}
        style={{backgroundColor}}
      />
    );
};

SectionList用法

<SectionList<DataItem, DataSectionItem>
          stickySectionHeadersEnabled={false}
          renderItem={this.renderItem}
          keyExtractor={(item, index) => {
            return item + index?.toString();
          }}
          renderSectionHeader={this.renderSectionHeader}
          renderSectionFooter={this.renderSectionHeader}
          extraData={this.state}
          sections={DATA}
/>
  
function Item(props: {onPress: () => void; style: ViewStyle; item: DataItem}) {
  let {item, onPress, style} = props;
  return (
    <TouchableOpacity onPress={onPress} style={[styles.item, style]}>
      <Text style={styles.title}>{item.title}</Text>
    </TouchableOpacity>
  );
}
  
 renderItem = (info: SectionListRenderItemInfo<DataItem, DataSectionItem>) => {
    const backgroundColor =
      info.item.id === this.state?.selectedId ? '#6e3b6e' : '#f9c2ff';
    return (
      <Item
        item={info.item}
        onPress={() => this.setState({selectedId: info.item.id})}
        style={{backgroundColor}}
      />
    );
  };

  renderSectionHeader = (info: {
    section: SectionListData<DataItem, DataSectionItem>;
  }) => {
    console.log(JSON.stringify(info) + DATA.indexOf(info.section));
    let s =
      info.section.key + '-' + info.section.title + '-' + info.section.data;
    return (
      <View style={styles.item}>
        <Text style={styles.title}>{s}</Text>
      </View>
    );
  };
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容