接上文,剩下的展示工作是重中之重,首先确定节点的布局草稿——也就是如何render item:

在此之前还有一个重要的问题就是选择何种组件盛放展示子结点,一般有如下两种:

  1. 使用scrollview加载
  2. 使用FlatList/ListView加载

综合考虑之后,选择使用2模拟多级列表——即根据当前的层级(lelve)来确定节点的间距(paddingLeft)。

因此,展示的render函数如下:

 <FlatList
data={this.viewData.data}
keyExtractor={(item, index) => index}
renderItem={this._renderItem}
extraData={this.state}
ItemSeparatorComponent={this._separator}/>

注意上面的extraData={this.state},这是用来强制刷新FlatList,因为FLatList是继承自PureComponent,数据源不改变,那么item的状态不会改变,详情可以参考文档。

确定展示模型之后,着重要做的就是如何进行renderItem了,依据上面途中的规划,节点的布局很简单,在此不赘述。这里需要重点指出的就是如何确立item的属性:即从数据源data中的item如何转换成我们需要的item。本质上也就是为了如何使得组件更加通用,而不是仅仅限于项目使用。试想一下,一个基本的树节点需要有哪些属性,然后根据实际需求,需要添加/转换哪些属性:

首先子结点基本属性有要展示的文本text,展开关闭的状态open,是否选中的状态checked,以及子结点列表_sub_:

根据实际情况需要腹肌的属性,比如当前的所在的层级level,当前的主键key,父节点主键parentKey等。

确定以上item模型之后,我们就可以在构造函数中进行转换props中传来的data了:

    constructor(props) {
super(props); this.state = { }; this.viewData = this._initViewData(this.props.data, [...this.props.selectedItems] || []);
}

  

然后就是递归遍历所有的item,按照上图中规定的属性进行转换:

data.forEach((item, index) => {

            let key = this.props.onGetItemKey(item);
let checked = checkedItemKeys.includes(key); let newItem = this._createNewItem(level, index, checked, item, key, parentKey);
newItem._sub_ = this._getSub(item, level + 1, key, checkedItemKeys); newData.push(newItem);
});

  

_getSub通过this.props.onGetSubList(item)用来递归子结点生成_createNewItem,组装成新的数组。

这一部分完成后,剩下的工作就是处理事件了,比如选中状态的变化,需要递归改变子结点的状态,以及改变兄弟节点和父节点的状态(子结点全选以后父节点自动选中以及子结点取消选中一项以后,父节点需要变成取消的状态。),然后调用this.props.onItemSelect通知主界面。

最后,我们就可以愉快的展示数据了,伪代码如下:

 

 <TreeView ref={(treeView) => this.treeView = treeView}
data={this.viewData.JyFwData}
onGetItemDisplayText={(item) => {
return item.text;
}}
onItemSelect={(checked, item) => {
if (checked) {
this.viewData.result.push(item);
} else {
let index = this.viewData.result.findIndex(value => value.id== item.id);
if (index < 0) {
return;
} this.viewData.result.splice(index, 1);
}
}}
selectedItems={this.viewData.result}
onGetItemKey={(item) => item.key}
onGetSubList={(item) => item.subList}/>

  

