经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
Ant Design Vue Tree 选中子节点同时半选中父级节点
来源:cnblogs  作者:GangZhan  时间:2024/3/29 8:45:49  对本文有异议

需要实现的效果:

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

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

**页面截图: **

完整代码如下:

  1. <template>
  2. <div>
  3. <a-tree v-model="checkedKeys" checkable :tree-data="menuList" @check="onCheck"></a-tree>
  4. </div>
  5. </template>
  6. <script>
  7. import { getRoleMenusById } from '@/api/role'
  8. import { getMenusList } from '@/api/menu'
  9. import { sortBykey, toTree } from '@/utils/common'
  10. export default {
  11. name: 'EditModal',
  12. data () {
  13. return {
  14. checkedKeys: [],
  15. record: {},
  16. // 全部菜单
  17. menuList: [],
  18. // 授权菜单
  19. menuRole: []
  20. }
  21. },
  22. created () {},
  23. mounted () {},
  24. methods: {
  25. sortBykey,
  26. toTree,
  27. /**
  28. * 获取用户的授权菜单
  29. * @param {*} menuId
  30. * @returns
  31. */
  32. getUserMenus (menuId) {
  33. return new Promise((resolve, reject) => {
  34. getRoleMenusById(menuId).then((res) => {
  35. resolve(res)
  36. }).catch((err) => {
  37. reject(err)
  38. })
  39. })
  40. },
  41. /**
  42. * 获取菜单列表
  43. */
  44. getMenusList () {
  45. return new Promise((resolve, reject) => {
  46. getMenusList().then((response) => {
  47. response = response.items
  48. response.forEach((item) => {
  49. item.title = item.name
  50. item.key = item.id
  51. })
  52. response = this.sortBykey(response, 'sort')
  53. response = this.toTree(response)
  54. resolve(response)
  55. }).catch((err) => {
  56. reject(err)
  57. })
  58. })
  59. },
  60. /**
  61. * 选中树状菜单
  62. * @param {*} checkedKeys
  63. * @param {*} info
  64. */
  65. onCheck (checkedKeys, info) {
  66. console.log(checkedKeys, info)
  67. this.checkedKeys = this.getCheckedKeys(this.menuList, checkedKeys)
  68. },
  69. /**
  70. * 筛选选中,以及半选中
  71. * 判断当前的节点是否选择,如果选中,判断主节点是否需要选中,
  72. 如果没选中,判断主节点是否要选中
  73. * @param {*} menuList
  74. * @param {*} checkedMenu
  75. */
  76. getCheckedKeys (menuList, checkedMenu) {
  77. console.log('checkedMenu', checkedMenu)
  78. console.log('menuList', menuList)
  79. const result = {
  80. checked: [],
  81. halfCheckedKeys: []
  82. }
  83. // 选出二级菜单,那些选中
  84. menuList.forEach((item) => {
  85. if (item.children) {
  86. const subAllMenu = item.children.map(item => item.key)
  87. const isCheckedAll = this.selectedAllSubMenu(subAllMenu, checkedMenu)
  88. if (isCheckedAll) {
  89. // 一级菜单全选
  90. result.checked.push(item.key)
  91. // 二级菜单全选
  92. result.checked = [...result.checked, ...subAllMenu]
  93. } else {
  94. // 二级菜单只选选中的
  95. const subMenu = this.getSubMenu(item.children, checkedMenu)
  96. result.checked = [...result.checked, ...subMenu]
  97. if (subMenu.length) {
  98. // 根据二级菜单是否选中来半选一级菜单
  99. result.halfCheckedKeys.push(item.key)
  100. }
  101. }
  102. } else {
  103. // 一级菜单选中是否选中
  104. if (checkedMenu.indexOf(item.key) !== -1) {
  105. result.checked.push(item.key)
  106. }
  107. }
  108. })
  109. return result
  110. },
  111. /**
  112. * 检测子菜单是否都选中
  113. * @param {*} sub
  114. * @param {*} menu
  115. */
  116. selectedAllSubMenu (sub, menu) {
  117. for (const item of sub) {
  118. if (!menu.includes(item)) {
  119. // 如果sub中的某个元素不在superset中,则返回false
  120. return false
  121. }
  122. }
  123. // 如果所有元素都在menu中,则返回true
  124. return true
  125. },
  126. /**
  127. * 获取选中的子菜单
  128. * @param {*} sub
  129. * @param {*} menu
  130. */
  131. getSubMenu (sub, menu) {
  132. const result = []
  133. sub.forEach(item => {
  134. if (menu.indexOf(item.key) !== -1) {
  135. result.push(item.key)
  136. }
  137. })
  138. return result
  139. },
  140. /**
  141. * 初始化
  142. * @param {*} record
  143. */
  144. async init (record) {
  145. this.record = { ...record }
  146. this.$nextTick(async () => {
  147. // 全部菜单
  148. this.menuList = await this.getMenusList()
  149. console.log('menuList', this.menuList)
  150. // 授权菜单
  151. this.menuRole = await this.getUserMenus(this.record.menu_id)
  152. console.log('menuRole', this.menuRole)
  153. // 授权菜单特殊处理,子菜单未完全选中,父菜单半选中
  154. // this.menuRole.menu 数据为 [2,6,7,8,9,10,11,12,13,16,17,18,19,20,21,22,24]
  155. this.checkedKeys = this.getCheckedKeys(this.menuList, this.menuRole.menu.split(',').map(Number))
  156. })
  157. }
  158. }
  159. }
  160. </script>

完成!

原文链接:https://www.cnblogs.com/zhangans/p/18102548

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号