React Native 列表組件基礎知識

ScrollView 組件

ScrollView組件是一個容器滾動組件,當容器超出指定寬高時就可以進行滾動交互。

ScrollView組件是一次性渲染所有的 React 子組件,這在性能上是比較差的,所以不建議當列表特別長的時候使用此組件。

接下來列舉幾個常用的一些屬性:

  • contentContainerStyle 屬性

    相當于為ScrollView組件設置樣式,具體的實例如下:

    <ScrollView contentContainerStyle={styles.container}></ScrollView>;const styles = StyleSheet.create({container: {padding: 8,},
    });
    
  • refreshControl 屬性

    結合 RefreshControl 組件一起使用,用于為 ScrollView 提供下拉刷新功能。僅適用于垂直 ScrollViews(horizontalprop 必須是 false)。

    具體實例如下:

    const App: React.FC = () => {const [refreshing, setRefreshing] = React.useState(false);const onRefresh = React.useCallback(() => {setRefreshing(true);setTimeout(() => {setRefreshing(false);}, 2000);}, []);return (<SafeAreaView style={styles.container}><ScrollViewcontentContainerStyle={styles.scrollView}refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />}><Text>下拉刷新</Text></ScrollView></SafeAreaView>);
    };
    
  • scrollEnabled 屬性

    當為 false 時,視圖無法通過觸摸交互滾動。請注意,視圖始終可以通過調用來滾動 scrollTo。

    export default function ScrollCards() {return (<View><Text style={BaseStyle.headingText}>Scroll Cards</Text><ScrollView contentContainerStyle={styles.container}>{/* 第一組關閉滑動 */}<Text style={BaseStyle.headingText}>第一組</Text><ScrollView horizontal={true} scrollEnabled={false}><View style={styles.card}><Text>Click</Text></View><View style={styles.card}><Text>To</Text></View><View style={styles.card}><Text>Me</Text></View><View style={styles.card}><Text>Run</Text></View><View style={styles.card}><Text>Demo</Text></View></ScrollView>{/* 第二組開啟滑動 */}<Text style={BaseStyle.headingText}>第二組</Text><ScrollView horizontal={true}><View style={styles.card}><Text>Click</Text></View><View style={styles.card}><Text>To</Text></View><View style={styles.card}><Text>Me</Text></View><View style={styles.card}><Text>Run</Text></View><View style={styles.card}><Text>Demo</Text></View></ScrollView></ScrollView></View>);
    }
    
  • horizontal 屬性

    當 true 時,滾動視圖的子級水平排列在行中,而不是垂直排列在列中。例子如上。運行效果如下圖:
    在這里插入圖片描述

SectionList 組件

此組件主要是用于分段列表展示,并且在性能上要比ScrollView組件更好。

此組件主要有如下:

  • 可配置的可見度回調
  • 列表標題支持
  • 列表頁腳支持
  • 項目分隔符支持
  • 節標題支持
  • 節分隔符支持
  • 異構數據和項目渲染支持
  • 拉動刷新
  • 滾動加載

簡單實例如下:

export default function SectionListCards() {const DATA = [{title: "Main dishes",data: ["Pizza", "Burger", "Risotto"],},{title: "Sides",data: ["French Fries", "Onion Rings", "Fried Shrimps"],},{title: "Drinks",data: ["Water", "Coke", "Beer"],},{title: "Desserts",data: ["Cheese Cake", "Ice Cream"],},];return (<View><Text style={BaseStyle.headingText}>SectionList 組件實例</Text><SectionListstyle={styles.container}sections={DATA}keyExtractor={(item, index) => item + index}renderItem={({ item }) => (<View style={styles.item}><Text style={styles.title}>{item}</Text></View>)}renderSectionHeader={({ section: { title } }) => (<Text style={styles.header}>{title}</Text>)}/></View>);
}

運行后效果如下圖:
在這里插入圖片描述

