H5有很多树形图(树状图)的组件,echarts也有。比如像bootstrap的treeview,定制性很强。不过这些都无法方便地为小程序所用,除非整个页面用H5搭建再用webview框进去,有点粗暴。所以还是自己写一个简单的树形图组件试试。最终效果如下:

新建一个微信小程序项目,在app.jsonpages里添加这么一行,
"pages":[
"pages/index/index",
"pages/logs/logs",
"pages/components/mytree/mytree"
],

ctrl+s或者ctrl+b一下,小程序就自动生成了mytree的文件目录了,相信熟悉小程序开发的都知道。

首先修改mytree.json

{
"component": true,
}

这表示要开发一个组件(小程序官方说,也能当普通页面使)。
我们使用的树数据treeData将是类似这样的,text字段用于显示,id字段用于点击事件传递数据,nodes就是下一层节点。

var treeData = {
text: 'My Tree',
id: 0,
nodes: [
{
text: 'Parent 1',
id: 1,
nodes: [
{
text: 'Child 1',
id: 2,
nodes: [
{
text: 'Grandchild 1',
id: 3,
},
{
text: 'Grandchild 2',
id: 4,
},
]
},
{
text: 'Child 2',
id: 5,
}
]
},
{
text: 'Parent 2',
id: 6,
nodes: [
{
text: 'Child 1',
id: 7,
},
{
text: 'Child 2',
id: 8,
}
]
}
]
}

先写mytree.wxml,比较简单,model是后面绑定的属性值,也就是树的数据,待会儿看mytree.js就明白了。

<!-- pages/components/mytree/mytree.wxml-->
<view>
<view>
<text wx:if='{{ isBranch }}' bindtap='toggle'>{{ open ? '[ - ]' : '[ + ]' }} </text>
<text wx:else>[ · ] </text>
<text bindtap='tapItem' data-itemid='{{ model.id }}'>{{ model.text }}</text>
</view>
<view style='padding-left: 50rpx;' wx:if='{{ isBranch }}' hidden='{{ !open }}'>
<mytree wx:for='{{ model.nodes }}' wx:key='id' model='{{ item }}'></mytree>
</view>
</view>

这里最关键的是使用了一个递归,也就是组件里使用了组件自己,那就需要回头修改一下mytree.json,如下:

{
"component": true,
"usingComponents": {
"mytree": "../mytree/mytree"
}
}
再看看mytree.js,内容也不多,在data里加了openisBranch来判断当前节点是否是树枝(相对于树叶)、是否展开,其它没多少要解释的,一开始我也想把这两个字段加到model里面去,好像不方便进行setData,读者可以自己试试。
需要说明的是,triggerEvent方法里需要添加选项设置:
this.triggerEvent('tapitem', { nid: nid }, { bubbles: true, composed: true })

不然调用组件的节点接收不到递归里面的事件触发。

// pages/components/mytree/mytree.js
Component({
properties: {
model: Object,
}, data: {
open: false,
isBranch: false,
}, methods: {
toggle: function(e) {
if (this.data.isBranch) {
this.setData({
open: !this.data.open,
})
}
}, tapItem: function(e) {
var itemid = e.currentTarget.dataset.itemid;
console.log('组件里点击的id: ' + itemid);
this.triggerEvent('tapitem', { itemid: itemid }, { bubbles: true, composed: true });
}
}, ready: function(e) {
this.setData({
isBranch: Boolean(this.data.model.nodes && this.data.model.nodes.length),
});
console.log(this.data);
},
})

最后看看使用组件,直接把index.html清空用来测试,相关的几个文件代码如下:

<!--index.wxml-->
<view>
<view class='up'>--------------</view>
<mytree model='{{ treeData }}' bind:tapitem='tapItem'></mytree>
<view class='down'>--------------</view>
</view>

index.json如下:

{
"usingComponents": {
"mytree": "../components/mytree/mytree"
}
}

index.js如下,记得把前文的treeData贴上:

Page({
data: {
treeData: treeData,
},
//事件处理函数
tapItem: function (e) {
console.log('index接收到的itemid: ' + e.detail.itemid);
}, onLoad: function () { },
})

转载:https://www.jianshu.com/p/dabca0161993

