TreeViewNode.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <ul
  3. :id="node.id"
  4. :class="{'root-node' : isRoot}"
  5. >
  6. <li :class="{'root-node' : isRoot}">
  7. <span
  8. class="node-text icon expand-icon glyphicon"
  9. :class="{'glyphicon-plus-sign' : (isNodeOpen == false), 'glyphicon-minus-sign' : (isNodeOpen == true), 'glyphicon-leaf' : (isNodeOpen == undefined)}"
  10. @click="nodeExpand(node)"
  11. />
  12. <span
  13. v-if="isShowCheck==undefined || isShowCheck"
  14. class="glyphicon select-node"
  15. :class="{'selected-node' : node.selected, 'glyphicon-check' : node.selected, 'glyphicon-unchecked' : !node.selected}"
  16. @click="nodeSelect(node)"
  17. />
  18. <font>{{ node.text }}</font>
  19. <template
  20. v-for="childrenNode in node.childrenDatas"
  21. :key="childrenNode.id"
  22. >
  23. <TreeViewNode
  24. v-if="node.open && node.childrenDatas != undefined && node.childrenDatas.length > 0"
  25. :node="childrenNode"
  26. :is-show-check="childrenNode.isShowCheck"
  27. @node-expand="nodeExpand"
  28. @node-select="nodeSelect"
  29. />
  30. </template>
  31. </li>
  32. </ul>
  33. </template>
  34. <script>
  35. export default {
  36. name: 'TreeViewNode',
  37. components: {
  38. },
  39. props: {
  40. 'node': {
  41. type: Object,
  42. default: null,
  43. },
  44. 'isShowCheck': {
  45. type: Boolean,
  46. default: false,
  47. },
  48. 'isRoot': {
  49. type: Boolean,
  50. default: false,
  51. },
  52. },
  53. emits: ['nodeExpand','nodeSelect'],
  54. data: function () {
  55. return {
  56. };
  57. },
  58. computed: {
  59. // 节点是否打开
  60. isNodeOpen: function () {
  61. if (this.node.childrenDatas == undefined || this.node.childrenDatas.length == 0) {
  62. console.log(this.node.text + '无子节点');
  63. return undefined;
  64. } else {
  65. console.log(this.node.text + '有子节点' + this.node.open);
  66. return this.node.open == true;
  67. }
  68. },
  69. },
  70. mounted: function () {
  71. },
  72. methods: {
  73. nodeExpand: function (node) {
  74. if (node === this.node) {
  75. // eslint-disable-next-line
  76. this.node.open = !this.node.open;
  77. }
  78. // 触发父组件的事件
  79. // if(node.open){
  80. this.$emit('nodeExpand', node);
  81. // }
  82. },
  83. nodeSelect: function (node) {
  84. this.$emit('nodeSelect', node);
  85. },
  86. },
  87. };
  88. </script>
  89. <style scoped>
  90. .root-node {
  91. margin-left: 0px;
  92. padding-left: 0px;
  93. text-align: left;
  94. }
  95. .node-text {
  96. height: 30px;
  97. line-height: 40px !important;
  98. }
  99. .node-text:hover {
  100. cursor: pointer;
  101. }
  102. ul {
  103. padding-left: 10px;
  104. }
  105. li {
  106. padding-left: 10px;
  107. list-style: none;
  108. }
  109. .select-node {
  110. cursor: pointer;
  111. color: #0066ff;
  112. font-size: large;
  113. }
  114. .selected-node {
  115. cursor: pointer;
  116. color: #0066ff;
  117. font-size: large;
  118. }
  119. </style>