yanjinhui
10 天以前 c5de0d98241f8c8349fa38851b77efcfc61e4d26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<script setup lang="ts">
import VueJsonPretty from 'vue-json-pretty'
import 'vue-json-pretty/lib/styles.css'
import { propTypes } from '@/utils/propTypes'
import { computed } from 'vue'
 
const emits = defineEmits([
  'update:modelValue',
  'node-click',
  'brackets-click',
  'icon-click',
  'selected-value'
])
 
const props = defineProps({
  modelValue: {
    type: Object,
    default: () => ({})
  },
  deep: propTypes.number.def(5),
  showLength: propTypes.bool.def(true),
  showLineNumbers: propTypes.bool.def(true),
  showLineNumber: propTypes.bool.def(true),
  showIcon: propTypes.bool.def(true),
  showDoubleQuotes: propTypes.bool.def(true),
  virtual: propTypes.bool.def(false),
  height: propTypes.number.def(400),
  itemHeight: propTypes.number.def(20),
  rootPath: propTypes.string.def('root'),
  nodeSelectable: propTypes.func.def(),
  selectableType: propTypes.oneOf<'multiple' | 'single'>(['multiple', 'single']).def(),
  showSelectController: propTypes.bool.def(false),
  selectOnClickNode: propTypes.bool.def(true),
  highlightSelectedNode: propTypes.bool.def(true),
  collapsedOnClickBrackets: propTypes.bool.def(true),
  renderNodeKey: propTypes.func.def(),
  renderNodeValue: propTypes.func.def(),
  editable: propTypes.bool.def(true),
  editableTrigger: propTypes.oneOf<'click' | 'dblclick'>(['click', 'dblclick']).def('click')
})
 
const data = computed(() => props.modelValue)
 
const localModelValue = computed({
  get: () => data.value,
  set: (val) => {
    console.log(val)
    emits('update:modelValue', val)
  }
})
 
const nodeClick = (node: any) => {
  emits('node-click', node)
}
 
const bracketsClick = (collapsed: boolean) => {
  emits('brackets-click', collapsed)
}
 
const iconClick = (collapsed: boolean) => {
  emits('icon-click', collapsed)
}
 
const selectedChange = (newVal: any, oldVal: any) => {
  console.log(newVal, oldVal)
  emits('selected-value', newVal, oldVal)
}
</script>
 
<template>
  <VueJsonPretty
    v-model:data="localModelValue"
    :deep="deep"
    :show-length="showLength"
    :show-line-numbers="showLineNumbers"
    :show-line-number="showLineNumber"
    :show-icon="showIcon"
    :show-double-quotes="showDoubleQuotes"
    :virtual="virtual"
    :height="height"
    :item-height="itemHeight"
    :root-path="rootPath"
    :node-selectable="nodeSelectable"
    :selectable-type="selectableType"
    :show-select-controller="showSelectController"
    :select-on-click-node="selectOnClickNode"
    :highlight-selected-node="highlightSelectedNode"
    :collapsed-on-click-brackets="collapsedOnClickBrackets"
    :render-node-key="renderNodeKey"
    :render-node-value="renderNodeValue"
    :editable="editable"
    :editable-trigger="editableTrigger"
    @node-click="nodeClick"
    @brackets-click="bracketsClick"
    @icon-click="iconClick"
    @selected-change="selectedChange"
  />
</template>