介绍一款基于vue-elementui的tree树形公共组件

成果如下图:

提供源码:

template

<template>  <div class="el-tree-div" :class="{'show-tree':showTree,'hide-tree':!showTree}">    <div class="el-tree-top">      <div class="el-tree-title">        <span v-show="showTree">{{treeTitle}}</span>        <el-link type="primary" :underline="false" class="inline-block refresh-tree" v-show="showTree&&refresh" @click="clickFresh">          <svg-icon icon-class="refresh"/>刷新</el-link>      </div>      <svg-icon class="inline-block change-nav-i show-tree-icon" :icon-class="showTree?'put':'open'" @click.native="changeShowTree"/>    </div>    <div class="el-tree-content" v-show="showTree">      <el-input placeholder="输出关键字进行过滤" v-model.trim="filterText" clearable size="small"></el-input>      <div class="tree-body" :class="{'can-add-first-node':canAddFirstNode}">        <el-tree          :class="{'tree-no-data':!treeData}"          ref="tree"          :data="treeData"          :show-checkbox="showCheck"          :check-strictly="checkStrictly"          :default-expand-all="defaultExpandAll"          :expand-on-click-node="false"          highlight-current          @node-click="handleNodeClick"          @check-change="handleCheckChange"          node-key="id"          :default-expanded-keys="[]"          :default-checked-keys="[]"          :filter-node-method="filterNode"          :props="treeProps"          :render-content="showRender?renderContent:''">        </el-tree>      </div>    </div>  </div></template>

script

<script>export default {  name: 'el-tree-div',  props:['treeData','treeTitle','showRender','refresh','delMsg','showCheck','checkStrictly','defaultExpandAll','showAllBtn','canAddFirstNode'],  components: {},  data() {    return {      showTree:true,      filterText: '',      treeProps: {        children: 'children',        label: 'label'      },    };  },  created() {  },  mounted() {    this.filterText = '';  },  methods: {    filterNode(value, data) {      if (!value) return true;      return data.label.indexOf(value) !== -1;    },    // check点击    handleCheckChange(data) {      this.$emit("checkNode",data,this.$refs.tree.getCheckedNodes());    },    // 点击节点    handleNodeClick(data) {      this.$emit("clickNode",data);    },    // 返回选中节点数据    getCheckedNodes() {      this.$emit("getCheckedNodes",this.$refs.tree.getCheckedNodes());    },    // 返回选中节点key数组    getCheckedKeys() {      this.$emit("getCheckedKeys",this.$refs.tree.getCheckedKeys());    },    // 通过node节点渲染选中的元素    setCheckedNodes(nodes) {      this.$refs.tree.setCheckedNodes(nodes);    },    // 通过id数组渲染选中的元素    setCheckedKeys(arr) {      this.$refs.tree.setCheckedKeys(arr);    },    // 移除tree中选中的元素    delTreeCheck(id){      let getCheckedKeys = this.$refs.tree.getCheckedKeys();      for(var i in getCheckedKeys){        if(getCheckedKeys[i] == id){          getCheckedKeys.splice(i,1);        }      }      this.setCheckedKeys(getCheckedKeys);    },    // 折叠开展tree    changeShowTree(){      if(this.showTree){        this.$emit("changeShowTree",false);      }else{        this.$emit("changeShowTree",true);      }      this.showTree = !this.showTree;    },    // 渲染树形图自定义插件    renderContent: function(h, data) {        let _this = this;        return h('span', {}, [            h('span', data.data.label),            h("el-link", {                class: 'article-classify-add',                props: {                    type: 'info'                },                title: '增加',                on: {                    click: function(event) {              event.stopPropagation();              _this.$emit("getAdd",data.data);                        // _this.articleClassifyAdd(event,data.data);                    },                }            }, ''),            h("el-link", {                class: 'article-classify-edit',                props: {                    type: 'primary'                },                title: '编辑',                on: {                    click: function(event) {              event.stopPropagation();              _this.$emit("getEdit",data.data);                        // _this.articleClassifyEdit(event,data.data);                    },                }            }, ''),            h("el-link", {                class: data.data.parentId != "0" || this.showAllBtn ? 'article-classify-del' : '',                props: {                    type: 'danger'                },                title: '删除',                on: {                    click: function(event) {              event.stopPropagation();              if(data.data.parentId == "0" && !_this.showAllBtn){                _this.$warning("主企业不能删除!");                return;              }              if(!_this.delMsg){                _this.delMsg = "删除后不可复原,请确认后删除!";              }              _this.$confirm(_this.delMsg, '提醒', {                  confirmButtonText: '确定',                  cancelButtonText: '勾销',                  type: 'warning'              }).then(() => {                _this.$emit("getDel",data.data);              }).catch(() => {});                        // _this.articleClassifyDel(event,data.data);                    },                }            }, ''),        ])    },    // 点击刷新按钮    clickFresh(){      this.filterText = '';      this.$emit("clickFresh");    },  },  watch: {    filterText(val) {      this.$refs.tree.filter(val);    }  }};</script>

style

<style scoped>.el-tree-div{border: 1px solid #E4E4E4;background-color: white;height: auto;box-shadow: 0 0 10px #E8F4FF;border-radius: 3px;}.el-tree-top{padding-left: 16px;line-height: 30px;height: 30px;border-bottom: 1px solid #E4E4E4;background-color: #fff;position: relative;}.refresh-tree{margin-left:12px; line-height: 30px;}.refresh-tree .svg-icon {vertical-align: -0.1em; margin-right:4px;}.el-tree-title{font-size: 14px;font-weight: 700;}.show-tree-icon{position: absolute;right: 8px; color: #54595c; top: 16px; width: 20px; height: 15px;margin: 0;font-size: 20px;cursor: pointer;}.el-tree-content{padding: 10px;}.tree-body{margin-top: 10px;height: auto;overflow: auto;}.tree-body .el-tree{width: fit-content;font-size: 12px;min-width: max-content;}.tree-body /deep/ .el-tree__empty-block{width: 278px;}.tree-no-data{width: 100%!important;}.hide-tree .el-tree-top{height: 500px;}.hide-tree .show-tree-icon{right: 5px;}.tree-body /deep/ .article-classify-add,.tree-body /deep/ .article-classify-edit,.tree-body /deep/ .article-classify-del {  display: inline-block;  width: 15px;  height: 15px;  vertical-align: middle;  border-radius: 3px;  background-size: 100%;}.tree-body /deep/ .article-classify-add {  background-color: #409eff;  margin-left: 20px;  background: url(https://图标门路/tree-add-icon.png) no-repeat center center;}.tree-body /deep/ .article-classify-edit {  background-color: #409eff;  margin-left: 5px;  background: url(https://图标门路/tree-edit-icon.png) no-repeat center center;}.tree-body /deep/ .article-classify-del {  background-color: #f56c6c;  margin-left: 5px;  background: url(https://图标门路/tree-reduce-icon.png) no-repeat center center;}.can-add-first-node /deep/ .el-tree-node:nth-last-child(2) .el-link{display: none;}.can-add-first-node /deep/ .el-tree-node:nth-last-child(2)>div>span>span{display: inline-block;width: 200px;text-align: center;color: #0994DC;}.el-tree-content /deep/ .el-link{opacity: 0;}.el-tree-content /deep/ .el-link:last-child{margin-right: 60px;}.el-tree-content /deep/ .el-tree-node__content:hover .el-link{opacity: 1;}.el-tree--highlight-current{width: 100% !important;}</style>

可能公布当前格局有点乱,复制之后格式化就好

很实用,望小伙伴们点赞、分享、珍藏,不然当前找不着的嘿