Vue中使用jsonView组件展示JSON数据方法详解

爱懒懒的小景景 2024-12-06 09:19:46编程技术
202

在现代 Web 开发中,JSON 数据的展示和调试是一个常见的需求。为了提高用户体验和开发效率,我们设计并实现了一个名为jsonView的 Vue 组件。这个组件不仅能够以可折叠的方式展示复杂的 JSON 数据,还提供了丰富的样式配置选项,使得 JSON 数据的呈现更加美观和易读。本文将详细介绍jsonView组件的功能和使用方法。

前两天干活儿有个需求,在前端需要展示可折叠的Json树,供开发人员查看,这里采用JsonView组件来实现,它是一款用于展示Json的Vue组件,支持大体积的Json文件快速解析渲染,下面记录一下实现过程。

1.首先先下载好JsonView的组件:JsonView.vue,组件代码如下:

<template>
 <div class="bgView">
  <div :class="['json-view', length ? 'closeable' : '']" :style="'font-size:' + fontSize+'px'">
  <span @click="toggleClose" :class="['angle', innerclosed ? 'closed' : '']" v-if="length">
  </span>
   <div class="content-wrap">
    <p class="first-line">
     <span v-if="jsonKey" class="json-key">"{{jsonKey}}": </span>
     <span v-if="length">
     {{prefix}}
     {{innerclosed ? ('...' + subfix) : ''}}
     <span class="json-note">
      {{innerclosed ? (' // count: ' + length) : ''}}
     </span>
    </span>
     <span v-if="!length">{{isArray ? '[]' : '{}'}}</span>
    </p>
    <div v-if="!innerclosed && length" class="json-body">
     <template v-for="(item, index) in items">
      <json-view :closed="closed" v-if="item.isJSON" :key="index" :json="item.value"
            :jsonKey="item.key" :isLast="index === items.length - 1"></json-view>
      <p class="json-item" v-else :key="index">
      <span class="json-key">
        {{(isArray ? '' : '"' + item.key + '"')}}
      </span>
       :
       <span class="json-value">
        {{item.value + (index === items.length - 1 ? '' : ',')}}
      </span>
      </p>
     </template>
     <span v-show="!innerclosed" class="body-line"></span>
    </div>
    <p v-if="!innerclosed && length" class="last-line">
     <span>{{subfix}}</span>
    </p>
   </div>
  </div>
 </div>
</template>

<script>
 export default {
  name: 'jsonView',
  props: {
   json: [Object, Array],
   jsonKey: {
    type: String,
    default: ''
   },
   closed: {
    type: Boolean,
    default: false
   },
   isLast: {
    type: Boolean,
    default: true
   },
   fontSize: {
    type: Number,
    default: 13
   }
  },
  created() {
   this.innerclosed = this.closed
   this.$watch('closed', () => {
    this.innerclosed = this.closed
   })
  },
  data() {
   return {
    innerclosed: true
   }
  },
  methods: {
   isObjectOrArray(source) {
    const type = Object.prototype.toString.call(source)
    const res = type === '[object Array]' || type === '[object Object]'
    return res
   },
   toggleClose() {
    if (this.innerclosed) {
     this.innerclosed = false
    } else {
     this.innerclosed = true
    }
   }
  },
  computed: {
   isArray() {
    return Object.prototype.toString.call(this.json) === '[object Array]'
   },
   length() {
    return this.isArray ? this.json.length : Object.keys(this.json).length
   },
   subfix() {
    return (this.isArray ? ']' : '}') + (this.isLast ? '' : ',')
   },
   prefix() {
    return this.isArray ? '[' : '{'
   },
   items() {
    if (this.isArray) {
     return this.json.map(item => {
      const isJSON = this.isObjectOrArray(item)
      return {
       value: isJSON ? item : JSON.stringify(item),
       isJSON,
       key: ''
      }
     })
    }
    const json = this.json
    return Object.keys(json).map(key => {
     const item = json[key]
     const isJSON = this.isObjectOrArray(item)
     return {
      value: isJSON ? item : JSON.stringify(item),
      isJSON,
      key
     }
    })
   }
  }
 }
</script>

