微信小程序自定义tree组件,拿走直接用

2023-11-19

工作原因,微信小程序需要一个功能类似于elemenui中的tree组件,找了好多ui组件库没有能直接用的,最后自己写了一套,封装成组件,中心技术是组件本身递归,只需要在父级页面传“树列表数据”和“选中的节点id”就可以用了。

tree组件

tree.wxml

<!--common/tree/tree.wxml-->
<view wx:for="{{tree}}" wx:key="deptId">
  <!-- 一级 -->
  <view style="margin-left: {{treeListIndex*24}}rpx" >
    <view  class="tree-item">
      <view bindtap="isOpen" data-index="{{index}}" wx:if="{{item.children && item.children.length > 0 || item.userList && item.userList.length>0}}" class="iconfont {{item.open ? 'icon-out' : 'icon-in'}}" style="color: #E6A23C;"></view>
      <view class="iconfont icon-in" wx:else style="color: #E6A23C;"></view>
      <view class="tree-item-name" >
        <text class="tree-item-title">{{item.deptName}}</text>
      </view>
    </view>
    <view wx:if="{{item.userList && item.userList.length>0 && item.open}}" class="tree-user-item" >
      <view wx:for="{{item.userList}}" wx:key="userId" class="tree-user-item-item" catchtouchmove="preventD" catchtap="select" data-item="{{item}}" data-index="{{index}}">
        <view class="tree-user-avater-item" >
          <view>{{item.nickName}}</view>
          <view>{{item.nickName}}</view>
        </view>
        <view class="iconfont icon-selin" wx:if="{{item.status == 1}}" style="color: #2677FC;"></view>
        <view class="iconfont icon-selout" wx:if="{{item.status == 0}}"></view>
      </view>
    </view>
  </view>
  <tree wx:if="{{item.children && item.children.length > 0 && item.open }}" ids="{{ ids }}"  treeData='{{ item.children }}' bind:getIds="nodeGetIds" data-index="{{index}}" data-node="{{item.children}}"  isOpenAll="{{true}}" treeListIndex="{{treeListIndex+1}}" />
</view>

tree.js

// common/tree/tree.js
const app = getApp()
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    treeData: {
      type: Array,
      value: []
    },
    ids: {
      type: Array,
      value: [],
    },
    treeListIndex: {
      type: Number,
      value: 1
    },
    isOpenAll: { // 是否展开全部节点
      type: Boolean,
      value: true
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    tree: [],
  },
  observers: {
    'treeData':function(params) {
      this.setData({
        tree: this._init(params)
      })
    },
    'ids':function(params) {
      this.setData({
        tree: this._uploadTree(params, this.data.tree)
      })
    },
  },
  /**
   * 组件的方法列表
   */
  methods: {
    isOpen(e) {
      const open = 'tree[' + e.currentTarget.dataset.index + '].open'
      this.setData({
        [open]: !this.data.tree[e.currentTarget.dataset.index].open
      })
    },
    _init(node) {
      let that = this;
      node.forEach(element => {
        if(element.checked == undefined) element.checked = 0;
        element.open = this.properties.isOpenAll;
        if(element.children && element.children.length > 0) element.children = this._init(element.children)
      })
      return node
    },
    _uploadTree(ids, tree){
      tree.forEach(element => {
        if(element.userList && element.userList.length > 0) {
          element.userList.forEach(r => {
            if(ids.indexOf((Number(r.userId))) > -1) {
              r.status = 1
            } else {
              r.status = 0
            }
          })
        }
      })
      return tree
    },
    // 选择
    select(e) {
      let item = e.currentTarget.dataset.item
      this.triggerEvent('getIds', item.userId)
    },
    nodeGetIds(e) {
      this.triggerEvent('getIds', e.detail)
    }
  }
})

tree.wxss

/* common/tree/tree.wxss */
@import "/utils/iconFont.wxss";
.tree-item{
  display: flex;
  align-items: center;
  margin: 10rpx 0;
}
.tree-item-name{
  margin-left: 20rpx;
}
.tree-item-title{
  font-size: 32rpx;
  color: #303133;
}

.tree-user-item{
  /* display: flex;
  align-items: center; */
  margin: 20rpx 0;
  box-sizing: border-box;
}
.tree-user-item-item{
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin: 30rpx 0;
}
.tree-user-avater-item{
  display: flex;
  align-items: center;
  font-size: 32rpx;
  color: #303133;
}
.tree-user-avater-item>view:nth-of-type(1) {
  width: 64rpx;
  height: 64rpx;
  border-radius: 50%;
  font-size: 26rpx;
  color: #fff;
  text-align: center;
  line-height: 64rpx;
  margin-right: 10rpx;
  background-color: #2677FC;
}

tree.json

{
  "component": true,
  "usingComponents": {
    "tree": "/common/tree/tree"
  }
}