使用此組件需要注意以下幾點:

  • 當內容滾動出渲染窗口時,超出窗口的數據不會自動保存的系統變量中。所以需要我們使用 Flux、Redux 或者 Relay 來存儲是有需要展示的數據。

  • SectionList組件是 PureComponent 類型組件,這意味著如果 props 保持淺層拷貝的話,它將不會重新渲染。確保您的 renderItem 函數所依賴的所有內容都作為 prop(例如 extraData)傳遞,并且在更新后不是 === ,否則您的 UI 可能不會因更改而更新。

  • SectionList組件為了節省內存和實現平滑的滾動,頁面的內容展示是異步實現的,這就意味著當滑動速度快于頁面內容渲染速度的話,頁面會出現空白內容。

  • 默認情況下,列表會在每個項目上查找 key 屬性,并將其用作 React key。或者,您可以提供自定義 keyExtractor 屬性。

組件必須的參數說明

  • renderItem

    每個部分中每個項目的默認渲染器。可以在每個部分的基礎上覆蓋。應該返回一個 React 元素。具體代碼實例:

    renderItem={({ item, index, section, separators }) => ( )}
    
    • item(類型為對象): 需要渲染的內容數據
    • index(類型為數字):渲染內容的項目下標
    • section(類型為對象):SectionList當前渲染節點的完整對象
    • separators(類型為對象):具體有如下屬性:
      • highlight(類型為函數):監聽元素變為高亮后可以觸發的事件
      • unhighlight(類型為函數):監聽元素取消高亮后可以觸發的事件
      • updateProps(類型為函數):函數接收selectnewProps兩個屬性。
  • sections

    需要渲染的數據

FlatList 組件

FlatList組件租用是用于展示基本、平面列表的高性能界面,具有如下功能:

  • 可選水平模式
  • 可配置的可見度回調
  • 標頭支持
  • 頁腳支持
  • 分隔符支持
  • 拉動刷新
  • 滾動加載
  • 滾動到索引支持
  • 多列支持

具體的實例如下:

const DATA = [{id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba",title: "First Item",},{id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63",title: "Second Item",},{id: "58694a0f-3da1-471f-bd96-145571e29d72",title: "Third Item",},
];type ItemProps = { title: string };const Item = ({ title }: ItemProps) => (<View style={styles.item}><Text style={styles.title}>{title}</Text></View>
);export default function FlatListCards() {return (<View><Text style={BaseStyle.headingText}>FlatListCards</Text><FlatListdata={DATA}renderItem={({ item }) => <Item title={item.title} />}keyExtractor={(item) => item.id}/></View>);
}const styles = StyleSheet.create({container: {flex: 1,},item: {backgroundColor: "#f9c2ff",padding: 20,marginVertical: 8,marginHorizontal: 16,},title: {fontSize: 24,},
});

運行效果如下:
在這里插入圖片描述
要渲染多列,請使用numColumns。 使用此方法而不是 flexWrap 布局可以防止與項目高度邏輯發生沖突。在上述的例子中,我們添加numColumns屬性就可以,關鍵代碼如下:

<FlatListnumColumns={2}data={DATA}renderItem={({ item }) => <Item title={item.title} />}keyExtractor={(item) => item.id}
/>

運行效果如下:
在這里插入圖片描述
實現更加復雜、可選的實例:

type ItemData = {id: string;title: string;
};const DATA: ItemData[] = [{id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba",title: "First Item",},{id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63",title: "Second Item",},{id: "58694a0f-3da1-471f-bd96-145571e29d72",title: "Third Item",},
];type ItemProps = {item: ItemData;onPress: () => void;backgroundColor: string;textColor: string;
};const Item = ({ item, onPress, backgroundColor, textColor }: ItemProps) => (<TouchableOpacityonPress={onPress}style={[styles.item, { backgroundColor }]}><Text style={[styles.title, { color: textColor }]}>{item.title}</Text></TouchableOpacity>
);export default function FlarCardsClick() {const [selectedId, setSelectedId] = useState<string>();const renderItem = ({ item }: { item: ItemData }) => {const backgroundColor = item.id === selectedId ? "#6e3b6e" : "#f9c2ff";const color = item.id === selectedId ? "white" : "black";return (<Itemitem={item}onPress={() => setSelectedId(item.id)}backgroundColor={backgroundColor}textColor={color}/>);};return (<View><Text style={BaseStyle.headingText}>FlarCardsClick</Text><FlatListdata={DATA}renderItem={renderItem}keyExtractor={(item) => item.id}extraData={selectedId}/></View>);
}const styles = StyleSheet.create({item: {padding: 20,marginVertical: 8,marginHorizontal: 16,},title: {fontSize: 24,},
});

