<!-- * @FileDescription: JSON 数组 预览组件 * @Date: 2023-05-29 * @LastEditTime: 2023-05-29 --> <script setup lang="ts"> import { ref } from 'vue'; import ObjView from './ObjView.vue'; import HtmlView from './HtmlView.vue'; import { isObject, isArray, isLastArr } from '../utils'; interface IDetailProps { data: any; isLast?: boolean; mainColor?: string; objSideColor?: string; arrSideColor?: string; stringColor?: string; numberColor?: string; booleanColor?: string; nullColor?: string; otherColor?: string; } const props = withDefaults(defineProps<IDetailProps>(), { data: () => { return {}; }, isLast: true, }); const show = ref(true); function clickStart() { show.value = !show.value; } </script> <template> <div style="font-family: 'Gill Sans', sans-serif; position: relative"> <div :style="{ color: arrSideColor }" class="obj-side-start"> <q-icon :name="show ? 'bi-dash-square' : 'bi-plus-square'" @click="clickStart" class="icon-action" /> [ </div> <div style="padding-left: 16px" v-show="show"> <template v-for="(m, n) in props.data" :key="n"> <div v-if="isObject(m) && Object.keys(m).length > 0"> <obj-view v-bind="props" :data="m" :is-last="isLastArr(n, props.data)" /> </div> <div v-else-if="isArray(m) && m.length > 0"> <arr-view v-bind="props" :data="m" :is-last="isLastArr(n, props.data)" /> </div> <div v-else> <html-view v-bind="props" :data="m" :is-last="isLastArr(n, props.data)" /> </div> </template> </div> <div v-show="!show" class="hide-text" :style="{ color: arrSideColor }"> ... </div> <div class="obj-side-end" v-show="show"> <span :style="{ color: arrSideColor }">]</span> <span v-if="!props.isLast" :style="{ color: mainColor }"> ,</span> </div> </div> </template> <style lang="scss" scoped> .obj-side-start { // padding: 0 8px; .icon-action { &:hover { cursor: pointer; } } } .obj-side-end { // padding: 0 8px; } .hide-text { position: absolute; top: 0; left: 46px; &::after { position: absolute; content: ']'; right: -8px; } } </style>