|
11 | 11 | }"
|
12 | 12 | @click="handleClick"
|
13 | 13 | @mouseover.stop="handleMouseover"
|
14 |
| - @mouseout.stop="handleMouseout" |
15 |
| - > |
| 14 | + @mouseout.stop="handleMouseout"> |
16 | 15 | <template v-if="showSelectController && selectable">
|
17 |
| - <vue-checkbox |
18 |
| - v-if="isMultiple" |
19 |
| - v-model="currentCheckboxVal" |
20 |
| - @change="handleValueChange('checkbox')" |
21 |
| - /> |
22 |
| - <vue-radio |
23 |
| - v-else-if="isSingle" |
24 |
| - v-model="model" |
25 |
| - :path="path" |
26 |
| - @change="handleValueChange('radio')" |
27 |
| - /> |
| 16 | + <vue-checkbox v-if="isMultiple" v-model="currentCheckboxVal" @change="handleValueChange('checkbox')"></vue-checkbox> |
| 17 | + <vue-radio v-else-if="isSingle" v-model="model" @change="handleValueChange('radio')" :path="path"></vue-radio> |
28 | 18 | </template>
|
29 | 19 |
|
30 | 20 | <template v-if="Array.isArray(data) || isObject(data)">
|
|
33 | 23 | :visible.sync="visible"
|
34 | 24 | :data="data"
|
35 | 25 | :show-length="showLength"
|
36 |
| - :show-comma="notLastKey" |
37 |
| - > |
38 |
| - <span |
39 |
| - v-if="currentDeep > 1 && !Array.isArray(parentData)" |
40 |
| - class="vjs-key" |
41 |
| - >{{ keyFormatter(currentKey) }}:</span> |
| 26 | + :collapsed-on-click-brackets="collapsedOnClickBrackets" |
| 27 | + :show-comma="notLastKey"> |
| 28 | + <span v-if="currentDeep > 1 && !Array.isArray(parentData)" class="vjs-key">{{ keyFormatter(currentKey) }}:</span> |
42 | 29 | </brackets-left>
|
43 | 30 |
|
44 | 31 | <!-- 数据内容, data 为对象时, key 表示键名, 为数组时表示索引 -->
|
45 | 32 | <div
|
46 | 33 | v-for="(item, key) in data"
|
47 | 34 | v-show="visible"
|
48 |
| - :key="key" |
49 | 35 | :class="{
|
50 | 36 | 'vjs-tree__content': true,
|
51 | 37 | 'has-line': showLine
|
52 | 38 | }"
|
53 |
| - > |
| 39 | + :key="key"> |
54 | 40 | <vue-json-pretty
|
55 | 41 | v-model="model"
|
56 | 42 | :parent-data="data"
|
|
66 | 52 | :selectable-type="selectableType"
|
67 | 53 | :show-select-controller="showSelectController"
|
68 | 54 | :select-on-click-node="selectOnClickNode"
|
| 55 | + :collapsed-on-click-brackets="collapsedOnClickBrackets" |
69 | 56 | :current-key="key"
|
70 | 57 | :current-deep="currentDeep + 1"
|
| 58 | + :custom-value-formatter="customValueFormatter" |
71 | 59 | @click="handleItemClick"
|
72 |
| - @change="handleItemChange" |
73 |
| - /> |
| 60 | + @change="handleItemChange"> |
| 61 | + </vue-json-pretty> |
74 | 62 | </div>
|
75 | 63 |
|
76 | 64 | <!-- 右闭合 -->
|
77 | 65 | <brackets-right
|
78 | 66 | :visible.sync="visible"
|
79 | 67 | :data="data"
|
80 |
| - :show-comma="notLastKey" |
81 |
| - /> |
| 68 | + :collapsed-on-click-brackets="collapsedOnClickBrackets" |
| 69 | + :show-comma="notLastKey"> |
| 70 | + </brackets-right> |
82 | 71 | </template>
|
83 | 72 |
|
84 | 73 | <simple-text
|
85 | 74 | v-else
|
| 75 | + :custom-value-formatter="customValueFormatter" |
86 | 76 | :show-double-quotes="showDoubleQuotes"
|
87 | 77 | :show-comma="notLastKey"
|
88 | 78 | :parent-data="parentData"
|
89 | 79 | :data="data"
|
90 |
| - :current-key="currentKey" |
91 |
| - > |
| 80 | + :current-key="currentKey"> |
92 | 81 | <span
|
93 | 82 | v-if="parentData && currentKey && !Array.isArray(parentData)"
|
94 | 83 | class="vjs-key"
|
|
108 | 97 | import { getDataType } from 'src/utils'
|
109 | 98 |
|
110 | 99 | export default {
|
111 |
| - name: 'VueJsonPretty', |
| 100 | + name: 'vue-json-pretty', |
112 | 101 | components: {
|
113 | 102 | SimpleText,
|
114 | 103 | VueCheckbox,
|
|
119 | 108 | props: {
|
120 | 109 | /* outer props */
|
121 | 110 | // 当前树的数据
|
122 |
| - data: { |
123 |
| - type: [String, Number, Boolean, Array, Object], |
124 |
| - default: null |
125 |
| - }, |
| 111 | + data: {}, |
126 | 112 | // 定义树的深度, 大于该深度的子树将不被展开
|
127 | 113 | deep: {
|
128 | 114 | type: Number,
|
|
183 | 169 | type: Boolean,
|
184 | 170 | default: true
|
185 | 171 | },
|
| 172 | + // collapsed control |
| 173 | + collapsedOnClickBrackets: { |
| 174 | + type: Boolean, |
| 175 | + default: true |
| 176 | + }, |
| 177 | + // custom formatter for values |
| 178 | + customValueFormatter: { |
| 179 | + type: Function, |
| 180 | + default: null |
| 181 | + }, |
186 | 182 | /* outer props */
|
187 | 183 |
|
188 | 184 | /* inner props */
|
189 | 185 | // 当前树的父级数据
|
190 |
| - parentData: { |
191 |
| - type: [String, Number, Boolean, Array, Object], |
192 |
| - default: null |
193 |
| - }, |
| 186 | + parentData: {}, |
194 | 187 | // 当前树的深度, 以根节点作为0开始, 所以第一层树的深度为1, 递归逐次递增
|
195 | 188 | currentDeep: {
|
196 | 189 | type: Number,
|
197 | 190 | default: 1
|
198 | 191 | },
|
199 | 192 | // 当前树的数据 data 为数组时 currentKey 表示索引, 为对象时表示键名
|
200 |
| - currentKey: { |
201 |
| - type: [Number, String], |
202 |
| - default: '' |
203 |
| - } |
| 193 | + currentKey: [Number, String] |
204 | 194 | /* outer props */
|
205 | 195 | },
|
206 | 196 | data () {
|
|
229 | 219 | let arr = Object.keys(this.parentData)
|
230 | 220 | return arr[arr.length - 1]
|
231 | 221 | }
|
232 |
| - return '' |
233 | 222 | },
|
234 | 223 |
|
235 | 224 | // 是否不是最后一项
|
|
267 | 256 | return error ? 'When selectableType is not null, selectOnClickNode and showSelectController cannot be false at the same time, because this will cause the selection to fail.' : ''
|
268 | 257 | }
|
269 | 258 | },
|
270 |
| - watch: { |
271 |
| - deep (newVal) { |
272 |
| - this.visible = this.currentDeep <= newVal |
273 |
| - }, |
274 |
| - propsError: { |
275 |
| - handler (message) { |
276 |
| - if (message) { |
277 |
| - throw new Error(`[vue-json-pretty] ${message}`) |
278 |
| - } |
279 |
| - }, |
280 |
| - immediate: true |
281 |
| - } |
282 |
| - }, |
283 | 259 | methods: {
|
284 | 260 | handleValueChange (emitType) {
|
285 | 261 | if (this.isMultiple && (emitType === 'checkbox' || emitType === 'tree')) {
|
|
358 | 334 | // 因为是递归组件,因此错误只对外暴露一次,子组件的错误不再对外传递
|
359 | 335 | errorCaptured () {
|
360 | 336 | return false
|
| 337 | + }, |
| 338 | + watch: { |
| 339 | + deep (newVal) { |
| 340 | + this.visible = this.currentDeep <= newVal |
| 341 | + }, |
| 342 | + propsError: { |
| 343 | + handler (message) { |
| 344 | + if (message) { |
| 345 | + throw new Error(`[vue-json-pretty] ${message}`) |
| 346 | + } |
| 347 | + }, |
| 348 | + immediate: true |
| 349 | + } |
361 | 350 | }
|
362 | 351 | }
|
363 | 352 | </script>
|
0 commit comments