|
1 | 1 | <template>
|
2 |
| - <div class="vjs__tree"> |
3 |
| - <brackets-left |
4 |
| - :visiable.sync="visiable" |
5 |
| - :data="data" |
6 |
| - :index="index" |
7 |
| - :last-index="lastIndex"> |
8 |
| - <span v-if="child && !Array.isArray(json)">{{ index }}:</span> |
9 |
| - </brackets-left> |
10 |
| - |
11 |
| - <!-- data 为对象时, index 表示 key, 为数组才表示索引 --> |
12 |
| - <div |
13 |
| - v-for="(item, index) in data" |
14 |
| - v-show="visiable" |
15 |
| - class="vjs__tree__content" |
16 |
| - :style="{ 'background-color': treeContentBackground }" |
17 |
| - :key="index" |
18 |
| - @mouseover.stop="treeContentBackground = '#eee'" |
19 |
| - @mouseout.stop="treeContentBackground = 'transparent'" |
20 |
| - @click.stop="handleClick"> |
21 |
| - <tree |
22 |
| - v-if="Array.isArray(item) || isObject(item)" |
23 |
| - :json="data" |
24 |
| - :data="item" |
25 |
| - :path="path + (Array.isArray(data) ? `[${index}]` : `.${index}`)" |
| 2 | + <div |
| 3 | + class="vjs__tree" |
| 4 | + :style="{ 'background-color': treeContentBackground }" |
| 5 | + @click.stop="handleClick" |
| 6 | + @mouseover.stop="treeContentBackground = '#eee'" |
| 7 | + @mouseout.stop="treeContentBackground = 'transparent'"> |
| 8 | + <template v-if="Array.isArray(data) || isObject(data)"> |
| 9 | + <!-- 左闭合 --> |
| 10 | + <brackets-left |
| 11 | + :visiable.sync="visiable" |
| 12 | + :data="data" |
26 | 13 | :index="index"
|
27 |
| - :last-index="getLastIndex()" |
28 |
| - :child="true" |
29 |
| - @click="handleItemClick"> |
30 |
| - </tree> |
| 14 | + :last-index="lastIndex"> |
| 15 | + <span v-if="child && !Array.isArray(parentData)">{{ index }}:</span> |
| 16 | + </brackets-left> |
31 | 17 |
|
32 |
| - <div v-else :class="{ 'vjs__not__lastIndex': index !== getLastIndex() }" > |
33 |
| - <span v-if="isObject(data)">{{ index }}:</span> |
34 |
| - <span :class="getValueClass(item)">{{ `${item}` }}</span> |
| 18 | + <!-- 数据内容, data 为对象时, index 表示 key, 为数组才表示索引 --> |
| 19 | + <div |
| 20 | + v-for="(item, index) in data" |
| 21 | + v-show="visiable" |
| 22 | + class="vjs__tree__content" |
| 23 | + :key="index"> |
| 24 | + <tree |
| 25 | + :parent-data="data" |
| 26 | + :data="item" |
| 27 | + :path="path + (Array.isArray(data) ? `[${index}]` : `.${index}`)" |
| 28 | + :index="index" |
| 29 | + :child="true" |
| 30 | + @click="handleItemClick"> |
| 31 | + </tree> |
35 | 32 | </div>
|
36 |
| - </div> |
37 | 33 |
|
38 |
| - <brackets-right |
39 |
| - :visiable.sync="visiable" |
40 |
| - :data="data" |
41 |
| - :index="index" |
42 |
| - :last-index="lastIndex"> |
43 |
| - </brackets-right> |
| 34 | + <!-- 右闭合 --> |
| 35 | + <brackets-right |
| 36 | + :visiable.sync="visiable" |
| 37 | + :data="data" |
| 38 | + :index="index" |
| 39 | + :last-index="lastIndex"> |
| 40 | + </brackets-right> |
| 41 | + </template> |
| 42 | + |
| 43 | + <template v-else> |
| 44 | + <div :class="{ 'vjs__not__lastIndex': index !== lastIndex }"> |
| 45 | + <span v-if="isObject(parentData)">{{ index }}:</span> |
| 46 | + <!-- data 可能为 null, 因此界面展示转为字符串 --> |
| 47 | + <span :class="getValueClass(data)">{{ data + '' }}</span> |
| 48 | + </div> |
| 49 | + </template> |
44 | 50 | </div>
|
45 | 51 | </template>
|
46 | 52 |
|
|
50 | 56 |
|
51 | 57 | export default {
|
52 | 58 | name: 'tree',
|
| 59 | + components: { |
| 60 | + BracketsLeft, |
| 61 | + BracketsRight |
| 62 | + }, |
53 | 63 | props: {
|
54 | 64 | /* 外部可用 START */
|
55 | 65 | data: {}, // 当前树的数据
|
|
59 | 69 | default: 'root'
|
60 | 70 | },
|
61 | 71 | /* 外部可用 END */
|
62 |
| - json: {}, // 当前树的父级数据 |
| 72 | + parentData: {}, // 当前树的父级数据 |
63 | 73 | child: Boolean, // 是否子树
|
64 |
| - index: {}, |
65 |
| - lastIndex: {} |
| 74 | + index: {} |
66 | 75 | },
|
67 | 76 | data () {
|
68 | 77 | return {
|
69 | 78 | visiable: true,
|
70 | 79 | treeContentBackground: 'transparent'
|
71 | 80 | }
|
72 | 81 | },
|
73 |
| - components: { |
74 |
| - BracketsLeft, |
75 |
| - BracketsRight |
| 82 | + computed: { |
| 83 | + // 获取当前 data 中最后一项的 key 或 索引, 便于界面判断是否添加 "," |
| 84 | + lastIndex () { |
| 85 | + if (Array.isArray(this.parentData)) { |
| 86 | + return this.parentData.length - 1 |
| 87 | + } else if (this.isObject(this.parentData)) { |
| 88 | + let arr = Object.keys(this.parentData) |
| 89 | + return arr[arr.length - 1] |
| 90 | + } |
| 91 | + } |
76 | 92 | },
|
77 | 93 | methods: {
|
78 | 94 | // 触发组件的 click 事件
|
|
87 | 103 | isObject (value) {
|
88 | 104 | return Object.prototype.toString.call(value).slice(8, -1).toLowerCase() === 'object'
|
89 | 105 | },
|
90 |
| - // 获取当前 data 中最后一项的 key 或 索引, 便于界面判断是否添加 "," |
91 |
| - getLastIndex () { |
92 |
| - if (Array.isArray(this.data)) { |
93 |
| - return this.data.length - 1 |
94 |
| - } else if (this.isObject(this.data)) { |
95 |
| - let arr = Object.keys(this.data) |
96 |
| - return arr[arr.length - 1] |
97 |
| - } |
98 |
| - }, |
99 | 106 | getValueClass (value) {
|
100 | 107 | if (value === null) {
|
101 | 108 | return 'vjs__value__null'
|
|
0 commit comments