我的项目需要:
- 新增:关上目录树,选中指标节点,显示到上方的tag列表容器
- 减少:关上目录树,禁用上次选中的节点,可操作残余节点
我的项目筹备:
- vue脚手架
- elementui
我的项目代码:
这里只贴出的要害局部代码可提供参考,间接复制粘贴跑不起来的!!!
<div class="wrapper"> <div class="tag" @click="isShowTree=true"> <el-tag class="item" v-for="item in tagData" :key="item.id" type="info" closable @close="removeTag(item)" >{{item.name}}</el-tag > </div> <el-button class="showTreeButton" type="text" :icon="isShowTree?'el-icon-arrow-up':'el-icon-arrow-down'" @click="isShowTree=!isShowTree" ></el-button></div><el-card class="box-card" class="inputAndTree" v-if="isShowTree"> <el-input placeholder="输出关键字进行过滤" v-model="filterText" suffix-icon="el-icon-search"> </el-input> <el-tree class="filter-tree" :data="treeData" :props="defaultProps" default-expand-all show-checkbox node-key="id" @check-change="handleCheckChange" :filter-node-method="filterNode" :default-checked-keys="defaultCheckedKeys" ref="tree" > </el-tree></el-card>
let vm = new Vue({ el: "#test", data() { return { isShowTree: false, // 是否显示树 filterText: "", // 过滤关键字 treeData: [], // 树数据 defaultProps: { children: "children", label: "name", }, tagData: [], // tag列表 defaultCheckedKeys: [], // 树型默认选中节点 }; }, watch: { filterText(val) { this.$refs.tree.filter(val); }, isShowTree(val) { this.defaultCheckedKeys = this.tagData.map((item) => item.id); }, }, methods: { /** * 申请树数据 * @returns 树数据 */ getTreeData() { return [ { id: 1, name: "一级目录", type: "cateTree", children: [ { id: 11, name: "二级目录-1", type: "cateTree", children: [], }, { id: 12, name: "二级目录-2", type: "cateTree", children: [ { id: 121, name: "三级目录-1", type: "cateTree", children: [], }, { id: 122, name: "三级目录-2", type: "cateTree", children: [], }, { id: 123, name: "三级目录-3", type: "cateTree", children: [], }, ], }, { id: 13, name: "二级目录-3", type: "cateTree", children: [], }, { id: 14, name: "二级目录-4", type: "cateTree", children: [ { id: 141, name: "三级目录-1", type: "cateTree", children: [], }, { id: 142, name: "三级目录-2", type: "cateTree", children: [], }, ], }, ], }, ]; }, /** * 搜寻树节点 * @param {*} value * @param {*} data * @returns Boolean */ filterNode(value, data) { if (!value) return true; return data.name.indexOf(value) !== -1; }, /** * 勾选树节点 * @param {*} item 以后勾选节点数据 * @param {*} checked 是否选中 * @param {*} indeterminate 子节点是否全副选中 */ handleCheckChange(item, checked, indeterminate) { if (!checked) this.tagData = this.tagData.filter((it) => it.id !== item.id); if ((!item.children || item.children.length == 0) && checked) { let isExisted = this.tagData.find((it) => it.id == item.id); if (!isExisted) this.tagData.push(item); } }, /** * 删除tag * @param {*} item 被删除项数据 */ removeTag(item) { this.tagData = this.tagData.filter((it) => it.id !== item.id); if (this.$refs.tree) { this.$refs.tree.setCheckedNodes(this.tagData); } }, /** * 禁用节点 * @param {*} data * @param {*} id 值不为undefined设置禁用节点;反之则革除禁用节点 */ setDisabledTreeData(data, id) { let val = id !== undefined ? true : false; data.map((item) => { if (id == undefined || item.id == id) { this.$set(item, "disabled", val); } let isFatherNode = item.children && item.children.length > 0; isFatherNode && this.setDisabledTreeData(item.children, id); let isHadDisabledChild = isFatherNode && item.children.some((it) => it.disabled && it.disabled == val); if (isHadDisabledChild) this.$set(item, "disabled", val); }); }, /** * 获取有禁用节点的树数据 */ getDisabledData(){ this.defaultCheckedKeys = tagData.map((item) => item.id); this.defaultCheckedKeys.map((item) => this.setDisabledTreeData(this.treeData, item)); }, /** * 勾销 */ handleClose(){ this.tagData = []; // 清空tag this.defaultCheckedKeys = []; // 清空树默认选中节点 if (this.$refs.tree) this.$refs.tree.setCheckedNodes(this.tagData); // 清空选中树节点 this.isShowTree = false; // 敞开树 this.setDisabledTreeData(this.treeData, undefined); // 革除树节点内的禁用状态 }, },});
指标成果:
新增:
减少: