开局一张图,后面全靠吹水。
    image.png

    整体思路:本身树形控件已经提供了@rightClick方法,所以你只需要右键时去显示你想要的右键组件,并做对应的操作便可。

    上图我是直接用了一个开源的组件 v-contextmenu ,详细的使用说明可以查看对应文档

    代码实现:

    1. 项目添加v-contextmenu 模块
    1. npm install -S v-contextmenu
    1. 在修改工程main.js,引入v-contextmenu
    1. import contentmenu from 'v-contextmenu'
    2. import 'v-contextmenu/dist/index.css'
    3. Vue.use(contentmenu)
    1. 部分html实现代码
    1. <div>
    2. <h1>Case Tree{{id}}</h1>
    3. <a-card :bordered="false" id="left">
    4. <a-tree
    5. v-if="treeData.length>0"
    6. :treeData="treeData"
    7. :defaultExpandAll="true"
    8. :showLine="true"
    9. @select="onSelect"
    10. @rightClick="onRightClick"
    11. ></a-tree>
    12. <v-contextmenu ref="contextmenu">
    13. <v-contextmenu-item @click="addNode">新增模块</v-contextmenu-item>
    14. <v-contextmenu-item @click="addNode">新增节点</v-contextmenu-item>
    15. <v-contextmenu-item @click="editNode">编辑节点</v-contextmenu-item>
    16. <v-contextmenu-item @click="deleteNode">删除节点</v-contextmenu-item>
    17. </v-contextmenu>
    18. </a-card>
    19. </div>
    1. 部门JS实现
    1. const treeData = [
    2. {
    3. title: '0-0',
    4. key: '0-0',
    5. children: [
    6. {
    7. title: '0-0-0',
    8. key: '0-0-0',
    9. children: [
    10. {title: '0-0-0-0', key: '0-0-0-0'},
    11. {title: '0-0-0-1', key: '0-0-0-1'},
    12. {title: '0-0-0-2', key: '0-0-0-2'},
    13. ],
    14. },
    15. {
    16. title: '0-0-1',
    17. key: '0-0-1',
    18. children: [
    19. {title: '0-0-1-0', key: '0-0-1-0'},
    20. {title: '0-0-1-1', key: '0-0-1-1'},
    21. {title: '0-0-1-2', key: '0-0-1-2'},
    22. ],
    23. },
    24. {
    25. title: '0-0-2',
    26. key: '0-0-2',
    27. },
    28. ],
    29. }
    30. ]
    31. export default {
    32. name: 'CaseTree',
    33. data () {
    34. return {
    35. id: '',
    36. treeItem: null, // 右键菜单
    37. tmpStyle: '',
    38. answer: '',
    39. treeData
    40. }
    41. },
    42. created () {
    43. this.id = this.$route.query.projectId
    44. },
    45. methods: {
    46. onSelect (selectedKeys, info) {
    47. console.log('selected', selectedKeys, info)
    48. console.log(info)
    49. },
    50. onRightClick ({event, node}) {
    51. console.log(event)
    52. console.log(node)
    53. const answer = node._props.dataRef.anwer
    54. if (answer) {
    55. this.$refs.contextmenu.hide()
    56. this.answer = answer
    57. return
    58. }
    59. this.treeItem = {
    60. id: node._props.eventKey,
    61. title: node._props.title,
    62. parentId: node._props.dataRef.parentId || null
    63. }
    64. const x = event.clientX
    65. const y = event.clientY
    66. const postition = {
    67. top: y,
    68. left: x
    69. }
    70. this.$refs.contextmenu.show(postition)
    71. },
    72. // 用于点击空白处隐藏右键菜单
    73. clearMenu () {
    74. this.treeItem = null
    75. },
    76. addNode () {
    77. },
    78. editNode () {
    79. },
    80. deleteNode () {
    81. }
    82. }
    83. }