drag1.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <template>
  2. <div style="font-size: 14px">
  3. <Tree :value="treeData" @drop="dragend" @before-drop="beforeDrop">
  4. <div class="tree_box" slot-scope="{ node, index, path, tree }">
  5. <span
  6. v-if="node.children && node.children.length > 0"
  7. @click="tree.toggleFold(node, path)"
  8. >
  9. <template v-if="node.$folded">
  10. <i class="el-icon-caret-bottom"></i>
  11. </template>
  12. <template v-else><i class="el-icon-caret-bottom"></i></template>
  13. </span>
  14. <span style="width: 100px; display: inline-block">
  15. <template v-if="node.type == 1">
  16. <i class="el-icon-reading"></i>
  17. </template>
  18. <template v-else><i class="el-icon-document"></i></template>
  19. {{ node.text }}
  20. </span>
  21. <div class="btn_box">
  22. <el-popover placement="bottom" width="100" trigger="click">
  23. <div class="tree_other_btn">
  24. <p class="tree_rename">重命名</p>
  25. <p class="tree_del">删除</p>
  26. </div>
  27. <span slot="reference">...</span>
  28. </el-popover>
  29. <i class="el-icon-plus" @click="addNode(node, index)"></i>
  30. </div>
  31. </div>
  32. </Tree>
  33. <el-dialog title="新建节点" :visible.sync="nodesVisible" width="40%">
  34. <div>
  35. <el-form ref="form" :model="nodeForm" label-width="80px">
  36. <el-form-item label="节点名称">
  37. <el-input v-model="nodeForm.text"></el-input>
  38. </el-form-item>
  39. <el-form-item label="节点类型">
  40. <el-radio-group v-model="nodeForm.type">
  41. <el-radio label="1">章节</el-radio>
  42. <el-radio label="2">互动课件</el-radio>
  43. </el-radio-group>
  44. </el-form-item>
  45. </el-form>
  46. </div>
  47. <span slot="footer" class="dialog-footer">
  48. <el-button @click="centerDialogVisible = false">取 消</el-button>
  49. <el-button type="primary" @click="sureAddNode">确 定</el-button>
  50. </span>
  51. </el-dialog>
  52. </div>
  53. </template>
  54. <script>
  55. import "he-tree-vue/dist/he-tree-vue.css";
  56. import { Tree, Fold, Draggable } from "he-tree-vue";
  57. import * as hp from "helper-js";
  58. export default {
  59. components: {
  60. Tree: Tree.mixPlugins([Fold, Draggable]),
  61. },
  62. data() {
  63. return {
  64. treeData: [
  65. { text: "node 1", type: "1", children: [] },
  66. {
  67. text: "node 2",
  68. type: "1",
  69. children: [{ text: "node 2-1", type: "2", children: [] }],
  70. },
  71. ],
  72. nodesVisible: false,
  73. nodeForm: {
  74. text: "",
  75. type: "1",
  76. children: [],
  77. },
  78. curNode: null,
  79. curIndex: "",
  80. ondragend: {},
  81. };
  82. },
  83. methods: {
  84. beforeDrop(val) {
  85. console.log(val);
  86. console.log("我不要");
  87. },
  88. dragend(val) {
  89. console.log(val);
  90. console.log(this.treeData);
  91. },
  92. addNode(node, index) {
  93. this.curNode = node;
  94. this.curIndex = index;
  95. this.nodesVisible = true;
  96. },
  97. sureAddNode() {
  98. let node = JSON.parse(JSON.stringify(this.nodeForm));
  99. this.curNode.children.push(node);
  100. this.nodesVisible = false;
  101. },
  102. },
  103. };
  104. </script>
  105. <style lang="scss" scoped>
  106. .my-tree-view .tree-node {
  107. }
  108. .tree_box {
  109. display: flex;
  110. justify-content: flex-start;
  111. align-items: center;
  112. height: 40px;
  113. .kuazhan {
  114. font-size: 40px;
  115. padding: 0 10px;
  116. cursor: pointer;
  117. }
  118. .tree_other_btn {
  119. > p {
  120. font-size: 16px;
  121. cursor: pointer;
  122. }
  123. }
  124. .btn_box {
  125. display: flex;
  126. justify-content: flex-start;
  127. align-items: center;
  128. font-size: 30px;
  129. span {
  130. margin-right: 10px;
  131. cursor: pointer;
  132. }
  133. }
  134. }
  135. </style>