这次给大家带来vue组件做出层级多选菜单功能,vue组件做出层级多选菜单功能的注意事项有哪些,下面就是实战案例,一起来看一下。
wTree.vue
原理:每一个多选框都是一个节点,每个节点就是一个wTree组件,有父级(顶级level为0),有子级(底层list[]是空的),组件之间状态传递是通过组件通信传递,对于外部数据checkList数组的修改是通过store实现的。初始化从底层状态传递到上层,一层一层传递。改变状态,不同状态改变,修改checklist数组。大概就这个思路,下面是代码:
d477f9ce7bf77f53fbcf36bec1b69b7a e388a4556c0f65e1904146cc1a846bee ed101ace28eb2e83d02513ccb1648d2b 4f555254255129eed389abd755c7120a 54bdf357c58b8a65c66d7c19c8e4d114 b7dc181cef335d3aca7c2764a59d47d472ac96585ae54b6ae11f849d2649d9e6 4333e88ff3da098980eb64a766f698c6 54bdf357c58b8a65c66d7c19c8e4d114 45a2772a6b6107b401db3c9b82c049c2 0f52e3d84a33e3edc14d95af6e1e0d9e f4795b2a19418f35194557a89112fcf5 af950f290a4bf6954df9def7b42b0d6c 7f23ea73d0b6e0b57b4268f2114cd7c4 5db79b134e9f6b82c0b36e0489ee08ed 54bdf357c58b8a65c66d7c19c8e4d114 45a2772a6b6107b401db3c9b82c049c2{{item.name}}54bdf357c58b8a65c66d7c19c8e4d114 94b3e26ee717c64999d7867364b1b4a3 b41f8f9c6e4179cbe6e1c8b508f6b506 2724ec0ed5bf474563ac7616c8d7a3cd 94b3e26ee717c64999d7867364b1b4a3 21c97d3a051048b8e55e3c8f199a54b2 3f1c4e4b6b16bbbd69b2ee476dc4f83a export default { name: 'wTree', props: ['item', 'level', 'state'], data () { return { open: true, node: 'wTree', // 控制菜单开关的 selected: false, // 选中的情况下 selectedState: 'null', // 子组件被选中的情况下向上传递all/sub/null originInfo: 'create', // 组件信息源,create/parent/children/this openClass: 'el-icon-caret-bottom', closeClass: 'el-icon-caret-right', selectClass: 'el-icon-check', selectBg: '#1c8de0', list: [], createSwitch: true } }, computed: { levelNum () { return (this.level + 1) }, stateSub () { return { selected: this.selected, originInfo: this.originInfo } } }, methods: { showSub () { this.open = !this.open }, changeState () { if (this.selected) { this.selected = false this.selectedState = 'null' this.originInfo = 'this' for (let o of this.list) { o.selectedState = 'null' } } else { this.selected = true this.selectedState = 'all' this.originInfo = 'this' for (let o of this.list) { o.selectedState = 'all' } } let data = { id: this.item.menuId, selectedState: this.selectedState, originInfo: 'parent' } this.$emit('changeToPar', data) }, changeBySub (data) { // 如果是父组件true,判断状态,未被选中,添加id到list,selectSub=true,通知父组件,添加store的数组中,选中通知父组件,this.list.length=this.length状态改为selected // 修改自身状态,添加list let temp = data if (data.originInfo === 'create') { this.list.push(data) } else { this.originInfo = 'parent' let stateNull = 'null' let stateAll = 'all' let stateSub = 'sub' for (let o of this.list) { if (o.id === temp.id) { o.selectedState = temp.selectedState } if (o.selectedState !== 'all') { stateAll = null } if (o.selectedState !== 'null') { stateNull = null } } if (stateNull) { this.selectedState = stateNull this.selected = false } else if (stateAll) { this.selectedState = stateAll this.selected = true } else { this.selectedState = stateSub this.selected = true } let data = { id: this.item.menuId, selectedState: this.selectedState, originInfo: 'parent' } this.$emit('changeToPar', data) } } }, watch: { selected () { // 初始化 if (this.originInfo === 'create') { // 不改变值 } else { // 改变值******** if (this.selected) { // 添加值 this.$store.commit('PUSH_CHECK_LIST', this.item.menuId) } else { // 删除值 this.$store.commit('SPLICE_CHECK_LIST', this.item.menuId) } } }, state () { // 子组件得到通知,如果状态一直,不去改变,如果状态不一致改变 if (this.state.originInfo === 'this') { this.originInfo = 'this' } if (this.originInfo === 'create') { this.originInfo = 'children' } else { if (this.state.originInfo !== 'parent') { if (this.state.selected) { this.selected = true this.selectedState = 'all' if (this.list !== []) { for (let o of this.list) { o.selectedState = 'all' } } } else { this.selected = false this.selectedState = 'null' if (this.list !== []) { for (let o of this.list) { o.selectedState = 'null' } } } } } }, list () { // 初始化数组 if (this.list.length === this.item.list.length) { let stateNull = 'null' let stateAll = 'all' let stateSub = 'sub' for (let o of this.list) { if (o.selectedState !== 'all') { stateAll = null } if (o.selectedState !== 'null') { stateNull = null } } if (stateNull) { this.selectedState = stateNull this.selected = false } else if (stateAll) { this.selectedState = stateAll this.selected = true } else { this.selectedState = stateSub this.selected = true } let data = { id: this.item.menuId, selectedState: this.selectedState, originInfo: 'create' } this.$emit('changeToPar', data) } } }, created () { // 初始化,把每个组件,从最底层添加到节点列表中,这样每个子组件都在list中了,就是originInfo=create的情况下添加数组,就不用判断数组长度,直接改变状态 if (this.createSwitch) { let i = this.$store.state.checkList.indexOf(this.item.menuId) console.log(!this.item.list) console.log('-----------------------初始化') if (!this.item.list) { if (i > -1) { this.selectedState = 'all' this.selected = true } else { this.selectedState = 'null' this.selected = false } let data = { id: this.item.menuId, selectedState: this.selectedState, originInfo: 'create' } this.$emit('changeToPar', data) this.originInfo = 'this' } this.createSwitch = false } console.log(this.state) console.log('----------------created') }, updated () { console.log('-------updated=======') let i = this.$store.state.checkList.indexOf(this.item.menuId) console.log(!this.item.list) console.log('-----------------------初始化') if (!this.item.list) { if (i > -1) { this.selectedState = 'all' this.selected = true } else { this.selectedState = 'null' this.selected = false } let data = { id: this.item.menuId, selectedState: this.selectedState, originInfo: 'parent' } this.$emit('changeToPar', data) this.originInfo = 'this' } }, mounted () { console.log('=========mounted-----') } } 2cacc6d41bbb37262a98f745aa00fbf0
调用 orgList带有层级的json数组
<w-tree v-for="o of orgList" :item="o" :level="0" :key="o.key"></w-tree>
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是vue组件做出层级多选菜单功能的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。 1.Python以简洁语法和丰富库生态着称,适用于数据分析和Web开发。 2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。

如何在Quartz中提前发送任务通知在使用Quartz定时器进行任务调度时,任务的执行时间是由cron表达式设定的。现�...

在JavaScript中如何获取原型链上函数的参数在JavaScript编程中,理解和操作原型链上的函数参数是常见且重要的任�...

在微信小程序web-view中使用Vue.js动态style位移失效的原因分析在使用Vue.js...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

Atom编辑器mac版下载
最流行的的开源编辑器

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3汉化版
中文版,非常好用