【React Native】文件翻譯閱讀紀錄 - Components(組件) - FlatList

by - 上午9:00

Facebook Open Source React Native


FlatList

一個高性能的界面,用於渲染簡單,扁平的列表,支持最方便的功能:

  • 完全跨平台。
  • 可選水平模式。
  • 可配置的可見度回調。
  • 標題支持。
  • 頁腳支持。
  • 分隔支持。
  • 拉到刷新。
  • 滾動加載。
  • ScrollToIndex支持。
如果需要節支持,請使用 <SectionList>.
最小例子:
<FlatList
  data={[{key: 'a'}, {key: 'b'}]}
  renderItem={({item}) => <Text>{item.key}</Text>}
/>
更複雜的多選示例演示了PureComponent用於perf優化和避免錯誤的用法。
  • 通過綁定onPressItem處理程序,props將保持===並且PureComponent將防止浪費的重新呈現,除非實際的id,selected或title props改變,即使在MyListItem中呈現的組件沒有這樣的優化。
  • 通過將extraData = {this.state}傳遞給FlatList,我們確保當state.selected更改時,FlatList本身將重新呈現。如果不設置此prop,FlatList將不知道它需要重新渲染任何項目,因為它也是PureComponent,並且prop比較不會顯示任何更改。
  • keyExtractor告訴列表使用反應鍵的id而不是默認的鍵屬性。
class MyListItem extends React.PureComponent {
  _onPress = () => {
    this.props.onPressItem(this.props.id);
  };

  render() {
    const textColor = this.props.selected ? "red" : "black";
    return (
      <TouchableOpacity onPress={this._onPress}>
        <View>
          <Text style={{ color: textColor }}>
            {this.props.title}
          </Text>
        </View>
      </TouchableOpacity>
    );
  }
}

class MultiSelectList extends React.PureComponent {
  state = {selected: (new Map(): Map<string, boolean>)};

  _keyExtractor = (item, index) => item.id;

  _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);
      selected.set(id, !selected.get(id)); // toggle
      return {selected};
    });
  };

  _renderItem = ({item}) => (
    <MyListItem
      id={item.id}
      onPressItem={this._onPressItem}
      selected={!!this.state.selected.get(item.id)}
      title={item.title}
    />
  );

  render() {
    return (
      <FlatList
        data={this.props.data}
        extraData={this.state}
        keyExtractor={this._keyExtractor}
        renderItem={this._renderItem}
      />
    );
  }
}
這是<VirtualizedList>的一個便利包裝器,因此繼承了這裡沒有明確列出的道具(以及<ScrollView>的道具),以及以下警告:
  • 當內容滾出渲染窗口時,不會保留內部狀態。確保在項目數據或外部存儲(如Flux,Redux或Relay)中捕獲所有數據。
  • 這是一個PureComponent,這意味著如果道具保持淺層相等,它將不會重新渲染。確保renderItem函數所依賴的所有內容在更新後作為prop(例如extraData)傳遞,而不是===,否則您的UI可能無法更新更新。這包括數據prop和父組件狀態。
  • 為了限制內存並啟用平滑滾動,內容在屏幕外異步呈現。這意味著可以比填充率更快地滾動並暫時看到空白內容。這是一個可以調整以適應每個應用程序需求的權衡,我們正在努力在幕後進行改進。
  • 默認情況下,列表在每個項目上查找關鍵支柱,並將其用於React鍵。或者,您可以提供自定義keyExtractor道具。
還繼承ScrollView Props,除非它嵌套在同一方向的另一個FlatList中。

Props

方法


Reference

Props

renderItem

renderItem({ item: Object, index: number, separators: { highlight: Function, unhighlight: Function, updateProps: Function(select: string, newProps: Object) } }) => ?React.Element
從數據中獲取項目並將其呈現到列表中。

