Skip to content

Commit 2c1a350

Browse files
committed
bugfix #5 Commas and quotes missing when selected
1 parent 8131619 commit 2c1a350

File tree

6 files changed

+72
-50
lines changed

6 files changed

+72
-50
lines changed

src/assets/less/tree.less

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@
1313
color: #20a0ff;
1414
}
1515
}
16-
.vjs__not__lastIndex:after {
17-
content: ",";
18-
}
1916
.vjs-checkbox {
2017
position: absolute;
2118
left: -30px;
@@ -29,9 +26,5 @@
2926
}
3027
.vjs__value__string {
3128
color: #13ce66;
32-
&:before,
33-
&:after {
34-
content: "\""
35-
}
3629
}
3730
}

src/components/app.vue

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,25 @@
1818
<brackets-left
1919
:visiable.sync="visiable"
2020
:data="data"
21-
:index="index"
22-
:last-index="lastIndex">
23-
<span v-if="currentDeep > 1 && !Array.isArray(parentData)">{{ index }}:</span>
21+
:not-last-key="notLastKey">
22+
<span v-if="currentDeep > 1 && !Array.isArray(parentData)">{{ currentKey }}:</span>
2423
</brackets-left>
2524

26-
<!-- 数据内容, data 为对象时, index 表示 key, 为数组才表示索引 -->
25+
<!-- 数据内容, data 为对象时, key 表示键名, 为数组时表示索引 -->
2726
<div
28-
v-for="(item, index) in data"
27+
v-for="(item, key) in data"
2928
v-show="visiable"
3029
class="vjs__tree__content"
31-
:key="index">
30+
:key="key">
3231
<vue-json-pretty
3332
:parent-data="data"
3433
:data="item"
3534
:deep="deep"
36-
:path="path + (Array.isArray(data) ? `[${index}]` : `.${index}`)"
35+
:path="path + (Array.isArray(data) ? `[${key}]` : `.${key}`)"
3736
:path-checked="pathChecked"
3837
:path-selectable="pathSelectable"
3938
:selectable-type="selectableType"
40-
:index="index"
39+
:current-key="key"
4140
:current-deep="currentDeep + 1"
4241
@click="handleItemClick">
4342
</vue-json-pretty>
@@ -47,29 +46,31 @@
4746
<brackets-right
4847
:visiable.sync="visiable"
4948
:data="data"
50-
:index="index"
51-
:last-index="lastIndex">
49+
:not-last-key="notLastKey">
5250
</brackets-right>
5351
</template>
5452

55-
<template v-else>
56-
<div :class="{ 'vjs__not__lastIndex': index !== lastIndex }">
57-
<span v-if="isObject(parentData)">{{ index }}:</span>
58-
<!-- data 可能为 null, 因此界面展示转为字符串 -->
59-
<span :class="getValueClass(data)">{{ data + '' }}</span>
60-
</div>
61-
</template>
53+
<simple-text
54+
v-else
55+
:parentDataType="getDataType(parentData)"
56+
:dataType="getDataType(data)"
57+
:text="data + ''"
58+
:notLastKey="notLastKey"
59+
:currentKey="currentKey">
60+
</simple-text>
6261
</div>
6362
</template>
6463