微信小程序实现简单的树形图treeview的更多相关文章

  1. 微信小程序支付简单小结与梳理

    前言 公司最近在做微信小程序,被分配到做支付这一块,现在对这一块做一个简单的总结和梳理. 支付,对于购物来说,可以说是占据了十分重要的一块,毕竟能收到钱才是重点. 当然在开发之前,我们需要有下面这些东 ...

  2. [转]微信小程序支付简单小结与梳理

    本文转自:https://www.cnblogs.com/onetwo/p/6667424.html 公司最近在做微信小程序,被分配到做支付这一块,现在对这一块做一个简单的总结和梳理. 支付,对于购物 ...

  3. 微信小程序_简单组件使用与数据绑定

    简单的数据传值 官方文档:传送门 点击"按钮"测试后,按钮文本改变,下方text文本改变,通过console.log()在输出台中打印按钮文本信息 程序结构 Page({ //页面 ...

  4. 微信小程序实现简单的2048

    这两天心血来潮,用微信小程序写了一个简单的2048,欢迎各位老铁围观,提出宝贵意见.这里我从0到1赘述一下个人实现流程: 首先去微信公平台(https://mp.weixin.qq.com/)注册一个 ...

  5. 微信小程序之简单记账本开发记录(七)

    记账本已经可以实现添加和删除的功能 现在只需要将上述步骤重复一遍便可将另一个界面做出来. 大体上已制作完成,如果在细节上有变动会在这一篇更新 总体来说,这个作业让我对微信小程序的开发有了更多地认识,大 ...

  6. 微信小程序之简单记账本开发记录(一)

    下载并安装微信开发者工具 在选择开发记账本程序的时候犹豫着选择android studio还是微信小程序 最后选择了微信小程序,因其便利和快捷. 话不多说,第一步,下载并安装微信开发者工具.下面是教程 ...

  7. 微信小程序之简单记账本开发记录(二)

    1.打开开发者工具 2.从微信公众平台上获取到appid,或者使用测试号. 项目的大致目录如下: 一个小程序主体部分由三个文件组成,必须放在项目的根目录中 以app为开头的文件名用来布置作用于整个项目 ...

  8. 微信小程序一些简单的快捷键

    常用快捷键 格式调整 Ctrl+S:保存文件Ctrl+[, Ctrl+]:代码行缩进Ctrl+Shift+[, Ctrl+Shift+]:折叠打开代码块Ctrl+C Ctrl+V:复制粘贴,如果没有选 ...

  9. 微信小程序 table 简单测试

    <view class='AutoTable'> <view id='AutoTableItem'> <block wx:for="{{array}}" ...

随机推荐

  1. Unity3D 优化NGUI纹理

    原理就是将一张rgba 32的分成两张纹理:一张平台压缩不带alpha和一张为原图1/4大小的压缩图存储alpha信息(用r分量当alpha值),然后修改原材质的Shader传入这两张纹理. 代码如下 ...

  2. 【win10】更改资源管理器显示:快速访问和此电脑

    通常,我习惯通过按 win+E来打开资源管理器,然后显示各个分区并进行操作.在win10打开资源管理器默认显示的是快速访问,并不是显示的分区.下面是修改步骤. 1.按Win+E打开资源管理器,点击[查 ...

  3. Spring学习笔记--Spring配置文件和依赖注入

    Spring配置文件 1.alias:设置别名,为bean设置别名,并且可以设置多个别名; <!-- 设置别名 --> <alias name="user" al ...

  4. mysql常用语句和函数

    mysql语句如果长期不写,就会忘掉,所以要时常复习,温故而知新. 1.select length("中国人"),select char_length("中国人" ...

  5. How to view assertions in the Verdi waveform viewer

    In the Cadence Simvision waveform viewer, I can see every assertions listed as a hierarchical signal ...

  6. MVC 二级联动

    后台代码,获取数据如下: /// <summary> /// 获取省份 /// </summary> public JsonResult GetProvincelist() { ...

  7. Codeforces 1108D - Diverse Garland - [简单DP]

    题目链接:http://codeforces.com/problemset/problem/1108/D time limit per test 1 secondmemory limit per te ...

  8. GPU安装小结

    今天一起安装了4块1080的卡.也算有一些坑吧,记录一下. 1)1080显卡,驱动型号,tensorflow,cuda, cudnn 版本一定要一致.我的清单如下: ################# ...

  9. let 与 const 的用法

    let 与 const 的用法 let 用来声明变量,并且会在当前作用域形成 代码块 conts 用来声明常量,所谓常量就是物理指针不可以更改的变量. 所谓代码块,最简单的做法就是(这个 {} 就是一 ...

  10. httpclient发送接受请求

    需要注意三部分,request和参数的处理,响应数据.与请求相关的dll是System.Net. 核心代码: private string Post(string requestUrlString, ...