React Native中树 TreeView 实现(2)的更多相关文章

  1. React Native中树 TreeView 实现(1)

    背景: 基于项目需要,在搜索第三方类库后没有很好的效果后决定动手实现. 开发环境: React Native 0.44 模型: 由于数据已经全部取出,不需要分级异步加载,故而只需要实现层级展示即可. ...

  2. 在 React Native 中使用 Redux 架构

    前言 Redux 架构是 Flux 架构的一个变形,相对于 Flux,Redux 的复杂性相对较低,而且最为巧妙的是 React 应用可以看成由一个根组件连接着许多大大小小的组件的应用,Redux 也 ...

  3. React Native 中 CSS 的使用

    首先声明,此文原作者为黎 跃春 React Native中CSS 内联样式 对象样式 使用Stylesheet.Create 样式拼接 导出样式对象 下面的代码是index.ios.js中的代码: / ...

  4. react native中的欢迎页(解决首加载白屏)

    参照网页: http://blog.csdn.net/fengyuzhengfan/article/details/52712829 首先是在原生中写一些方法,然后通过react native中js去 ...

  5. React Native中的网络请求fetch和简单封装

    React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...

  6. [转] 「指尖上的魔法」 - 谈谈 React Native 中的手势

    http://gold.xitu.io/entry/55fa202960b28497519db23f React-Native是一款由Facebook开发并开源的框架,主要卖点是使用JavaScrip ...

  7. [转] 在React Native中使用ART

    http://bbs.reactnative.cn/topic/306/%E5%9C%A8react-native%E4%B8%AD%E4%BD%BF%E7%94%A8art 前半个月捣腾了一下Rea ...

  8. react native中使用echarts

    开发平台:mac pro node版本:v8.11.2 npm版本:6.4.1 react-native版本:0.57.8 native-echarts版本:^0.5.0 目标平台:android端收 ...

  9. react native中一次错误排查 Error:Error: Duplicate resources

    最近一直在使用react native中,遇到了很多的坑,同时也学习到了一些移动端的开发经验. 今天在做一个打包的测试时,遇到了一个问题,打包过程中报错“Error:Error: Duplicate ...

随机推荐

  1. PDFRender4NET的使用之pdf转图片

    同样的需要第三方的.dll,http://www.o2sol.com/pdfview4net/download.htm using O2S.Components.PDFRender4NET; usin ...

  2. 混合式App开发 Apicloud 官方iPhone X 适配

    iPhone X 适配 由于iPhone X的特殊造型,为了方便开发者对iPhone X进行适配,苹果在iOS 11中引入了Safe Area的概念,引擎也在api对象下添加了safeArea属性和s ...

  3. openjudge-NOI 2.6-1775 采药

    题目链接:http://noi.openjudge.cn/ch0206/1775/ 题解: 很经典的01背包问题,设时间为t,价值为v 一维压缩,状态转移方程fj=max(fj,fj-ti+vi) # ...

  4. 设计模式--工厂模式 caffe_layer注册

    来源:http://www.cnblogs.com/zhouqiang/archive/2012/07/20/2601365.html 来源:http://blog.luoyetx.com/2016/ ...

  5. Percona XtraDB Cluster(PXC) -集群环境安装

    Percona XtraDB Cluster(PXC)   ---服务安装篇   1.测试环境搭建: Ip 角色 OS PXC-version 172.16.40.201 Node1 Redhat/C ...

  6. CSS3中的矩阵

    CSS3中的矩阵 CSS3中的矩阵指的是一个方法,书写为matrix()和matrix3d(),前者是元素2D平面的移动变换(transform),后者则是3D变换.2D变换矩阵为3*3,如下面矩阵示 ...

  7. UI自动化的痛点

    解决UI自动化难点痛点: 解决从安装过程中跳出的提示框以及操作过程中任意提示框的操作,来提高用例成功率: 公用用例及业务用例分离,便于维护和多人使用,提高脚本编写效率: 解决用android wind ...

  8. php极速后台开发框架LotusAdmin

    组件:基于thinkphp5.0.12+layui2.1版本 演示站点:https://www.lotusadmin.top/账号 : admin密码:123456 官方QQ交流群:606645328 ...

  9. 【LOJ】#2129. 「NOI2015」程序自动分析

    题解 开始是想两个并查集的 和A相等,和A不相等 如果AB相等就连 A 相等,B相等 B不相等 A不相等 如果AB不相等就连 A不相等,B相等 B相等,A不相等 但是显然不对,因为和A不相等的不一定和 ...

  10. oracle创建简单的包

    --规范 create or replace package test_pkg is --test_pkg为包名 procedure showMessage; --声明一个过程 function my ...