ReactNative列表ListView的用法


Posted in Javascript onAugust 02, 2017

最近在学习ReactNative,本文介绍了ReactNative列表ListView的用法,分享给大家,也给自己留个笔记

ListView

在Android中,如果我们需要显示一个ListView,有两项是比不可少的,首先是ListView的数据源,其次是ListView每个item的样式。ReactNative中一样。首先我们来看一个简单的例子:

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()中,我们渲染一个ListView,在ListView的属性中,我们指定了dataSource和renderRow,这两个属性分别代表ListView的数据源和渲染的每一行。

dataSource

如果我们要创建一个数据源,最基本的方法就是创建一个ListView.DataSource数据源,然后通过cloneWithRows方法为其传递一个数组。

其中提供给数据源的rowHasChanged函数可以告诉ListView它是否需要重绘一行数据,即数据是否发生了改变,即在需要重绘界面的时候会进行判断,如果之前页面中的改行数据没有发生变化,则不再进行重绘,否则进行重绘。

如上述代码,我们对数据源设置数据时直接传入一个数组,当然我们也可以通过一个获取数据的方法,在设置数据的时候调用方法即可:

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;
  }

这样通过方法获取数据,方便我们进行一些逻辑的处理。

renderRow

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

该属性需要传入一个方法,该方法如上所示,他会从数据源中接受一条数据,以及他和他所在的section的Id,返回一个可渲染的组件来为这行数据进行渲染,默认情况下参数中的数据就是放进数据源中的数据本身,不过也可以提供一些转换器。

如果某一行正在被高亮(通过调用highlightRow函数),ListView会得到相应的通知。当一行被高亮时,其两侧的分割线会被隐藏。行的高亮状态可以通过调用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}
    />
   );
  },

因为renderRow中的方法会自动接受从数据源中的一条数据,因此我们可以通过调用外部方法的方式进行实现,同时只需要在外部方法的参数中传入我们需要从数据源中获取的数据即可,如上代码所示。

当我们需要实现比较复杂的布局时,也可以通过导入外部组件的方式作为ListView的每一行的样式。

例如我们自定义了一个组件Item_MyListView,我们需要在文件开头通过import方式将其导入到当前组件中:

import Item_MyListView from './Item_MyListView';

然后就可以通过导入的名称直接使用我们导入的组件了:

_renderRow(rowData, sectionID, rowID){
    return (
      <TouchableOpacity onPress={this._pressRow}>
        <View>
          <Text>{"rowData:"+rowData+"  rowId:"+rowID}</Text>
          <Item_MyListView></Item_MyListView>
        </View>
      </TouchableOpacity>
      );
  }

ListView的点击

当我们需要给ListView的每一行添加点击事件时,只需要在其外层包裹一层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属性中调用_renderRow一定要绑定this,否则onPress中的this就会指向错误,如下所示:

 <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只是随意定义了一个组件,没什么实际意义,就不再展示。

最终效果如下图所示:

ReactNative列表ListView的用法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS自动缩小超出大小的图片
Oct 12 Javascript
Node.js中使用计时器定时执行函数详解
Aug 15 Javascript
JavaScript中的闭包介绍
Mar 15 Javascript
js+css实现上下翻页相册代码分享
Aug 18 Javascript
用window.onerror捕获并上报Js错误的方法
Jan 27 Javascript
Javascript的表单验证-提交表单
Mar 18 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
May 24 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
Nov 14 Javascript
Nuxt 项目性能优化调研分析
Nov 07 Javascript
JavaScript实现点击出现子菜单效果
Feb 08 Javascript
ReactNative页面跳转Navigator实现的示例代码
Aug 02 #Javascript
利用JavaScript实现栈的数据结构示例代码
Aug 02 #Javascript
easyui-datagrid开发实践(总结)
Aug 02 #Javascript
js如何编写简单的ajax方法库
Aug 02 #Javascript
JavaScript实现无刷新上传预览图片功能
Aug 02 #Javascript
基于jquery实现多选下拉列表
Aug 02 #jQuery
基于LayUI分页和LayUI laypage分页的使用示例
Aug 02 #Javascript
You might like
德劲1107的电路分析与打磨
2021/03/02 无线电
php 阴历-农历-转换类代码
2012/01/16 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
Git命令之分支详解
2021/03/02 PHP
js变量以及其作用域详解
2020/07/18 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
Python 功能和特点(新手必学)
2015/12/30 Python
使用Python生成XML的方法实例
2017/03/21 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Python 获取div标签中的文字实例
2018/12/20 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
python实现五子棋小程序
2019/06/18 Python
通俗讲解python 装饰器
2020/09/07 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
实习心得体会
2014/01/02 职场文书
房地产融资计划书
2014/01/10 职场文书
光盘行动倡议书
2014/02/02 职场文书
优秀语文教师事迹
2014/05/18 职场文书
杭白菊导游词
2015/02/10 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技