最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ReactNative列表ListView的用法

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

最近在學(xué)習(xí)ReactNative,本文介紹了ReactNative列表ListView的用法,分享給大家,也給自己留個(gè)筆記

ListView

在Android中,如果我們需要顯示一個(gè)ListView,有兩項(xiàng)是比不可少的,首先是ListView的數(shù)據(jù)源,其次是ListView每個(gè)item的樣式。ReactNative中一樣。首先我們來(lái)看一個(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ù)源,然后通過(guò)cloneWithRows方法為其傳遞一個(gè)數(shù)組。

其中提供給數(shù)據(jù)源的rowHasChanged函數(shù)可以告訴ListView它是否需要重繪一行數(shù)據(jù),即數(shù)據(jù)是否發(fā)生了改變,即在需要重繪界面的時(shí)候會(huì)進(jìn)行判斷,如果之前頁(yè)面中的改行數(shù)據(jù)沒(méi)有發(fā)生變化,則不再進(jìn)行重繪,否則進(jìn)行重繪。

如上述代碼,我們對(duì)數(shù)據(jù)源設(shè)置數(shù)據(jù)時(shí)直接傳入一個(gè)數(shù)組,當(dāng)然我們也可以通過(guò)一個(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;
  }

這樣通過(guò)方法獲取數(shù)據(jù),方便我們進(jìn)行一些邏輯的處理。

renderRow

(rowData, sectionID, rowID, highlightRow) => renderable

該屬性需要傳入一個(gè)方法,該方法如上所示,他會(huì)從數(shù)據(jù)源中接受一條數(shù)據(jù),以及他和他所在的section的Id,返回一個(gè)可渲染的組件來(lái)為這行數(shù)據(jù)進(jìn)行渲染,默認(rèn)情況下參數(shù)中的數(shù)據(jù)就是放進(jìn)數(shù)據(jù)源中的數(shù)據(jù)本身,不過(guò)也可以提供一些轉(zhuǎn)換器。

如果某一行正在被高亮(通過(guò)調(diào)用highlightRow函數(shù)),ListView會(huì)得到相應(yīng)的通知。當(dāng)一行被高亮?xí)r,其兩側(cè)的分割線會(huì)被隱藏。行的高亮狀態(tài)可以通過(guò)調(diào)用highlightRow(null)來(lái)重置。

  _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ù),因此我們可以通過(guò)調(diào)用外部方法的方式進(jìn)行實(shí)現(xiàn),同時(shí)只需要在外部方法的參數(shù)中傳入我們需要從數(shù)據(jù)源中獲取的數(shù)據(jù)即可,如上代碼所示。

當(dāng)我們需要實(shí)現(xiàn)比較復(fù)雜的布局時(shí),也可以通過(guò)導(dǎo)入外部組件的方式作為L(zhǎng)istView的每一行的樣式。

例如我們自定義了一個(gè)組件Item_MyListView,我們需要在文件開(kāi)頭通過(guò)import方式將其導(dǎo)入到當(dāng)前組件中:

 import Item_MyListView from './Item_MyListView';

然后就可以通過(guò)導(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è)組件,沒(méi)什么實(shí)際意義,就不再展示。

最終效果如下圖所示:


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ReactJS中的自定義組件實(shí)例代碼

    ReactJS中的自定義組件實(shí)例代碼

    React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫(kù)。這篇文章主要介紹了ReactJS中的自定義組件的代碼講解,需要的朋友可以參考下
    2019-11-11
  • react?+?vite?+?ts項(xiàng)目中優(yōu)雅使用.svg文件

    react?+?vite?+?ts項(xiàng)目中優(yōu)雅使用.svg文件

    這篇文章主要為大家介紹了react?+?vite?+?ts項(xiàng)目中優(yōu)雅使用.svg文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • React中常用的一些鉤子函數(shù)總結(jié)

    React中常用的一些鉤子函數(shù)總結(jié)

    這篇文章給大家總結(jié)了React中常用的一些鉤子函數(shù),文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • ReactNative環(huán)境搭建的教程

    ReactNative環(huán)境搭建的教程

    這篇文章主要介紹了ReactNative環(huán)境搭建的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • react組件的創(chuàng)建與更新實(shí)現(xiàn)流程詳解

    react組件的創(chuàng)建與更新實(shí)現(xiàn)流程詳解

    React組件分為函數(shù)組件與class組件;函數(shù)組件是無(wú)狀態(tài)組件,class稱為類組件;函數(shù)組件只有props,沒(méi)有自己的私有數(shù)據(jù)和生命周期函數(shù);class組件有自己私有數(shù)據(jù)(this.state)和生命周期函數(shù)
    2022-10-10
  • React?狀態(tài)管理中的Jotai詳解

    React?狀態(tài)管理中的Jotai詳解

    Jotai是一個(gè)簡(jiǎn)單、靈活、高效的React狀態(tài)管理庫(kù),通過(guò)原子和派生狀態(tài)的設(shè)計(jì),使得狀態(tài)管理變得直觀和高效,它適用于小型應(yīng)用、組件庫(kù)和大型項(xiàng)目的局部狀態(tài)管理,且與TypeScript兼容,Jotai的社區(qū)正在壯大,提供了豐富的資源和支持,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • React Native項(xiàng)目中使用Lottie動(dòng)畫(huà)的方法

    React Native項(xiàng)目中使用Lottie動(dòng)畫(huà)的方法

    這篇文章主要介紹了React Native 實(shí)現(xiàn)Lottie動(dòng)畫(huà)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • 在?React?Native?中給第三方庫(kù)打補(bǔ)丁的過(guò)程解析

    在?React?Native?中給第三方庫(kù)打補(bǔ)丁的過(guò)程解析

    這篇文章主要介紹了在?React?Native?中給第三方庫(kù)打補(bǔ)丁的過(guò)程解析,有時(shí)使用了某個(gè)React Native 第三方庫(kù),可是它有些問(wèn)題,我們不得不修改它的源碼,本文介紹如何修改源碼又不會(huì)意外丟失修改結(jié)果的方法,需要的朋友可以參考下
    2022-08-08
  • 詳解react-router-dom v6版本基本使用介紹

    詳解react-router-dom v6版本基本使用介紹

    本文主要介紹了react-router-dom v6版本基本使用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 解決React報(bào)錯(cuò)React.Children.only expected to receive single React element child

    解決React報(bào)錯(cuò)React.Children.only expected to rece

    這篇文章主要為大家介紹了React報(bào)錯(cuò)React.Children.only expected to receive single React element child分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論

福建省| 开远市| 米泉市| 临桂县| 彭山县| 四子王旗| 毕节市| 牙克石市| 文成县| 巴塘县| 稻城县| 济源市| 南昌市| 呼和浩特市| 西安市| 尖扎县| 宜良县| 龙南县| 隆子县| 望江县| 甘南县| 阿拉善盟| 阿坝| 思茅市| 昌吉市| 沈丘县| 泽普县| 西充县| 太湖县| 衡阳县| 津南区| 巨野县| 平南县| 玛曲县| 南雄市| 买车| 浦江县| 凉山| 西藏| 逊克县| 沂源县|