index.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <div class="json-tree">
  3. <div v-for="(item, index) in data" :key="`${item.key}-${index}`" class="json-tree-item">
  4. <p class="json-tree-line">
  5. {{ item.key }}
  6. <span v-if="item.type === 'object'">
  7. <span v-text="': \{'"></span>
  8. </span>
  9. <span v-else-if="item.type === 'array'">
  10. <span v-text="': \['"></span>
  11. </span>
  12. <span v-else>
  13. <span v-pre>:</span>
  14. <span style="margin-left: 15px">
  15. {{ item.type === 'string' ? `"${item.value}"` : `${item.value}` }}
  16. </span>
  17. <span v-if="index < data.length - 1">,</span>
  18. </span>
  19. <el-tooltip class="item" effect="dark" :content="item.path" placement="top-start">
  20. <span class="path-btn" @click="getPath(item.path)">选择</span>
  21. </el-tooltip>
  22. </p>
  23. <div v-if="item.leaf" class="children-tree">
  24. <json-tree :data="item.children" @handlePath="handlePath"></json-tree>
  25. </div>
  26. <span v-if="item.type === 'object'">
  27. <span v-text="'\}'"></span>
  28. <span v-if="index < data.length - 1">,</span>
  29. </span>
  30. <span v-else-if="item.type === 'array'">
  31. <span v-text="'\]'"></span>
  32. <span v-if="index < data.length - 1">,</span>
  33. </span>
  34. </div>
  35. </div>
  36. </template>
  37. <script lang="ts">
  38. import { defineComponent } from 'vue';
  39. const props = {
  40. data: {
  41. type: Array,
  42. default: [],
  43. },
  44. };
  45. export default defineComponent({
  46. name: 'jsonTree',
  47. props: props,
  48. emits: ['handlePath'],
  49. setup(props, { emit }) {
  50. const getPath = (path) => {
  51. emit('handlePath', path);
  52. };
  53. const handlePath=(path)=>{
  54. getPath(path);
  55. }
  56. return {
  57. handlePath,
  58. getPath,
  59. };
  60. },
  61. });
  62. </script>
  63. <style lang="scss" scoped>
  64. .json-tree {
  65. .json-tree-item {
  66. margin: 20px 0px;
  67. .json-tree-line {
  68. .path-btn {
  69. background: #37f;
  70. color: #fff;
  71. padding: 2px 6px;
  72. font-size: 12px;
  73. cursor: pointer;
  74. border-radius: 3px;
  75. margin-left: 20px;
  76. }
  77. }
  78. .children-tree {
  79. margin-left: 20px;
  80. }
  81. }
  82. }
  83. </style>