Vue中使用JsonView来展示Json树的实例代码


Posted in Javascript onNovember 16, 2020

前两天干活儿有个需求,在前端需要展示可折叠的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树的实例代码

到此这篇关于Vue之使用JsonView来展示Json树的文章就介绍到这了,更多相关Vue使用JsonView展示Json树内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript Distilled 基础知识与函数
Apr 07 Javascript
简单的ajax连接库分享(不用jquery的ajax)
Jan 19 Javascript
jquery常用特效方法使用示例
Apr 25 Javascript
JavaScript Math.floor方法(对数值向下取整)
Jan 09 Javascript
EasyUI创建对话框的两种方式
Aug 23 Javascript
AngularJS 自定义过滤器详解及实例代码
Sep 14 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
Nov 24 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
基于BootStrap的文本编辑器组件Summernote
Oct 27 Javascript
Vuex 快速入门(简单易懂)
Sep 20 Javascript
JavaScript监听键盘事件代码实现
Jun 03 Javascript
从源码角度来回答keep-alive组件的缓存原理
Jan 18 Javascript
Vue 数据绑定的原理分析
Nov 16 #Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
Nov 16 #Javascript
Vue指令实现OutClick的示例
Nov 16 #Javascript
浅谈vue在html中出现{{}}的原因及解决方式
Nov 16 #Javascript
vue组件中传值EventBus的使用及注意事项说明
Nov 16 #Javascript
小程序自定义弹框效果
Nov 16 #Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
Nov 16 #Javascript
You might like
php 移除数组重复元素的一点说明
2008/11/27 PHP
php 操作符与控制结构
2012/03/07 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
Jquery 弹出层插件实现代码
2009/10/24 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
Python使用python-docx读写word文档
2019/08/26 Python
python+django+rest框架配置创建方法
2019/08/31 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
python 命名规范知识点汇总
2020/02/14 Python
Python常用数据分析模块原理解析
2020/07/20 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
房屋改造计划书
2014/01/10 职场文书
承诺书怎么写
2014/03/26 职场文书
调查研究项目计划书
2014/04/29 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
Python实现Hash算法
2022/03/18 Python
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python