父级页面

sel-people.wxml

<tree treeData="{{treeData}}" ids="{{ids}}" treeListIndex="{{1}}" isOpenAll="{{true}}" bind:getIds="getIds"></tree>

sel-people.json

{
  "usingComponents": {
    "tree": "/common/tree/tree"
  }
}

sel-people.js

// pages/sel-people/sel-people.js
const app = getApp()
Page({

  /**
   * 页面的初始数据
   */
  data: {
    contentHeight: app.globalData.contentHeight,
    navColor: '#fff',
    title: '',
    backStatus: true,
    // 模拟接包时候的json数据
    treeData: [
        {
            "deptId": "1", 
            "deptName": "经建", 
            "userList": [
                {
                    "userId": 1, 
                    "userName": "admin", 
                    "nickName": "管理员"
                }, 
                {
                    "userId": 2, 
                    "userName": "corner", 
                    "nickName": "星辰"
                }
            ], 
            "children": [
                {
                    "deptId": "2", 
                    "deptName": "弘德云", 
                    "userList": [
                        {
                            "userId": 3, 
                            "userName": "admin1", 
                            "nickName": "管理员1"
                        }, 
                        {
                            "userId": 4, 
                            "userName": "corner1", 
                            "nickName": "星辰1"
                        }
                    ], 
                    "children": [
                      {
                        "deptId": "3", 
                        "deptName": "招投标", 
                        "userList": [
                          {
                            "userId": 5, 
                            "userName": "admin1", 
                            "nickName": "管理员2"
                        }, 
                        {
                            "userId": 10, 
                            "userName": "corner1", 
                            "nickName": "星辰2"
                        }
                        ]
                      }
                    ]
                }
            ]
        }
    ],
    ids: [1]
  },
    
  getIds(e) {
// 判断tree组件传过来的id,选中or未选中
    let id = e.detail
    if(this.data.ids.indexOf(Number(id)) > -1) {
      this.data.ids.splice(this.data.ids.indexOf(Number(id)), 1)
    } else {
      this.data.ids.push(Number(id))
    }
    this.setData({
      ids: this.data.ids
    })
    console.log(this.data.ids)
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
  },

})

以下是tree组件需要的icon图标,自己去矢量库下载就好 

