FlatList SectionList 泛型解析

問題

在使用FlatList和SectionList的時候, 我們需要提供幾個渲染的方法。

renderItem({ item, index, separators });

但renderItem方法的item類型, 并不是我們data中直接提供的那個對象, 。

例如:

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

在使用TS開發(fā)時,希望renderItem方法能夠指定類型。

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

數(shù)據(jù)類型

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>
    );
  };
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容