<style>
 .bgView {
  background-color: #fafafa;
 }

 .json-view {
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
  white-space: nowrap;
  padding-left: 20px;
  box-sizing: border-box;
 }

 .json-note {
  color: #909399;
 }

 .json-key {
  color: rgb(147, 98, 15);
 }

 .json-value {
  color: rgb(24, 186, 24);
 }

 .json-item {
  margin: 0;
  padding-left: 20px;
 }

 .first-line {
  padding: 0;
  margin: 0;
 }

 .json-body {
  position: relative;
  padding: 0;
  margin: 0;
 }

 .json-body .body-line {
  position: absolute;
  height: 100%;
  width: 0;
  border-left: dashed 1px #bbb;
  top: 0;
  left: 2px;
 }

 .last-line {
  padding: 0;
  margin: 0;
 }

 .angle {
  position: absolute;
  display: block;
  cursor: pointer;
  float: left;
  width: 20px;
  text-align: center;
  left: 0;
 }

 .angle::after {
  content: "";
  display: inline-block;
  width: 0;
  height: 0;
  vertical-align: middle;
  border-top: solid 4px #333;
  border-left: solid 6px transparent;
  border-right: solid 6px transparent;
 }

 .angle.closed::after {
  border-left: solid 4px #333;
  border-top: solid 6px transparent;
  border-bottom: solid 6px transparent;
 }
</style>

2.在需要使用的vue页面中引用JsonView组件

import JsonView from '@/components/JsonView'

3.定义Json数据变量

jsonData:{},

4.页面展示代码

<JsonView :json="jsonData"></JsonView>

5.实现效果如下:

Vue中使用jsonView组件展示JSON数据方法详解

JsonViewAttributes

Vue中使用jsonView组件展示JSON数据方法详解

总结

jsonView组件通过其简洁而强大的功能,为开发者提供了一种高效且美观的方式来展示 JSON 数据。无论是简单的对象还是复杂的嵌套数组,jsonView都能轻松应对。通过灵活的属性配置和样式定义,开发者可以根据实际需求定制组件的外观和行为。无论是在前端调试工具中,还是在用户界面中,jsonView都是一个值得推荐的选择。希望本文的介绍能够帮助读者更好地理解和使用这一实用的 Vue 组件。

vue jsonview json
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

Vue中配置代理服务器(proxy)的3种方法示例详解
Vue.js 是一个非常流行的框架,用于构建用户界面。然而,在开发过程中,我们经常会遇到跨域问题,尤其是在前后端分离的项目中。为了解决这一问题,Vue 提供了多种配置代理服务...
2025-01-15 编程技术
165

Vue中实现文件下载的6种方法详解
​在现代Web开发中,文件下载是一个常见的需求。Vue.js作为一款流行的前端框架,提供了多种实现文件下载的方法。本文将详细介绍6种在Vue项目中实现文件下载的常用方法,每种方...
2025-01-14 编程技术
212

Element UI组件库在Vue中的使用方法详解
Element UI作为一款基于Vue 2.0开发的桌面端组件库,提供了丰富的组件和灵活的配置选项,极大地简化了开发流程。本文将详细介绍Element UI组件库在Vue中的使用方法,并通过具...
2025-01-13 编程技术
160

Vue中使用Axios发送FormData请求的方法详解
Axios是一个基于Promise的HTTP客户端,支持浏览器和Node.js环境,广泛应用于Vue项目中。本文将详细介绍如何在Vue中使用Axios发送FormData请求,帮助开发者更轻松地实现文件上...
2025-01-10 编程技术
159

在Vue项目中关闭ESLint检查的方法详解
在使用 Vue.js 开发项目时,ESLint 作为一个代码质量和风格检查工具,有时会显得过于严格,导致开发效率下降。因此,有时我们需要在 Vue 项目中关闭 ESLint 检查,以便更快地...
2025-01-09 编程技术
166

json转excel工具:在线一键将json数据转换成excel表格的实用工具!
json转excel工具是一款便捷的在线转换工具,它允许用户直接在网页上将JSON格式数据粘贴并转换成Excel表格(CSV)格式。这一过程无需复杂的操作,只需简单的复制粘贴和点击转换,...
2025-01-03 新闻资讯
189