如果需要,提供額外的元數據,如索引,以及更通用的separators.updateProps函數,它允許您設置要更改前導分隔符或尾隨分隔符的渲染的任何道具,以防更常見的突出顯示和不突出顯示(設置突出顯示的:布爾道具不足以滿足您的使用案例。
TYPE必需
functionYes
Example usage:
<FlatList
  ItemSeparatorComponent={Platform.OS !== 'android' && ({highlighted}) => (
    <View style={[style.separator, highlighted && {marginLeft: 0}]} />
  )}
  data={[{title: 'Title Text', key: 'item1'}]}
  renderItem={({item, separators}) => (
    <TouchableHighlight
      onPress={() => this._onPress(item)}
      onShowUnderlay={separators.highlight}
      onHideUnderlay={separators.unhighlight}>
      <View style={{backgroundColor: 'white'}}>
        <Text>{item.title}</Text>
      </View>
    </TouchableHighlight>
  )}
/>

data

為簡單起見,數據只是一個普通的數組。如果要使用其他內容(如不可變列表),請直接使用基礎VirtualizedList。
類型必需
arrayYes

ItemSeparatorComponent

在每個項目之間渲染,但不在頂部或底部。默認情況下,提供highlight和leadingItem道具。 renderItem提供separators.highlight / unhighlight,它將更新突出顯示的prop,但您也可以使用separators.updateProps添加自定義道具。
類型必需
componentNo

ListEmptyComponent

列表為空時呈現。可以是React Component Class,渲染函數或渲染元素。
類型必需
component, function, elementNo

ListFooterComponent

在所有項目的底部呈現。可以是React Component Class,渲染函數或渲染元素。

類型必需
component, function, elementNo

ListHeaderComponent

呈現在所有項目的頂部。可以是React Component Class,渲染函數或渲染元素。
類型必需
component, function, elementNo

columnWrapperStyle

numColumns> 1時生成的多項行的可選自定義樣式。
類型必需
style objectNo

extraData

用於告知列表重新呈現的標記屬性(因為它實現了PureComponent)。如果你的任何renderItem,Header,Footer等函數依賴於數據道具之外的任何東西,請將其粘貼在此處並進行不可變處理。
類型必需
anyNo

getItemLayout

(data, index) => {length: number, offset: number, index: number}
getItemLayout是一個可選的優化,如果您提前了解項目的高度,我們可以跳過動態內容的測量。如果你有固定的高度項,getItemLayout既高效又易於使用,例如:

  getItemLayout={(data, index) => (
    {length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index}
  )}
添加getItemLayout可以為幾百個項目的列表提供很好的性能提升。如果指定ItemSeparatorComponent,請記住在偏移計算中包括分隔符長度(高度或寬度)。
類型必需
functionNo

horizontal

如果為true,則水平呈現彼此相鄰的項目,而不是垂直堆疊。
類型必需
booleanNo

initialNumToRender

初始批次中要渲染的項目數。這應該足以填滿屏幕,但不是更多。請注意,這些項目永遠不會作為窗口渲染的一部分卸載,以提高滾動到頂部操作的感知性能。
類型必需
numberNo

initialScrollIndex

而不是從第一個項目的頂部開始,從initialScrollIndex開始。這將禁用“滾動到頂部”優化,該優化使第一個initialNumToRender項始終呈現,並立即呈現從此初始索引開始的項。需要實現getItemLayout。
類型必需
numberNo

inverted

反轉滾動方向。使用-1的比例變換。
類型必需
booleanNo

keyExtractor

(item: object, index: number) => string;
用於為指定索引處的給定項提取唯一鍵。密鑰用於緩存,並作為跟踪項目重新排序的反應鍵。默認提取器檢查item.key,然後回退到使用索引,就像React那樣。
類型必需
functionNo

numColumns

多列只能使用horizo​​ntal = {false}進行渲染,並且像flexWrap佈局一樣鋸齒形。項目應該都是相同的高度 - 不支持砌體佈局。
類型必需
numberNo

onEndReached

(info: {distanceFromEnd: number}) => void
當滾動位置在渲染內容的onEndReachedThreshold內時調用一次。
類型必需
functionNo

onEndReachedThreshold

距離末尾多少(以列表的可見長度為單位)列表的下邊緣必須來自內容的末尾才能觸發onEndReached回調。因此,當內容的結尾在列表的可見長度的一半之內時,值0.5將觸發onEndReached。
類型必需
numberNo

onRefresh

() => void
如果提供,將為“Pull to Refresh”功能添加標準RefreshControl。確保正確設置刷新道具。
類型必需
functionNo

onViewableItemsChanged

(info: {
    viewableItems: array,
    changed: array,
  }) => void
當viewabilityConfig prop定義時,行的可見度發生變化時調用。
類型必需
functionNo

progressViewOffset

當需要偏移以使加載指示器正確顯示時設置此項。
類型必需平台
numberNoAndroid

legacyImplementation

可能沒有完整的功能奇偶校驗,用於調試和性能比較。
類型必需
booleanNo

refreshing

在等待刷新的新數據時設置為true。
類型必需
booleanNo

removeClippedSubviews

這可以改善大型列表的滾動性能。
注意:在某些情況下可能存在錯誤(缺少內容) - 使用風險自負。
類型必需
booleanNo

viewabilityConfig

有關流類型和更多文檔,請參閱 ViewabilityHelper.js。
類型必需
ViewabilityConfigNo
viewabilityConfig 採用 ViewabilityConfig 類型,該對象具有以下屬性
PROPERTY必需類型
minimumViewTimeNonumber
viewAreaCoveragePercentThresholdNonumber
itemVisiblePercentThresholdNonumber
waitForInteractionNoboolean

至少需要 viewAreaCoveragePercentThreshold 或 itemVisiblePercentThreshold 中的一個。這需要在構造函數中完成,以避免跟隨錯誤 (ref):
  Error: Changing viewabilityConfig on the fly is not supported`
constructor (props) {
  super(props)

  this.viewabilityConfig = {
      waitForInteraction: true,
      viewAreaCoveragePercentThreshold: 95
  }
}
<FlatList
    viewabilityConfig={this.viewabilityConfig}
  ...

minimumViewTime

在觸發可見性回調之前,項目必須在物理上可見的最短時間(以毫秒為單位)。較高的數字意味著不停止滾動內容不會將內容標記為可查看。

viewAreaCoveragePercentThreshold

必須為部分遮擋的項目覆蓋的視口百分比計為“可查看”,0-100。完全可見的項目始終被視為可見。值為0表示視口中的單個像素使項目可查看,值100表示​​項目必須完全可見或覆蓋整個視口以計為可查看。

itemVisiblePercentThreshold

與viewAreaPercentThreshold類似,但考慮可見項目的百分比,而不是它所覆蓋的可查看區域的分數。

waitForInteraction

在用戶滾動或在渲染後調用recordInteraction之前,不會將任何內容視為可見。

viewabilityConfigCallbackPairs

ViewabilityConfig / onViewableItemsChanged對列表。當滿足相應的ViewabilityConfig條件時,將調用特定的onViewableItemsChanged。有關流類型和更多文檔,請參閱ViewabilityHelper.js。
類型必需
array of ViewabilityConfigCallbackPairNo

方法

scrollToEnd()

scrollToEnd([params]);
滾動到內容的末尾。如果沒有 getItemLayout 道具,可能會很笨拙。
參數:
名稱類型必需說明
paramsobjectNoSee below.
有效的 params 鍵是:
  • 'animated'(boolean) - 列表是否應該在滾動時執行動畫。默認為true。

scrollToIndex()

scrollToIndex(params);
滾動到指定索引處的項目,使其位於可查看區域中,以便viewPosition 0將其置於頂部,1位於底部,0.5位於中間。
注意:如果不指定getItemLayout prop,則無法滾動到渲染窗口之外的位置。
Parameters:
名稱類型必需說明
paramsobjectYesSee below.
有效的params鍵是:
  • 'animated' (boolean) - 列表是否應該在滾動時執行動畫。默認為true。
  • 'index' (number) - 要滾動到的索引。需要。
  • 'viewOffset' (number) - 用於偏移最終目標位置的固定像素數。需要。
  • 'viewPosition' (number) - 值為0時,index指定的項目位於頂部,1位於底部,0.5位於中間。

scrollToItem()

scrollToItem(params);
需要線性掃描數據 - 如果可能,請使用scrollToIndex。
注意:如果不指定getItemLayout prop,則無法滾動到渲染窗口之外的位置。
參數:
名稱類型必需說明
paramsobjectYesSee below.
有效的params鍵是:
  • 'animated' (boolean) - 要滾動到的偏移量。在水平為真的情況下,偏移是x值,在任何其他情況下,偏移是y值。需要。
  • 'item' (object) - 列表是否應該在滾動時執行動畫。默認為true。
  • 'viewPosition' (number)

scrollToOffset()

scrollToOffset(params);
Scroll to a specific content pixel offset in the list.
Parameters:
名稱類型必需說明
paramsobjectYesSee below.
有效的params鍵是:
  • 'offset' (number) - 要滾動到的偏移量。在水平為真的情況下,偏移是x值,在任何其他情況下,偏移是y值。需要。
  • 'animated' (boolean) - 列表是否應該在滾動時執行動畫。默認為true。

recordInteraction()

recordInteraction();
告訴列表發生了交互,這應該觸發可視性計算,例如,如果waitForInteractions為true且用戶未滾動。這通常通過點擊項目或導航操作來調用。


flashScrollIndicators()

flashScrollIndicators();
暫時顯示滾動指示器。



You May Also Like

0 意見