以下是成品图

 

 感谢大家!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序自定义tree组件,拿走直接用 的相关文章

  • 计算机Java项目|springboot校园台球厅人员与设备管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 如何在 Python 脚本中使用 Google OAuth2

    在使用 Python 脚本将视频上传到 YouTube 频道时 若希望将视频上传到第二个频道 需要解决 OAuth2 授权的问题 解决方案 创建新的 Google Cloud 项目 from google oauth2 import ser
  • 如何离线安装Notepad++插件?

    我正在尝试安装 Notepad 插件Plugins gt Plugin Manager 但我的办公室防火墙限制其下载 有没有其他方法可以离线安装插件 以下是对我有用的步骤 Download https sourceforge net pro
  • 在Notepad++中选择换行符

    我注意到 当我加载文本文件时 Notepad 将识别并使用该文件中的任何换行符 n or r n 是否有一些选项可以让我选择默认情况下用于新文档的选项 我查看了帮助并用谷歌搜索 但找不到任何东西 对于任何新文档 Settings gt Pr
  • 从 C# 应用程序打开 txt 文件

    以下代码假设从我的 C 应用程序打开 CMD 并打开文件 text txt 我尝试将文件路径设置为环境变量 但是当记事本打开时 它会查找 file txt 而不是 text txt 知道为什么吗 System Diagnostics Pro
  • 更改文本文件编码

    如何通过代码更改文本文件编码 我正在使用此代码实际创建文件本身 但如何更改编码 更改为 UTF 8 w o BOM string path E Test Example txt if File Exists path File Create
  • 在 Notepad ++ 中双击捕获 PHP 变量

    我刚刚从 eclipse 切换到 Notepad 并修改了记事本的一些行为 但仍有一个未解决 当我双击一个变量时 我希望我的编辑器能够捕获整个变量 记事本自动排除 php 前缀 效率不高 有什么办法可以改变我的行为吗 谢谢 从版本 7 3
  • 如何在 Notepad++ 中自动更改 XHTML 结束标签

    如果之前有人问过这个问题 我深表歉意 但我不相信有人明确提出过这个问题 导致 stackoverflow 上出现很多混乱 我正在使用 Notepad v6 6 9 我正在寻找自动更改结束语的方法当我想 稍后 更改我的开始元素标签时 例如 如
  • 正则表达式在字符串中查找单词,替换新字符串中的单词(使用 Notepad++)

    我之前发布了这个问题的简化版本 但我认为我可能已经简化了太多 所以这里是实际的问题 我想使用正则表达式 在 Notepad 或类似的程序中 在下面找到 a dog 抱歉墙
  • Notepad++ 可以配置为识别编译器错误消息并跳转到相应的位置吗?

    我正在一台没有 IDE 但使用 Notepad 的机器上构建一些相当大的代码 编译结果被重定向到一个文件 有时会有错误消息 满足定义良好的正则表达式 我想知道 NPP 是否有一个插件 它可以解析日志文件 识别错误 警告消息 并让我在相应的错
  • Notepad++ 的整洁 CSS

    是否有某种 CSS 整洁可用于 Notepad 我已经尝试了 TEXTFX 中似乎每个菜单项 但似乎没有一个能做到这一点 我习惯使用 PSPAD 只需选择 CSS 并单击 重新格式化为结构化 CSS EDIT在问这个问题很长时间后发现了一个
  • 如何在 Notepad++ 中使用富文本?

    我喜欢Notepad 但有时我需要将一些单词设置为粗体或草书 更改字体大小等 在 Notepad 中可以吗 我们可以突出显示文本 右键单击文本Style Token gt Using 1st Style通过使用这个我们可以突出显示文本 最多
  • VS2015 或 NP++ 中的多行正则表达式

    我需要在多个文件中替换以下模式 this dialogs 当我设置时这工作正常single line在这里标记 https regex101 com r dF2yG3 2 https regex101 com r dF2yG3 2 但是我无
  • 如何在 Notepad++ 中禁用“shift”+“alt”键盘快捷键

    The shortcut Shift Alt changes the keyboard configuration 如何禁用此快捷方式 我搜索了快捷方式地图 但没有找到 那肯定是 Windows IME 快捷方式 它可能与 Notepad
  • 如何更改 Notepad++ 更改文本行的背景颜色?

    更新 未保存 的文本行有亮粉色 ffc286 背景色 更改和保存的文本行有亮绿色 b5ffb5 此背景对于任何颜色样式都是相同的 我在样式配置器中找不到它 我以为它可能是增量突出显示 但事实并非如此 并且它不在全局设置中 我已经在寻找这个值
  • 如何在Notepad++中将大写字母转换为小写字母

    我主要使用 Notepad 进行编码 如何将大写字母转换为小写字母 反之亦然 只需选择要更改的文本 右键单击并根据需要选择大写或小写
  • 正则表达式替换记事本++中的html空格和前导空格

    我尝试使用以下正则表达式来删除 html 空格和前导空格 Find s lt gt s Replace 1 但每次执行此操作时 我的文档中都会出现 186 次 1 字面意思 任何帮助将不胜感激 这是我正在谈论的一个例子 This field
  • 通过键盘快捷键重新缩进 XML

    我正在浏览数百个 xml 文件 当我在记事本 中打开它们时 我必须对每个文件执行 HTML Tidy gt re indent XML 对于一个文件来说 这一步骤并不会花费太长的时间 但是加起来就会产生很多很多的文件 有没有办法将其放在记事
  • 复制带有格式的 Notepad++ 文本?

    我正在使用 Notepad 来编写代码 如何复制 Notepad 中的代码及其格式以粘贴到 Microsoft Word 中 即语法突出显示等 这是当您选择要复制为 html 的文本时来自 notepad 的图像 and how the f
  • Notepad++ 添加到每一行

    我正在使用 Notepad 但我无法弄清楚 我有很多行都以http 我需要在每一行的前面添加一些文本 另外 我需要在每行末尾添加不同的文本 每行的结尾都不同 将文本添加到每行的开头和结尾的最快方法是什么 按着这些次序 Press Ctrl

