vue组件做出无限层级多选效果

这次给大家带来vue组件做出无限层级多选效果,vue组件做出无限层级多选效果的注意事项有哪些,下面就是实战案例,一起来看一下。

原理:每一个多选框都是一个节点,每个节点就是一个wTree组件,有父级(顶级level为0),有子级(底层list[]是空的),组件之间状态传递是通过组件通信传递,对于外部数据checkList数组的修改是通过store实现的。初始化从底层状态传递到上层,一层一层传递。改变状态,不同状态改变,修改checklist数组。大概就这个思路,下面是代码: 

  

vue组件做出无限层级多选效果 vue组件做出无限层级多选效果 vue组件做出无限层级多选效果 {{item.name}}

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-----') } }

登录后复制

调用 orgList带有层级的json数组

 

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

antd下拉框联动使用步骤详解

如何使用JS实现合并多个数组去重算

以上就是vue组件做出无限层级多选效果的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2757287.html

(0)
上一篇 2025年3月8日 07:53:58
下一篇 2025年3月8日 07:54:08

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 使用vue-infinite-loading实现无限加载功能

    这次给大家带来使用vue-infinite-loading实现无限加载功能,使用vue-infinite-loading实现无限加载功能的注意事项有哪些,下面就是实战案例,一起来看一下。 注意:vue-infinite-loading2.0…

    编程技术 2025年3月8日
    200
  • Vue 页面切换效果之 BubbleTransition

    使用 vue,vue-router,animejs 来讲解如何实现vue页面切换效果之 bubbletransition,需要的朋友参考下吧   CodePen 地址 前端使用 SPA 之后,能获得更多的控制权,比如页面切换动画,使用后端页…

    2025年3月8日
    200
  • Vue实现内部组件轮播切换效果的示例代码

    这篇文章主要介绍了vue实现内部组件轮播切换效果的示例代码,现在分享给大家,也给大家做个参考。 对于那些不需要路由的内部组件,在切换的时候希望增加一个轮播过渡的效果,效果如下: 我们可以引入一个轮播组件,但是有个问题,通常轮播组件都会把所有…

    2025年3月8日 编程技术
    200
  • 如何使用Vue内无限加载vue-infinite-loading

    这次给大家带来如何使用Vue内无限加载vue-infinite-loading,使用Vue内无限加载vue-infinite-loading的注意事项有哪些,下面就是实战案例,一起来看一下。 注意:vue-infinite-loading2…

    编程技术 2025年3月8日
    200
  • 如何使用Vue实现拖拽效果

    这次给大家带来如何使用Vue实现拖拽效果,使用Vue实现拖拽效果的注意事项有哪些,下面就是实战案例,一起来看一下。 效果图   分清clientY pageY screenY layerY offsetY的区别 在我们想要做出拖拽这个效果的…

    2025年3月8日
    200
  • JS怎样做出动画效果流程进度条

    这次给大家带来JS怎样做出动画效果流程进度条,JS做出动画效果流程进度条的注意事项有哪些,下面就是实战案例,一起来看一下。 当在使用流程的时候,比如有一个审核流程,有三个阶段:开始,审核中,审核成功。当在不同的阶段,做相应的进度显示,当显示…

    2025年3月8日
    200
  • 如何利用react 实现banner轮播效果

    最近在看react , jsx的语法一开始看起来确实不习惯,但是确实比较灵活 运行效果: import React from ‘react’;// import ShadowDOM from ‘react-shadow’;import ‘.…

    2025年3月8日
    200
  • JavaScript仿淘宝回到顶部效果(代码示例)

    本篇文章给大家带来的内容是javascript仿淘宝回到顶部效果(代码示例)。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 需求:当滚动条到一定位置时侧边栏固定在某个位置,再往下滑动到某一位置时显示回到顶部按钮。点击按钮…

    2025年3月8日
    200
  • 如何在jQuery中使用高亮效果?

    如何在jQuery中使用高亮效果? 在网页开发中,高亮效果是一个常见的交互设计,能够突出显示特定的元素,吸引用户的注意力。而在jQuery中,通过简单的代码就可以实现高亮效果,为网页增添一些动态和视觉上的效果。本文将介绍如何在jQuery中…

    2025年3月7日
    200
  • 探究jQuery中val方法的实际效果

    【探究jQuery中val方法的实际效果】 jQuery是一个广泛应用于网页开发中的JavaScript库,它提供了许多方便的方法来操作DOM元素。其中val方法是jQuery中常用的一个方法,用于获取或设置表单元素的值。在本文中,我们将探…

    2025年3月7日
    200

发表回复

登录后才能评论