運行效果如下:
在這里插入圖片描述

使用此組件需要注意以下幾點:

  • 當內容滾動出渲染窗口時,超出窗口的數據不會自動保存的系統變量中。所以需要我們使用 Flux、Redux 或者 Relay 來存儲是有需要展示的數據。

  • flatList組件是 PureComponent 類型組件,這意味著如果 props 保持淺層拷貝的話,它將不會重新渲染。確保您的 renderItem 函數所依賴的所有內容都作為 prop(例如 extraData)傳遞,并且在更新后不是 === ,否則您的 UI 可能不會因更改而更新。

  • flatList組件為了節省內存和實現平滑的滾動,頁面的內容展示是異步實現的,這就意味著當滑動速度快于頁面內容渲染速度的話,頁面會出現空白內容。

  • 默認情況下,列表會在每個項目上查找 key 屬性,并將其用作 React key。或者,您可以提供自定義 keyExtractor 屬性。

組件必須的參數說明

  • renderItem

    每個部分中每個項目的默認渲染器。可以在每個部分的基礎上覆蓋。應該返回一個 React 元素。具體代碼實例:

    renderItem={({ item, index, section, separators }) => ( )}
    
    • item(類型為對象): 需要渲染的內容數據
    • index(類型為數字):渲染內容的項目下標
    • separators(類型為對象):具體有如下屬性:
      • highlight(類型為函數):監聽元素變為高亮后可以觸發的事件
      • unhighlight(類型為函數):監聽元素取消高亮后可以觸發的事件
      • updateProps(類型為函數):函數接收selectnewProps兩個屬性。
  • data

    需要渲染的數據

VirtualizedList 組件

一般來說,只有當您需要比 FlatList 提供的更多靈活性時才應該真正使用VirtualizedList。可以通過對應的屬性來對需要渲染的數據進行操作后再渲染,比之前的列表組件更加靈活一些。

VirtualizedList 組件通過對應的屬性來維護需要渲染的頁面元素,并且用適當的空白區域來替換窗口之外的所有項目,從而極大地提高了大型列表的內存消耗和性能。

具體實例如下:

type ItemData = {id: string;title: string;
};// 獲取數據,這里是直接就返回處理后的數據
const getItem = (_data: unknown, index: number): ItemData => ({id: Math.random().toString(12).substring(0),title: `Item ${index + 1}`,
});// 列表的總數
const getItemCount = (_data: unknown) => 50;type ItemProps = {title: string;
};// 渲染的組件
const Item = ({ title }: ItemProps) => (<View style={styles.item}><Text style={styles.title}>{title}</Text></View>
);export default function VirtualizedListCaards() {return (<View><Text style={BaseStyle.headingText}>VirtualizedListCards</Text><VirtualizedListinitialNumToRender={10}renderItem={({ item }) => <Item title={item.title} />}keyExtractor={(item) => item.id}getItemCount={getItemCount}getItem={getItem}/></View>);
}const styles = StyleSheet.create({item: {backgroundColor: "#f9c2ff",height: 150,justifyContent: "center",marginVertical: 8,marginHorizontal: 16,padding: 20,},title: {fontSize: 32,},
});

使用此組件需要注意以下幾點:

  • 當內容滾動出渲染窗口時,超出窗口的數據不會自動保存的系統變量中。所以需要我們使用 Flux、Redux 或者 Relay 來存儲是有需要展示的數據。

  • flatList組件是 PureComponent 類型組件,這意味著如果 props 保持淺層拷貝的話,它將不會重新渲染。確保您的 renderItem 函數所依賴的所有內容都作為 prop(例如 extraData)傳遞,并且在更新后不是 === ,否則您的 UI 可能不會因更改而更新。

  • flatList組件為了節省內存和實現平滑的滾動,頁面的內容展示是異步實現的,這就意味著當滑動速度快于頁面內容渲染速度的話,頁面會出現空白內容。

  • 默認情況下,列表會在每個項目上查找 key 屬性,并將其用作 React key。或者,您可以提供自定義 keyExtractor 屬性。

