自定义基于elementui的仿QQ邀请成员进群树图模糊搜索组件可实现默认选中部分选项,删除选项,搜索展示子节点

本文介绍了一款基于ElementUI的自定义树图组件,用于实现成员权限管理功能。该组件支持模糊搜索、多选和查询,并可在模态窗口中使用。

需求:项目经理要求实现一个类似QQ成员系统管理的组件来进行成员系统权限的添加,可多选可查询,本来想用elementui树图组件,但是elementui树图搜索父节点却没展示子节点,于是在之前改过elementui组件一波三折后直接自己上手写了个组件,本组件树还是引用了elementui的树图组件,因此请在vue项目中添加入element-ui,本组件可嵌入模态弹框中

github地址:https://github.com/applebring/dir-elementui-tree

本组件实现后界面(可在dirtree.vue中根据需要更改组件及样式)

模糊匹配如下

该组件属性及方法如下:

引入方式:

下载github上面的文件,找到src下plugin下的dirtree.vue文件,将其作为组件导出并引入,如下

import dirTree from "../plugin/dirtree.vue";

(main.vue)

<template>
  <div>
    <div class="title">自定义基于elementui的树图组件</div>
    <div class="tree-container">
      <dir-tree :dataarr="data" :defaultchecked='defaultChecked' :defaultsel="defaultsel" @tree-submit="submitData" :visibledismiss="false"></dir-tree>
    </div>
    <el-button type="primary" @click="openModal">通过模态框打开</el-button>
    <el-dialog title="树图组件" :visible.sync="outerVisible">
      <dir-tree :dataarr="data2" :defaultchecked='defaultChecked2' :defaultsel="defaultsel2" @tree-submit="submitData2" @close-modal="closeModal" :visibledismiss="true"></dir-tree>
    </el-dialog>
  </div>

</template>


