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

这篇具有很好参考价值的文章主要介绍了微信小程序自定义tree组件,拿走直接用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工作原因,微信小程序需要一个功能类似于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图标,自己去矢量库下载就好 

微信小程序树形选择组件,微信小程序,微信小程序,notepad++,小程序,前端

以下是成品图

 微信小程序树形选择组件,微信小程序,微信小程序,notepad++,小程序,前端

 感谢大家!!!文章来源地址https://www.toymoban.com/news/detail-790864.html

到了这里,关于微信小程序自定义tree组件,拿走直接用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微信小程序】自定义组件(一)

    🎁 写在前面: 观众老爷们好呀,这里是前端小刘不怕牛牛频道,小程序系列文章又更新了呀。 今天牛牛带来的是微信小程序的自定义组件入门知识,赶紧拿起小本本做笔记呀! 1.1 介绍 自定义组件,就是开发者将页面的某个功能模块抽象化并提取出来的代码块,支持复用,

    2023年04月08日
    浏览(40)
  • 【微信小程序】自定义组件(二)

    🎁 写在前面: 观众老爷们好呀,这里是前端小刘不怕牛牛频道,小程序系列文章又更新了呀。 上文我们讲解了微信小程序自定义组件的入门知识,那么今天牛牛就来讲讲自定义组件的进阶知识吧,赶紧拿起小本本做笔记呀! 自定义组件的数据和方法在使用上,和 Vue 的组件

    2024年02月02日
    浏览(37)
  • 【微信小程序】自定义组件(三)

    插槽 1、什么是插槽 在自定义组件的wxml结构中,可以提供一个 solot 节点(插槽),用于承载组件使用者提供的wxml结构 2、单个插槽 在小程序中,默认每个自定义组件中只允许使用一个 slot 进行占位,这种个数上的限制叫做单个插槽。 3、定义多个插槽 父子组件之间的通信

    2024年02月04日
    浏览(34)
  • 【微信小程序】自定义组件(一)

    组件的创建与引用 1、创建组件 在项目的根目录中,鼠标右键,创建 components - test 文件夹 在新建的components - test文件夹上,鼠标右键,点击\\\"新建Component\\\" 键入组件的名称之后回车,会自动生成组件对应的4个文件,后缀名分别为 js, json, .wxml 和.Wxss 注意:为了保证目录结构的清

    2024年02月05日
    浏览(37)
  • 微信小程序自定义组件标签

    目录 前言 1.创建一个components文件夹,用来放自定义组件标签

    2024年02月10日
    浏览(81)
  • 【微信小程序】记一次自定义微信小程序组件的思路

    最近来个需求,要求给小程序的 modal 增加个关闭按钮,上网一查发现原来 2018 年就有人给出解决方案了,于是总结下微信小程序自定义组件的思路:一句话, 用 wxml + css实现和原生组件类似的样式和效果,之后用 JS 实现类似原生组件的功能。 比如 modal 组件,观察可以得出就

    2024年02月11日
    浏览(33)
  • 微信小程序之自定义组件

    目录 自定义组件 — 样式  自定义组件—数据、方法和属性 数据监听器 纯数据字段 组件的生命周期 组件所在页面的生命周期 数据监听器-案例 插槽 组件通信-父子组件之间的通信 ①在项目的根目录中,鼠标右键,创建 components - test 文件夹 ②在新建的 components - test 文件夹上

    2024年02月07日
    浏览(34)
  • 微信小程序-自定义组件的使用

    1.使用步骤 创建组件 注册组件 使用组件 1创建组件 通常将项目中的组件都放在一个独立的目录下,并且一般就给这个文件夹取名为:components 。 右键点击MyTest,点击新建Component,填写组件名之后会自动创建4个同名的文件. 注意: 组件和页面的结构是一致的,但也是有区别: 组件

    2024年02月03日
    浏览(30)
  • 微信小程序|自定义弹窗组件

    2024年02月12日
    浏览(29)
  • 微信小程序学习笔记(四)——自定义组件

    创建组件 在根目录下创建 components 文件夹 右键点击 components 文件夹,选择 新建 Component ,就会自动生成 .wxml、.wxss、.js、.json 文件 引用组件 组件的引用方式分为“ 局部引用 ”和“ 全局引用 ”,故名思义: 局部引用 :组件只能在当前被引用的页面内使用 全局引用 :组件

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包