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库(迷你版)--自建js库总结
Nov 21 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
Jan 07 Javascript
hovertree插件实现二级树形菜单(简单实用)
Dec 28 Javascript
前端常见跨域解决方案(全)
Sep 19 Javascript
微信小程序url与token设置详解
Sep 26 Javascript
微信小程序用户自定义模版用法实例分析
Nov 28 Javascript
js比较两个单独的数组或对象是否相等的实例代码
Apr 28 Javascript
Vue多环境代理配置方法思路详解
Jun 21 Javascript
jquery插件开发模式实例详解
Jul 20 jQuery
js布局实现单选按钮控件
Jan 17 Javascript
Node 模块原理与用法详解
May 13 Javascript
vue使用nprogress加载路由进度条的方法
Jun 04 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
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
不安全的常用的js写法
2009/09/15 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
js中eval详解
2012/03/30 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
jquery实现抽奖功能
2020/10/22 jQuery
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python实现的防DDoS脚本
2011/02/08 Python
Python检测网站链接是否已存在
2016/04/07 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
python中的global关键字的使用方法
2019/08/20 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
python中如何进行连乘计算
2020/05/28 Python
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
药学专业大学生个人的自我评价
2013/11/04 职场文书
个人安全生产责任书
2014/07/28 职场文书
社保委托书怎么写
2014/08/02 职场文书
股东合作协议书
2014/09/12 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书