<script>
import dirTree from "../plugin/dirtree.vue";
//必备属性:dataarr(加载树图的数据) defaultchecked(树图加载默认选中项)
export default {
  data() {
    return {
      data: [
        {
          id: 1,
          label: "一级 1",
          searchtext: "一级1",
          children: [
            {
              id: 4,
              label: "二级 1-1",
              searchtext: "一级1二级1-1",
              children: [
                {
                  id: 9,
                  label: "三级 1-1-1",
                  searchtext: "一级1二级1-1三级1-1-1"
                },
                {
                  id: 10,
                  label: "三级 1-1-2",
                  searchtext: "一级1二级1-1三级1-1-2"
                }
              ]
            }
          ]
        },
        {
          id: 2,
          label: "一级 2",
          searchtext: "一级2",
          children: [
            {
              id: 5,
              label: "二级 2-1",
              searchtext: "一级2二级2-1"
            },
            {
              id: 6,
              label: "二级 2-2",
              searchtext: "一级2二级2-2"
            }
          ]
        },
        {
          id: 3,
          label: "一级 3",
          searchtext: "一级3",
          children: [
            {
              id: 7,
              label: "二级 3-1",
              searchtext: "一级3二级3-1"
            },
            {
              id: 8,
              label: "二级 3-2",
              searchtext: "一级3二级3-2"
            }
          ]
        }
      ],
      defaultProps: {
        children: "children",
        label: "label"
      },
      defaultChecked: [7, 8], //选中项节点id
      defaultsel: [
        {
          id: 7,
          label: "二级 3-1",
          searchtext: "一级3二级3-1"
        },
        {
          id: 8,
          label: "二级 3-2",
          searchtext: "一级3二级3-2"
        }
      ], //右边框选中选项
      outerVisible: false,
      data2: [
        {
          id: 1,
          label: "一级 1",
          searchtext: "一级1",
          children: [
            {
              id: 4,
              label: "二级 1-1",
              searchtext: "一级1二级1-1",
              children: [
                {
                  id: 9,
                  label: "三级 1-1-1",
                  searchtext: "一级1二级1-1三级1-1-1"
                },
                {
                  id: 10,
                  label: "三级 1-1-2",
                  searchtext: "一级1二级1-1三级1-1-2"
                }
              ]
            }
          ]
        }
      ],
       defaultChecked2: [9], //选中项节点id
       defaultsel2:[
          {
                  id: 9,
                  label: "三级 1-1-1",
                  searchtext: "一级1二级1-1三级1-1-1"
                }
       ]
    };
  },
  components: { dirTree },
  methods: {
    submitData(data) {//提交按钮方法,在此将数据提交到服务器
      //参数data返回选中的子节点对象数组([{},{}])
      console.log("data", data);
      //服务器数据处理
    },
    openModal() {//引入模态框打开模态框
      this.outerVisible = true;
    },
    closeModal(){
      this.outerVisible = false;
    }
  }
};
</script>
<style scoped>
.title {
  padding: 50px 0;
  text-align: center;
  background: #88d8f6;
  background: -webkit-gradient(
    linear,
    left top,
    right top,
    color-stop(0, #6babfb),
    color-stop(1, #88d8f6)
  );
  background: -ms-linear-gradient(right, #6babfb, #88d8f6);
  background: -o-linear-gradient(#88d8f6, #6babfb);
  filter: progid:DXImageTransform.Microsoft.gradient(
      startColorstr="#88D8F6",
      endColorstr="#6BABFB",
      GradientType=0
    );
  background: linear-gradient(to right, #6babfb, #88d8f6);
  box-shadow: none;
  color: #fff;
  font-size: 36px;
}
.tree-container {
  border: 1px solid #ddd;
  padding: 30px 100px;
  background-color: #e7e8e8;
}
.sub-title {
  font-size: 16px;
  font-weight: bolder;
}
</style>

 

在ECharts中,如果你希望树图的叶子节点太多时,默认展开5个叶子节点,并在后续点击“展示更多”来展开其他子节点,可以通过以下步骤实现: 1. **初始化树图**:首先,初始化ECharts实例并配置基本的树图选项。 2. **默认展开节点**:在加载数据后,默认展开前5个叶子节点。 3. **点击事件**:添加点击事件处理器,当用户点击“展示更多”按钮时,展开更多的节点。 以下是一个示例代码: ```html <!DOCTYPE html> <html style="height: 100%"> <head> <meta charset="UTF-8"> <title>ECharts</title> <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.2/dist/echarts.min.js"></script> </head> <body style="height: 100%; margin: 0"> <div id="main" style="height: 100%"></div> <script> var chart = echarts.init(document.getElementById('main')); var data = { name: '根节点', children: [ {name: '子节点1'}, {name: '子节点2'}, {name: '子节点3'}, {name: '子节点4'}, {name: '子节点5'}, {name: '子节点6'}, {name: '子节点7'}, // 更多子节点... ] }; var option = { tooltip: { trigger: 'item', triggerOn: 'mousemove' }, series: [ { type: 'tree', data: [data], top: '1%', left: '7%', bottom: '1%', right: '20%', symbolSize: 7, label: { position: 'left', verticalAlign: 'middle', align: 'right', fontSize: 9 }, leaves: { label: { position: 'right', align: 'left' } }, expandAndCollapse: true, initialTreeDepth: 2 } ] }; chart.setOption(option); // 默认展开前5个叶子节点 var root = data; var children = root.children; for (var i = 0; i < Math.min(5, children.length); i++) { var child = children[i]; chart.dispatchAction({ type: 'treeExpand', dataIndex: 0, children: [child] }); } // 点击“展示更多”按钮展开更多节点 var moreButton = document.createElement('button'); moreButton.innerHTML = '展示更多'; moreButton.onclick = function () { var remaining = children.slice(5); for (var i = 0; i < remaining.length; i++) { var child = remaining[i]; chart.dispatchAction({ type: 'treeExpand', dataIndex: 0, children: [child] }); } }; document.getElementById('main').appendChild(moreButton); </script> </body> </html> ``` 在这个示例中,我们首先初始化了一个基本的树图配置。然后,我们通过JavaScript代码默认展开前5个叶子节点,并添加了一个“展示更多”按钮,点击该按钮时会展开剩余的节点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值