Ant Design Vue Tree 选中子节点同时半选中父级节点

这篇具有很好参考价值的文章主要介绍了Ant Design Vue Tree 选中子节点同时半选中父级节点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需要实现的效果:

  • 1、子菜单如果不是全部选中,一级菜单半选。
  • 2、子菜单全选,一级菜单选中。
  • 3、一级菜单选择,二级菜单全选。
  • 4、没有二级菜单,则只控制一级菜单。

主要用到的属性是checkedhalfCheckedKeys,通过手动控制那些菜单选中,那些半选中实现功能。

**页面截图: **

Ant Design Vue Tree 选中子节点同时半选中父级节点

完整代码如下:

<template>
  <div>
    <a-tree v-model="checkedKeys" checkable :tree-data="menuList" @check="onCheck"></a-tree>
  </div>
</template>

<script>
import { getRoleMenusById } from '@/api/role'
import { getMenusList } from '@/api/menu'
import { sortBykey, toTree } from '@/utils/common'

export default {
  name: 'EditModal',
  data () {
    return {
      checkedKeys: [],
      record: {},
      // 全部菜单
      menuList: [],
      // 授权菜单
      menuRole: []
    }
  },

  created () {},
  mounted () {},
  methods: {
    sortBykey,
    toTree,

    /**
     * 获取用户的授权菜单
     * @param {*} menuId
     * @returns
     */
    getUserMenus (menuId) {
      return new Promise((resolve, reject) => {
        getRoleMenusById(menuId).then((res) => {
          resolve(res)
        }).catch((err) => {
          reject(err)
        })
      })
    },

    /**
     * 获取菜单列表
     */
    getMenusList () {
      return new Promise((resolve, reject) => {
        getMenusList().then((response) => {
          response = response.items
          response.forEach((item) => {
            item.title = item.name
            item.key = item.id
          })
          response = this.sortBykey(response, 'sort')
          response = this.toTree(response)
          resolve(response)
        }).catch((err) => {
          reject(err)
        })
      })
    },

    /**
     * 选中树状菜单
     * @param {*} checkedKeys 
     * @param {*} info 
     */
    onCheck (checkedKeys, info) {
      console.log(checkedKeys, info)
      this.checkedKeys = this.getCheckedKeys(this.menuList, checkedKeys)
    },

    /**
     * 筛选选中,以及半选中
     * 判断当前的节点是否选择,如果选中,判断主节点是否需要选中,
      如果没选中,判断主节点是否要选中
     * @param {*} menuList 
     * @param {*} checkedMenu 
     */
    getCheckedKeys (menuList, checkedMenu) {
      console.log('checkedMenu', checkedMenu)
      console.log('menuList', menuList)
      const result = {
        checked: [],
        halfCheckedKeys: []
      }
      // 选出二级菜单,那些选中
      menuList.forEach((item) => {
        if (item.children) {
          const subAllMenu = item.children.map(item => item.key)
          const isCheckedAll = this.selectedAllSubMenu(subAllMenu, checkedMenu)
          if (isCheckedAll) {
            // 一级菜单全选
            result.checked.push(item.key)
            // 二级菜单全选
            result.checked = [...result.checked, ...subAllMenu]
          } else {
            // 二级菜单只选选中的
            const subMenu = this.getSubMenu(item.children, checkedMenu)
            result.checked = [...result.checked, ...subMenu]
            if (subMenu.length) {
              // 根据二级菜单是否选中来半选一级菜单
              result.halfCheckedKeys.push(item.key)
            }
          }
        } else {
          // 一级菜单选中是否选中
          if (checkedMenu.indexOf(item.key) !== -1) {
            result.checked.push(item.key)
          }
        }
      })
      return result
    },

    /**
     * 检测子菜单是否都选中
     * @param {*} sub 
     * @param {*} menu 
     */
    selectedAllSubMenu (sub, menu) {
      for (const item of sub) {
        if (!menu.includes(item)) {
          // 如果sub中的某个元素不在superset中,则返回false  
          return false 
        }
      }
      // 如果所有元素都在menu中,则返回true  
      return true 
    },

    /**
     * 获取选中的子菜单
     * @param {*} sub 
     * @param {*} menu 
     */
    getSubMenu (sub, menu) {
      const result = []
      sub.forEach(item => {
        if (menu.indexOf(item.key) !== -1) {
          result.push(item.key)
        }
      })
      return result
    },

    /**
     * 初始化
     * @param {*} record 
     */
    async init (record) {
      this.record = { ...record }
      this.$nextTick(async () => {
        // 全部菜单
        this.menuList = await this.getMenusList()
        console.log('menuList', this.menuList)
        // 授权菜单
        this.menuRole = await this.getUserMenus(this.record.menu_id)
        console.log('menuRole', this.menuRole)
        // 授权菜单特殊处理,子菜单未完全选中,父菜单半选中
        // this.menuRole.menu 数据为 [2,6,7,8,9,10,11,12,13,16,17,18,19,20,21,22,24]
        this.checkedKeys = this.getCheckedKeys(this.menuList, this.menuRole.menu.split(',').map(Number))
      })
    }
  }
}
</script>

