ReactNative列表ListView的用法
最近在學(xué)習(xí)ReactNative,本文介紹了ReactNative列表ListView的用法,分享給大家,也給自己留個(gè)筆記
ListView
在Android中,如果我們需要顯示一個(gè)ListView,有兩項(xiàng)是比不可少的,首先是ListView的數(shù)據(jù)源,其次是ListView每個(gè)item的樣式。ReactNative中一樣。首先我們來看一個(gè)簡(jiǎn)單的例子:
constructor(props) { super(props); var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); this.state = { dataSource: ds.cloneWithRows(['row 1', 'row 2']), }; }, render() { return ( <ListView dataSource={this.state.dataSource} renderRow={(rowData) => <Text>{rowData}</Text>} /> ); },
在render()中,我們渲染一個(gè)ListView,在ListView的屬性中,我們指定了dataSource和renderRow,這兩個(gè)屬性分別代表ListView的數(shù)據(jù)源和渲染的每一行。
dataSource
如果我們要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)源,最基本的方法就是創(chuàng)建一個(gè)ListView.DataSource數(shù)據(jù)源,然后通過cloneWithRows方法為其傳遞一個(gè)數(shù)組。
其中提供給數(shù)據(jù)源的rowHasChanged函數(shù)可以告訴ListView它是否需要重繪一行數(shù)據(jù),即數(shù)據(jù)是否發(fā)生了改變,即在需要重繪界面的時(shí)候會(huì)進(jìn)行判斷,如果之前頁面中的改行數(shù)據(jù)沒有發(fā)生變化,則不再進(jìn)行重繪,否則進(jìn)行重繪。
如上述代碼,我們對(duì)數(shù)據(jù)源設(shè)置數(shù)據(jù)時(shí)直接傳入一個(gè)數(shù)組,當(dāng)然我們也可以通過一個(gè)獲取數(shù)據(jù)的方法,在設(shè)置數(shù)據(jù)的時(shí)候調(diào)用方法即可:
constructor(props){ super(props); var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); this.state = { dataSource: ds.cloneWithRows(this._genRows()), }; } _genRows(){ const dataBlob = []; for(let i = 0 ; i< 200 ; i ++ ){ dataBlob.push("aa"+i); } return dataBlob; }
這樣通過方法獲取數(shù)據(jù),方便我們進(jìn)行一些邏輯的處理。
renderRow
(rowData, sectionID, rowID, highlightRow) => renderable
該屬性需要傳入一個(gè)方法,該方法如上所示,他會(huì)從數(shù)據(jù)源中接受一條數(shù)據(jù),以及他和他所在的section的Id,返回一個(gè)可渲染的組件來為這行數(shù)據(jù)進(jìn)行渲染,默認(rèn)情況下參數(shù)中的數(shù)據(jù)就是放進(jìn)數(shù)據(jù)源中的數(shù)據(jù)本身,不過也可以提供一些轉(zhuǎn)換器。
如果某一行正在被高亮(通過調(diào)用highlightRow函數(shù)),ListView會(huì)得到相應(yīng)的通知。當(dāng)一行被高亮?xí)r,其兩側(cè)的分割線會(huì)被隱藏。行的高亮狀態(tài)可以通過調(diào)用highlightRow(null)來重置。
_renderRow(rowData, sectionID, rowID){ return ( <View> <Text>{"rowData:"+rowData+" rowId:"+rowID}</Text> </View> ); } render() { return ( <ListView dataSource={this.state.dataSource} renderRow={this._renderRow} /> ); },
因?yàn)閞enderRow中的方法會(huì)自動(dòng)接受從數(shù)據(jù)源中的一條數(shù)據(jù),因此我們可以通過調(diào)用外部方法的方式進(jìn)行實(shí)現(xiàn),同時(shí)只需要在外部方法的參數(shù)中傳入我們需要從數(shù)據(jù)源中獲取的數(shù)據(jù)即可,如上代碼所示。
當(dāng)我們需要實(shí)現(xiàn)比較復(fù)雜的布局時(shí),也可以通過導(dǎo)入外部組件的方式作為L(zhǎng)istView的每一行的樣式。
例如我們自定義了一個(gè)組件Item_MyListView,我們需要在文件開頭通過import方式將其導(dǎo)入到當(dāng)前組件中:
import Item_MyListView from './Item_MyListView';
然后就可以通過導(dǎo)入的名稱直接使用我們導(dǎo)入的組件了:
_renderRow(rowData, sectionID, rowID){ return ( <TouchableOpacity onPress={this._pressRow}> <View> <Text>{"rowData:"+rowData+" rowId:"+rowID}</Text> <Item_MyListView></Item_MyListView> </View> </TouchableOpacity> ); }
ListView的點(diǎn)擊
當(dāng)我們需要給ListView的每一行添加點(diǎn)擊事件時(shí),只需要在其外層包裹一層TouchableOpacity或者TouchableHighlight,定義好onPress方法即可。
如下代碼所示:
_pressRow(rowID){ alert("hellow"+rowID); } _renderRow(rowData, sectionID, rowID){ return ( <TouchableOpacity onPress={()=>this._pressRow(rowID)}> <View> <Text>{"rowData:"+rowData+" rowId:"+rowID}</Text> <Item_MyListView info={rowData}></Item_MyListView> </View> </TouchableOpacity> ); }
需要注意的是,在ListView的renderRow屬性中調(diào)用_renderRow一定要綁定this,否則onPress中的this就會(huì)指向錯(cuò)誤,如下所示:
<ListView dataSource={this.state.dataSource} renderRow={this._renderRow.bind(this)}/>
完整代碼如下所示:
import React,{ View, Text, TouchableOpacity, ListView, } from 'react-native'; import Item_MyListView from './Item_MyListView'; export default class SecondPageComponent extends React.Component{ constructor(props){ super(props); var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); this.state = { dataSource: ds.cloneWithRows(this._genRows()), }; } _genRows(){ const dataBlob = []; for(let i = 0 ; i< 200 ; i ++ ){ dataBlob.push("aa"+i); } return dataBlob; } _pressRow(rowID){ alert("hellow"+rowID); } _renderRow(rowData, sectionID, rowID){ return ( <TouchableOpacity onPress={()=>this._pressRow(rowID)}> <View> <Text>{"rowData:"+rowData+" rowId:"+rowID}</Text> <Item_MyListView info={rowData}></Item_MyListView> </View> </TouchableOpacity> ); } render(){ return ( <View style={{flex:1,}}> <ListView dataSource={this.state.dataSource} renderRow={this._renderRow.bind(this)}/> </View> ); } }
其中Item_MyListView只是隨意定義了一個(gè)組件,沒什么實(shí)際意義,就不再展示。
最終效果如下圖所示:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
React經(jīng)典面試題之倒計(jì)時(shí)組件詳解
這些天也都在面試,面試的內(nèi)容也大多千篇一律,無外乎vue、react這些框架的一些原理,和使用方法,但是也遇到些有趣的題目,這篇文章主要給大家介紹了關(guān)于React經(jīng)典面試題之倒計(jì)時(shí)組件的相關(guān)資料,需要的朋友可以參考下2022-03-03新建的React Native就遇到vscode報(bào)警解除方法
這篇文章主要為大家介紹了新建的React Native就遇到vscode報(bào)警解除方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10create-react-app安裝出錯(cuò)問題解決方法
這篇文章主要介紹了create-react-app安裝出錯(cuò)問題解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09react框架next.js學(xué)習(xí)之API?路由篇詳解
這篇文章主要為大家介紹了react框架next.js學(xué)習(xí)之API?路由篇詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09React?Native?中處理?Android?手機(jī)吞字的解決方案
這篇文章主要介紹了React?Native?中處理?Android?手機(jī)吞字的解決方案,作者在 React Native 0.67.4 環(huán)境下,編寫了一個(gè)小 demo 來復(fù)現(xiàn)這個(gè)問題,需要的朋友可以參考下2022-08-08React路由動(dòng)畫切換實(shí)現(xiàn)過程詳解
這篇文章主要介紹了react-router 路由切換動(dòng)畫的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2022-12-12