組件必備的參數說明

  • getItem

    從數據中提取需要渲染的數據

  • getItemCount

    確認需要渲染的組件有多少

  • renderItem

    從 data 數據中獲取一個數據并進行渲染

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34822.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML(JavaEE初級系列12)

目錄 前言&#xff1a; 1.HTML結構 1.1認識HTML標簽 1.2HTML文件基本結構 1.3標簽層次結構 1.4快速生成代碼框架 2.HTML常見標簽 2.1注釋標簽 2.2標題標簽&#xff1a;h1-h6 2.3段落標簽&#xff1a;p 2.4換行標簽&#xff1a; br 2.5格式化標簽 2.6圖片標簽&#…

【數據結構?堆】經典問題:k路歸并

題目描述 k路歸并問題&#xff1a;   把k個有序表合并成一個有序表。&#xff08; k < 10^4 &#xff09; 輸入輸出格式 輸入格式&#xff1a; 輸入數據共有 2*k1 行。   第一行&#xff0c;一個整數k&#xff08; k < 10^4 &#xff09;&#xff0c;表示有k個有序…

【詳細教程】學會使用Python隧道代理

作為一名專業爬蟲程序猿&#xff0c;我深知在進行網絡數據采集時&#xff0c;可能會面臨網絡封鎖、隱私泄露等問題。今天&#xff0c;我將與大家分享如何學會使用Python隧道代理&#xff0c;幫助我們自由訪問受限網站&#xff0c;同時保護了解探索Python隧道代理&#xff01; …

3.1 Spring MVC概述

1. MVC概念 MVC是一種編程思想&#xff0c;它將應用分為模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三個層次&#xff0c;這三部分以最低的耦合進行協同工作&#xff0c;從而提高應用的可擴展性及可維護…

C++ opencv:視頻讀取、變換顏色風格、保存

1. 相關知識點 VideoCapture&#xff1b; applyColorMap&#xff1b; VideoWriter&#xff1b; 2. 代碼 編寫代碼main.cpp: #include<iostream> #include "opencv2/opencv.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgu…

解開謎團:為什么紅黑樹勝過AVL樹?

為什么紅黑樹勝過AVL樹 博主簡介一、引言1.1、紅黑樹和AVL樹簡介1.2、紅黑樹在某些方面優于AVL樹 二、紅黑樹和AVL樹的基本原理2.1、紅黑樹的定義和性質2.2、AVL樹的定義和性質2.3、對比兩種樹結構的特點 三、插入和刪除操作的復雜性比較3.1、紅黑樹的插入操作和平衡性維護3.2、…

冪次方(c++題解)

題目描述 任何一個正整數都可以用 22 的冪次方表示。例如 1372^72^32^0。 同時約定方次用括號來表示&#xff0c;即 a^b 可表示為 a(b)。 由此可知&#xff0c;137137 可表示為 2(7)2(3)2(0) 進一步&#xff1a; 7 2^222^0 ( 2^121 用 2 表示)&#xff0c;并且 322^0。 所…

Spring Boot 重啟命令

Spring Boot 重啟命令 本文描述了一個重啟Spring Boot命令執行過程和示例 本文利用kill -9 關閉進程&#xff0c;不優雅&#xff0c;會突然中斷程序&#xff0c;可能導致數據和邏輯異常 搜索微信小程序【亞特技術】在資源中搜索【優雅】可得到Spring Boot如何優化重啟 1. 過…

【Bert101】變壓器模型背后的復雜數學【02/4】

一、說明 眾所周知&#xff0c;變壓器架構是自然語言處理&#xff08;NLP&#xff09;領域的突破。它克服了 seq-to-seq 模型&#xff08;如 RNN 等&#xff09;無法捕獲文本中的長期依賴性的局限性。變壓器架構被證明是革命性架構&#xff08;如 BERT、GPT 和 T5 及其變體&…

【陣列信號處理】空間匹配濾波器、錐形/非錐形最佳波束成形器、樣本矩陣反演 (SMI) 研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

九耶丨閣瑞鈦倫特-產品經理面試題