完成!文章来源地址https://www.toymoban.com/news/detail-844267.html

到了这里,关于Ant Design Vue Tree 选中子节点同时半选中父级节点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • a-tree 实现父级节点禁用,通过子级节点勾选状态控制

    a-tree 组件实现折叠选择;使其父级节点禁用,通过子级节点的勾选状态来控制是否勾选;如果子级节点勾选任一个,父级节点就勾选中,如果子级节点全部不勾选则父节点不勾选,否则勾选 ,效果如下: 代码实现如下所示: 1、封装组件 setTableToolbar vue 部分  js部分代码设

    2024年02月16日
    浏览(33)
  • 【el-tree查询并高亮】vue使用el-tree组件,搜索展开并选中对应节点,高亮搜索的关键字,过滤后高亮关键字,两种方法

    效果图这样的,会把所有的有这些的节点都展开 代码: 这里的逻辑就是通过递归循环把所有和匹配的节点筛选出来 然后通过setCheckedKeys方法把他展开选中 然后通过filterReal把高亮标蓝 这个是用的官方文档的那个过滤方式,可以参考官方文档看一下。 只不

    2024年02月15日
    浏览(74)
  • ant.design 组件库中的 Tree 组件实现可搜索的树: React+and+ts

    ant.design 组件库中的 Tree 组件实现可搜索的树,在这里我会详细介绍每个方法,以及容易踩坑的点。 效果图: 下面是要渲染在 Tree 上的的数据,这是一个伪数据,如果你在开发时使用,直接修改给对应的变量名,赋值即可 这个方法是 Tree 组件提供的,用来筛选出要渲染的数

    2024年02月14日
    浏览(38)
  • element-tree树结构-默认选中第一个节点高亮-根据id选中节点高亮

    前言 tree树结构是在开发中经常使用的组件,比如区域树,楼层树,组织架构树,等等包含节点关系 实际开发可能需要我们一进到页面选中树形结构第一个节点,并且调用数据,来达到用户体验 在用户选择之后,通过本地存储的方式把楼层id存起来,刷新之后获取楼层id,调

    2024年02月09日
    浏览(75)
  • vue3+ts实现element Plus Tree组件单选和取消单选的功能(取消已经选中的树节点),及vue3的proxy对象转换

     具体效果和代码如下: 点击了\\\"节点1\\\"并高亮显示 打印结果如下  vue3的打印对象是proxy,如需变成单纯的数组对象可以使用 JSON.parse(JSON.stringify(list))进行转换。  再次点击\\\"节点1\\\"则取消当前选中   如果对您有帮助点个赞,关注收藏一下吧 。

    2024年02月12日
    浏览(54)
  • el-tree获取当前选中节点及其所有父节点的id(包含半选中父节点的id)

    如下图,我们现在全勾中的有表格管理及其下的子级,而半勾中的有工作台和任务管理及其子级 现在点击保存按钮后,需要将勾中的节点id及该节点对应的父节点,祖先节点的id(包含半选中父节点的id)也都一并传给后端,那这个例子里就应该共传入9个id,我们可以直接将

    2024年01月22日
    浏览(53)
  • el-tree使用获取当前选中节点的父节点数据(开发记录)

    官网上有两种办法: 根据 data 或者 key 拿到 Tree 组件中的 node (data) 要获得 node 的 key 或者 data。 我这key设置后没有生效,采用的node获取的方法 1、html部分 2、data举例 el-tree提供的回调事件:@node-click=“handleNodeClick”。(方法名自取,这里用的原来的“handleNodeClick”) 其他:①

    2024年02月11日
    浏览(52)
  • vue3+ant design vue+ts实战【ant-design-vue组件库引入】

    🔥🔥更多内容见Ant Design Vue官方文档 🔥点击复习vue3【watch检测/监听】相关内容 👏👏👏一个好项目的编写不仅需要完美的逻辑,以及相应的技术,同时也需要一个 设计规范的高质量UI组件库 。👏👏👏本期文章将会详细讲解 Ant Design of Vue 组件库的 安装、使用、引入 。

    2024年02月02日
    浏览(50)
  • ElementUI中el-tree获取每个节点点击的选中状态

    有时候需要获取el-tree每个节点的点击状态,可以通过以下方式,其中isCheck类型为布尔值 1.绑定@check事件,我这里是getCurrentNode,函数名自己随便写 2.绑定ref

    2024年02月11日
    浏览(70)
  • antdvue tree-select树选择组件 选中值显示label拼接父节点

    最近使用antdv的a-tree-select实现一个功能:选中子节点需要拼接父节点 如图所示 问题就是 没有直接的api可以支持 记录一下解决方法 原本的使用 修改后 总结 就是利用labelInValue 属性 处理显示的title

    2024年02月13日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包