随机推荐

  • mysql的主键规则_MySQL主键(PRIMARY KEY)

    主键 PRIMARY KEY 的完整称呼是 主键约束 MySQL 主键约束是一个列或者列的组合 其值能唯一地标识表中的每一行 这样的一列或多列称为表的主键 通过它可以强制表的实体完整性 选取设置主键约束的字段 主键约束即在表中定义一个主键来
  • Python如何执行shell脚本

    Python如何执行shell脚本 自从出了Pyhon3 5之后 os模块下的system os popen 基本被废弃了 因此如下只介绍2种方式 一 使用commands模块 有三个方法可以使用 1 commands getstatuso
  • wireshark 实用过滤表达式

    wireshark 实用过滤表达式 针对ip 协议 端口 长度和内容 1 关键字 与 eq 和 等同 可以使用 and 表示并且 或 or 表示或者 非 和 not 都表示取反 多组条件联合过滤数据包的命令 就是通过每个单个的条件命令与关键
  • python教程29-继承的基本使用、继承的注意事项、类方法和静态方法回顾、私有属性的继承特点、新式类和经典类

    python教程 小白入门2021 4 5 学习目标 文章目录 python教程 小白入门2021 4 5 P 168 继承的基本使用 P169 继承的注意事项 P170 类方法和静态方法回顾 P171 私有属性的继承特点 P172 新式类
  • 干货:Java正确获取客户端真实IP方法整理

    在JSP里 获取客户端的IP地址的方法是 request getRemoteAddr 这种方法在大部分情况下都是有效的 但是在通过了Apache Squid等反向代理软件就不能获取到客户端的真实IP地址了 如果使用了反向代理软件 将http
  • Leetcode.406 经典算法题:根据身高重建队列

    假设有打乱顺序的一群人站成一个队列 数组 people 表示队列中一些人的属性 不一定按顺序 每个 people i hi ki 表示第 i 个人的身高为 hi 前面 正好 有 ki 个身高大于或等于 hi 的人 请你重新构造并返回输入数组
  • 使用Idea更新数据库表的数据

    tags IDEA 我们在做案例的时候 经常需要改变数据表中的数据来进行简单测试 那我们在Idea下是如何修改数据表的数据的呢 我们可以看下面的图片 只要选择updata就行了 后面再按自动提交的标志 如果您觉得这篇文章帮助到了您 可以给作
  • JavaWeb05(删除&增加&修改功能实现&连接数据库)

    目录 一 实现删除功能 1 1 url如何传参 xx do 参数 参数值 参数名 参数值 1 2 servlet如何拿对应值 根据参数名拿到对应的参数值 String str req getParameter 参数名 1 3 如何询问 nc
  • sql: paging in SQL Server

    sql server 2012 及以上 涂聚文 Geovin Du geovindu 注 SELECT FROM BookKindList ORDER BY SELECT NULL OFFSET 0 ROWS FETCH NEXT 3 RO
  • 数学建模4 论文写作排版和技巧

    文字 标题一 四号黑体 标题二 三 小四号黑体 正文 宋体小四 行距1 5 标题前后空0 5行 英文和数字使用Times New Roman 小四 包括表格中的内 表头在表格上方 需写成 表1 什么什么表 黑体小五加粗 居中 图名在图下 需
  • Saas-Export项目之部门数据回显(下拉框和单选框回显)

    Saas Export项目之部门数据回显 之前的经验 做数据回显一般就是在数据修改时需要查询出这条信息 然后再将数据拆分每一项逐一赋值在表单上 通常赋值就行 而且都是input type text这种类型的 所有只要在input里增加val
  • 推荐 4 个本月火火火的开源项目

    本期推荐开源项目目录 1 开源的 AI 生成图像 APP 2 属于你的微信聊天机器人 3 好玩的 Windows 桌面应用 4 Windows 12 网页版 01 开源的 AI 生成图像 APP 该开源项目技术栈基于 Next js Cha
  • 与Miriam Suzanne一起进行Sass,Susy,单元测试和寻找声音

    In this episode of the Versioning Show Tim and David are joined by Miriam Suzanne best known for Susy a responsive layou
  • jmockit使用(一) —— mock 系统时间

    一 mock工具被广泛的应用于单测中 尤其是当测试环境系统依赖的外部项较多 而且不受控制时 jmockit一般有2种方式 一种是基于行为的方式 使用者在单测类中写 Expectations 里面放置 预期 会被执行的代码段和返回 这就是一种
  • 12款最常使用的网络爬虫工具推荐

    网络爬虫在当今的许多领域得到广泛应用 它的作用是从任何网站获取特定的或更新的数据并存储下来 网络爬虫工具越来越为人所熟知 因为网络爬虫简化并自动化了整个爬取过程 使每个人都可以轻松访问网站数据资源 使用网络爬虫工具可以让人们免于重复打字或复
  • VTK7.1.1+VS2017+QT的安装与配置

    本文转载自 https blog csdn net hebbely article details 81067505 简述 为了实现RealSense的PCL点云显示 需要VTK支持 由于整个平台在Qt环境实现 VTK编译为Qt插件 QVT
  • YOLO v5 引入解耦头部

    YOLO v5 引入解耦头部 最近想开个 深度学习模型搭建 opencv方面的训练营 有兴趣可以私聊我 文章目录 YOLO v5 引入解耦头部 前言 一 解耦头部示意图 二 在YOLO v5 中引入解耦头部 1 修改common py文件
  • Sqlite3 常见几种数据插入方式性能比较

    include
  • 【读写锁 ReadWriteLock 结合 LinkedHashMap】

    import java util LinkedHashMap import java util Map import java util concurrent locks ReadWriteLock import java util con
  • 微信小程序自定义tree组件,拿走直接用

    工作原因 微信小程序需要一个功能类似于elemenui中的tree组件 找了好多ui组件库没有能直接用的 最后自己写了一套 封装成组件 中心技术是组件本身递归 只需要在父级页面传 树列表数据 和 选中的节点id 就可以用了 tree组件 t