DDR爱好者之家 Design By 杰米
首先是页面部分
<template> <el-tree id="userMtree" ref="tree" :data="treeData" node-key="id" :render-content="renderContent" :expand-on-click-node="false" @node-click="nodeClick" :default-expanded-keys='expandedKey' ></el-tree> </template>
下面是js部分
export default { props:['treeDataObj','isUserMgt'],//父级传值 与判断哪个tree data () { return { treeData:[],//tree数据 expandedKey:[],//展开节点 checkedID:''//选中节点 } }, mounted(){ this.treeData=this.treeDataObj.treeData let userMtree=document.getElementById('userMtree') this.$nextTick(()=>{ userMtree.firstElementChild.classList.add("is-current");//添加选中类名 }) this.checkedID=this.treeData[0].id//默认选中第一个 }, methods:{ //编辑 nodeEdit(ev, store, data) { data.isEdit = true; this.$nextTick(() => {//得到input const $input = ev.target.parentNode.parentNode.querySelector("input") || ev.target.parentElement.parentElement.querySelector("input"); !$input "" : $input.focus();//获取焦点 }); }, //失焦事件 edit_sure(ev, data) { const $input = ev.target.parentNode.parentNode.querySelector("input") || ev.target.parentElement.parentElement.querySelector("input"); if (!$input) { return false; } else if($input.value==''){ this.$message({ type: "info", message: "内容不能为空!" }); }else{//赋值value data.label = $input.value; data.isEdit = false; } }, //react方法 插入代码 renderContent(h, { node, data, store }) { return ( <span class="custom-tree-node"> <span class="tree_node_label">{this.showOrEdit(data)}</span> <div class="tree_node_op"> <i class="el-icon-edit" on-click={ev => this.nodeEdit(ev, store, data)}/> <i class="el-icon-remove-outline" on-click={() => this.nodeDelete(node, data)}/> { this.isUserMgt"el-icon-circle-plus-outline" on-click={() => this.append( data)}></i>:'' } </div> </span> ); }, showOrEdit(data) { if (data.isEdit) { return ( <input type="text" class="node_labe" value={data.label} on-blur={ev => this.edit_sure(ev, data)} /> ); } else { return <span class="node_labe">{data.label}</span>; } }, //新增节点 append(data) { const newChild = { id: new Date().getTime(), label: '', children: [], isEdit: true }; //判断是否有子节点 if (!data.children) { this.$set(data, 'children', []); } data.children.push(newChild); this.expandedKey=[data]//展开点击节点 }, //移除节点 nodeDelete(node, data) { const parent = node.parent const children = parent.data.children || parent.data const index = children.findIndex(d => d.id === data.id) children.splice(index, 1) }, //点击节点 移除默认选中节点 nodeClick(data){ let userMtree=document.getElementById('userMtree') userMtree.firstElementChild.classList.remove("is-current"); this.checkedID=data.id console.log(data) this.$emit('emitClickNode',data) } } }
补充知识:vue前端基础之组件封装(树组件的封装附带增删改查方法)
组件封装的意义
组件封装的意义其实很好理解,对于一段复用性极高的代码,就需要进行组件封装以减少冗余代码。
树的封装
<template> <el-aside width="180px"> <h3 class="el-icon-folder" style="margin: 0px"> {{ name }} </h3> <el-tree ref="tree" :data="setTree" :props="defaultProps" node-key="id" style="margin-top:20px" accordion @node-contextmenu="rihgtClick" > <span slot-scope="{ node, data }" class="span-ellipsis"> <span v-show="!node.isEdit"> <span v-show="data.children && data.children.length >= 1"> <span :title="node.label">{{ node.label }}</span> </span> <span v-show="!data.children || data.children.length == 0"> <span :title="node.label"> {{ node.label }}</span> </span> </span> </span> </el-tree> <!--鼠标右键点击出现页面--> <div v-show="menuVisible"> <el-menu id="rightClickMenu" class="el-menu-vertical" text-color="#000000" active-text-color="#000000" @select="handleRightSelect" > <el-menu-item index="1" :hidden="showQuery" class="menuItem"> <span slot="title">查询</span> </el-menu-item> <el-menu-item index="2" :hidden="showSave" class="menuItem"> <span slot="title">添加</span> </el-menu-item> <el-menu-item index="3" :hidden="showUpdate" class="menuItem"> <span slot="title">修改</span> </el-menu-item> <el-menu-item index="4" :hidden="showDelete" class="menuItem"> <span slot="title">删除</span> </el-menu-item> </el-menu> </div> </el-aside> </template> <script> export default { name: 'Tree', props: { treeData: { type: Array, required: true }, treeName: { type: String, required: true, default: '树' }, isHiddenQuery: { type: Boolean, required: false, default: true }, isHiddenSave: { type: Boolean, required: false, default: false }, isHiddenUpdate: { type: Boolean, required: false, default: false }, isHiddenDelete: { type: Boolean, required: false, default: false } }, data() { return { setTree: this.treeData, showQuery: this.isHiddenQuery, showSave: this.isHiddenSave, showUpdate: this.isHiddenUpdate, showDelete: this.isHiddenDelete, name: this.treeName, TREEDATA: { DATA: null, NODE: null }, isLoadingTree: true, // 是否加载节点树 objectID: null, defaultProps: { children: 'children', label: 'name' }, menuVisible: this.menuVisible } }, watch: { treeData(val) { this.setTree = val }, treeName(val) { this.name = val } }, methods: { handleRightSelect(key) { if (key === '1') { this.$emit('NodeQuery', this.TREEDATA) this.menuVisible = false } else if (key === '2') { this.$emit('NodeAdd', this.TREEDATA) this.menuVisible = false } else if (key === '3') { this.$emit('NodeUpdate', this.TREEDATA) this.menuVisible = false } else if (key === '4') { this.$emit('NodeDel', this.TREEDATA) this.menuVisible = false } }, rihgtClick(event, object, value, element) { if (this.objectID !== object.id) { this.objectID = object.id this.menuVisible = true this.TREEDATA.DATA = object this.TREEDATA.NODE = value } else { this.menuVisible = !this.menuVisible } document.addEventListener('click', e => { this.menuVisible = false }) const menu = document.querySelector('#rightClickMenu') /* 菜单定位基于鼠标点击位置 */ menu.style.left = event.clientX - 180 + 'px' menu.style.top = event.clientY - 100 + 'px' menu.style.position = 'absolute' // 为新创建的DIV指定绝对定位 menu.style.width = 120 + 'px' } } } </script> <style lang="scss" scoped> .span-ellipsis { width: 100%; overflow: hidden; margin-left: 10px; white-space: nowrap; text-overflow: ellipsis; } </style>
对于组件的引用
import tree from '@/components/Tree/index' export default { components: { tree }, data() {} ......
组件的使用
<tree :tree-data="setTree" :tree-name="treeName" @NodeAdd="NodeAdd" @NodeUpdate="NodeUpdate" @NodeDel="NodeDel" />
setTree是要给树赋予的值,treeName是树的标题(可不要),后面是需要的树的右键操作我启用了增删改
效果图
子组件向父组件传值
handleRightSelect(key) { if (key === '1') { this.$emit('NodeQuery', this.TREEDATA) this.menuVisible = false } else if (key === '2') { this.$emit('NodeAdd', this.TREEDATA) this.menuVisible = false } else if (key === '3') { this.$emit('NodeUpdate', this.TREEDATA) this.menuVisible = false } else if (key === '4') { this.$emit('NodeDel', this.TREEDATA) this.menuVisible = false } }
以上这篇element-ui tree结构实现增删改自定义功能代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月24日
2024年11月24日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]