leo-tree.vue 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <template>
  2. <view class="leo-tree">
  3. <treeNode
  4. v-for="item in data"
  5. :item="item"
  6. :key="item[defaultProps.id]"
  7. :defaultProps="defaultProps"
  8. :selectedNodeId="value"
  9. @node-click="handleNodeClick"
  10. @node-expand="handleNodeExpand"
  11. @node-collapse="handleNodeCollapse"
  12. ></treeNode>
  13. </view>
  14. </template>
  15. <script>
  16. import treeNode from "./tree-node.vue";
  17. export default {
  18. components: {
  19. treeNode,
  20. },
  21. model: {
  22. prop: "value",
  23. event: "input",
  24. },
  25. props: {
  26. data: {
  27. type: Array,
  28. default: () => {
  29. return [];
  30. },
  31. },
  32. value: {
  33. type: [String, Number],
  34. default: null,
  35. },
  36. defaultProps: {
  37. type: Object,
  38. default: () => {
  39. return {
  40. id: "id",
  41. children: "children",
  42. label: "label",
  43. };
  44. },
  45. },
  46. },
  47. mounted() {},
  48. methods: {
  49. handleNodeClick(node) {
  50. const nodeId = node[this.defaultProps.id];
  51. this.$emit("input", nodeId);
  52. this.$emit("node-click", node);
  53. },
  54. handleNodeExpand(node) {
  55. this.$emit("node-expand", node);
  56. },
  57. handleNodeCollapse(node) {
  58. this.$emit("node-collapse", node);
  59. },
  60. },
  61. };
  62. </script>
  63. <style scoped></style>