在產品上線后&#xff0c;會著重觀察6類指標&#xff1a; 1、活躍用戶指標 衡量APP用戶規模的指標&#xff0c;一個產品是否成功&#xff0c;如果只看一個指標&#xff0c;那么這個指標一定是活躍用戶數。 日活(DAU)&#xff1a;一天內日均活躍設備數(去重&#xff0c;每個公…

關于使用pycharm遇到只能使用unittest方式運行,無法直接選擇Run

相信大家可能都遇到過這個問題&#xff0c;使用pycharm直接運行腳本的時候&#xff0c;只能選擇unittest的方式&#xff0c;能愁死個人 經過幾次各種嘗試無果之后&#xff0c;博主就放棄死磕了&#xff0c;原諒博主是個菜鳥 后來遇到這樣的問題&#xff0c;往往也就直接使用cm…

Python爬蟲-抓取的目標數據為#x開頭,怎么解決?

前言 本文是該專欄的第4篇,后面會持續分享python爬蟲案例干貨,記得關注。 在做爬蟲項目的時候,有時候抓取的平臺目標數據為&#x開頭,如下圖所示: 瀏覽器顯示的正常數據,但通過爬蟲協議獲取到的網頁源碼數據卻是以&#x開頭的隱藏數據,遇到這種情況,爬蟲需要怎么處…

【Linux從入門到精通】文件I/O操作(C語言vs系統調用)

文章目錄 一、C語言的文件IO相關函數操作 1、1 fopen與fclose 1、2 fwrite 1、3 fprintf與fscanf 1、4 fgets與fputs 二、系統調用相關接口 2、1 open與close 2、2 write和read 三、簡易模擬實現cat指令 四、總結 &#x1f64b;?♂? 作者&#xff1a;Ggggggtm &#x1f64b;?…

Golang bitset 基本使用

安裝&#xff1a; go get github.com/bits-and-blooms/bitset下面代碼把fmtx換成fmt就行 //------------基本操作------------//構建一個64bit長度的bitsetb : bitset.New(64)//放入一個數b.Set(10)fmtx.Println("add-10&#xff1a;", b.DumpAsBits()) // 0000000…

針對英特爾酷睿 CPU 優化,Canonical 發布 Ubuntu 實時內核

導讀Canonical 今天宣布針對支持時序協調運算&#xff08;TCC&#xff09;和時間敏感網絡&#xff08;IEEE TSN&#xff09;的英特爾酷睿處理器&#xff0c;推出優化版實時 Ubuntu 內核。 Canonical 于今年 2 月宣布&#xff0c;為購買 Ubuntu Pro 訂閱&#xff0c;使用代號為 …

OPENCV C++(七)霍夫線檢測+找出輪廓和外接矩形+改進旋轉

霍夫線檢測 vector<Vec2f> lines1;HoughLines(canny_mat, lines1, 1, CV_PI / 180.0,90 );//45可以檢測里面兩條線 80檢測出外邊兩條線 定義存放輸出線的向量 此向量輸出有<距離&#xff0c;角度> 因為檢測的原理就是在變換霍夫空間里面去檢測的&#xff0c;這里可…

ESP8266(RTOS SDK)內嵌網頁以實現WEB配網以及數據交互

【本文發布于https://blog.csdn.net/Stack_/article/details/131997098&#xff0c;未經允許不得轉載&#xff0c;轉載須注明出處】 1、執行make menuconfig&#xff0c;將http頭由512改為更大的值&#xff0c;否則用電腦瀏覽器訪問正常&#xff0c;但用手機瀏覽器訪問會因為ht…

基于weka手工實現K-means

一、K-means聚類算法 K均值聚類&#xff08;K-means clustering&#xff09;是一種常見的無監督學習算法&#xff0c;用于將數據集中的樣本劃分為K個不同的類別或簇。它通過最小化樣本點與所屬簇中心點之間的距離來確定最佳的簇劃分。 K均值聚類的基本思想如下&#xff1a; …

【快應用】list組件如何區分滑動的方向?

【關鍵詞】 list組件、滑動方向、scroll 【問題背景】 有cp反饋list這個組件在使用的時候&#xff0c;不知道如何區分它是上滑還是下滑。 【問題分析】 list組件除了通用事件之外&#xff0c;還提供了scroll、scrollbottom、scrolltop、scrollend、scrolltouchup事件&#x…