6564
<script>
65+
import SimpleText from './simple-text'
6666
import Checkbox from './checkbox'
6767
import BracketsLeft from './brackets-left'
6868
import BracketsRight from './brackets-right'
6969
7070
export default {
7171
name: 'vue-json-pretty',
7272
components: {
73+
SimpleText,
7374
Checkbox,
7475
BracketsLeft,
7576
BracketsRight
@@ -112,7 +113,8 @@
112113
type: Number,
113114
default: 1
114115
},
115-
index: {}
116+
// 当前树的数据 data 为数组时 currentKey 表示索引, 为对象时表示键名
117+
currentKey: [Number, String]
116118
},
117119
data () {
118120
return {
@@ -123,14 +125,18 @@
123125
},
124126
computed: {
125127
// 获取当前 data 中最后一项的 key 或 索引, 便于界面判断是否添加 ","
126-
lastIndex () {
128+
lastKey () {
127129
if (Array.isArray(this.parentData)) {
128130
return this.parentData.length - 1
129131
} else if (this.isObject(this.parentData)) {
130132
let arr = Object.keys(this.parentData)
131133
return arr[arr.length - 1]
132134
}
133135
},
136+
// 是否不是最后一项
137+
notLastKey () {
138+
return this.currentKey !== this.lastKey
139+
},
134140
// 当前的树是否支持选中功能
135141
selectable () {
136142
return this.pathSelectable(this.path, this.data)
@@ -167,21 +173,12 @@
167173
},
168174
// 工具函数: 判断是否对象
169175
isObject (value) {
170-
return Object.prototype.toString.call(value).slice(8, -1).toLowerCase() === 'object'
176+
return this.getDataType(value) === 'object'
171177
},
172-
// 简单类型数据添加 class, 定义样式
173-
getValueClass (value) {
174-
let dataType = Object.prototype.toString.call(value).slice(8, -1).toLowerCase()
178+
// 获取数据类型
179+
getDataType (value) {
175180
// 若使用 typeof 会影响 webpack 压缩后体积变大
176-
switch (dataType) {
177-
case 'null':
178-
case 'string':
179-
case 'number':
180-
case 'boolean':
181-
return `vjs__value__${dataType}`
182-
default:
183-
return ''
184-
}
181+
return Object.prototype.toString.call(value).slice(8, -1).toLowerCase()
185182
}
186183
}
187184
}

src/components/brackets-left.vue

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
</span>
1010
<span
1111
v-show="!dataVisiable"
12-
:class="{
13-
'vjs__tree__node': true,
14-
'vjs__not__lastIndex': index !== lastIndex
15-
}"
16-
@click.stop="dataVisiable = !dataVisiable">{{ Array.isArray(data) ? '[...]' : '{...}' }}</span>
12+
class="vjs__tree__node"
13+
@click.stop="dataVisiable = !dataVisiable">
14+
{{ bracketsFormatter(Array.isArray(data) ? '[...]' : '{...}') }}
15+
</span>
1716
</div>
1817
</template>
1918

src/components/brackets-right.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<template>
22
<div v-show="dataVisiable">
33
<span
4-
:class="{
5-
'vjs__tree__node': true,
6-
'vjs__not__lastIndex': index !== lastIndex }"
7-
@click.stop="dataVisiable = !dataVisiable">{{ Array.isArray(data) ? ']' : '}' }}</span>
4+
class="vjs__tree__node"
5+
@click.stop="dataVisiable = !dataVisiable">
6+
{{ bracketsFormatter(Array.isArray(data) ? ']' : '}') }}
7+
</span>
88
</div>
99
</template>
1010

src/components/simple-text.vue

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<template>
2+
<div>
3+
<span v-if="parentDataType === 'object'">{{ currentKey }}:</span>
4+
<span :class="`vjs__value__${dataType}`">
5+
{{ textFormatter(text) }}
6+
</span>
7+
<!-- <span v-if="notLastKey">,</span> -->
8+
</div>
9+
</template>
10+
11+
<script>
12+
export default {
13+
props: {
14+
parentDataType: String, // 父级数据类型
15+
dataType: String, // 当前 text 数据类型
16+
text: String,
17+
notLastKey: Boolean,
18+
currentKey: [Number, String]
19+
},
20+
methods: {
21+
textFormatter (text) {
22+
let output = text
23+
if (this.dataType === 'string') output = `"${output}"`
24+
if (this.notLastKey) output += ','
25+
return output
26+
}
27+
}
28+
}
29+
</script>

src/mixins/brackets-mixin.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ export default {
77
data: {
88
required: true
99
},
10-
index: [Number, String],
11-
lastIndex: [Number, String]
10+
notLastKey: Boolean
1211
},
1312
computed: {
1413
dataVisiable: {
@@ -19,5 +18,10 @@ export default {
1918
this.$emit('update:visiable', val)
2019
}
2120
}
21+
},
22+
methods: {
23+
bracketsFormatter (brackets) {
24+
return this.notLastKey ? `${brackets},` : brackets
25+
}
2226
}
2327
}

0 commit comments

Comments
 (0)