欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ReactNative列表ListView的用法

 更新時(shí)間:2017年08月02日 11:48:35   作者:蒼蠅小黑  
本篇文章主要介紹了ReactNative列表ListView的用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

最近在學(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ò)誤,如下所示:

復(fù)制代碼 代碼如下:

 <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í)組件詳解

    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)警解除方法

    這篇文章主要為大家介紹了新建的React Native就遇到vscode報(bào)警解除方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • create-react-app安裝出錯(cuò)問題解決方法

    create-react-app安裝出錯(cuò)問題解決方法

    這篇文章主要介紹了create-react-app安裝出錯(cuò)問題解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • react框架next.js學(xué)習(xí)之API?路由篇詳解

    react框架next.js學(xué)習(xí)之API?路由篇詳解

    這篇文章主要為大家介紹了react框架next.js學(xué)習(xí)之API?路由篇詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • React狀態(tài)提升案例介紹

    React狀態(tài)提升案例介紹

    這篇文章主要介紹了React狀態(tài)提升案例,所謂 狀態(tài)提升 就是將各個(gè)子組件的 公共state 提升到它們的父組件進(jìn)行統(tǒng)一存儲(chǔ)、處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-04-04
  • react redux入門示例

    react redux入門示例

    本篇文章主要介紹了react redux入門示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • React?Native?中處理?Android?手機(jī)吞字的解決方案

    React?Native?中處理?Android?手機(jī)吞字的解決方案

    這篇文章主要介紹了React?Native?中處理?Android?手機(jī)吞字的解決方案,作者在 React Native 0.67.4 環(huán)境下,編寫了一個(gè)小 demo 來復(fù)現(xiàn)這個(gè)問題,需要的朋友可以參考下
    2022-08-08
  • React路由動(dòng)畫切換實(shí)現(xiàn)過程詳解

    React路由動(dòng)畫切換實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了react-router 路由切換動(dòng)畫的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2022-12-12
  • React四級(jí)菜單的實(shí)現(xiàn)

    React四級(jí)菜單的實(shí)現(xiàn)

    本文主要介紹了React四級(jí)菜單的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • react實(shí)現(xiàn)自定義拖拽hook

    react實(shí)現(xiàn)自定義拖拽hook

    這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)自定義拖拽hook,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評(píng)論