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 相关文章推荐
JS删除数组元素的函数介绍
Mar 27 Javascript
AngularJS入门之动画
Jul 27 Javascript
BootStrap实现文件上传并带有进度条效果
Sep 11 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
Sep 15 Javascript
Angular 5.x 学习笔记之Router(路由)应用
Apr 08 Javascript
JS 封装父页面子页面交互接口的实例代码
Jun 25 Javascript
JavaScript和TypeScript中的void的具体使用
Sep 12 Javascript
javascript实现评分功能
Jun 24 Javascript
在vue中使用echarts(折线图的demo,markline用法)
Jul 20 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
Jul 22 Javascript
vue实现放大镜效果
Sep 17 Javascript
JavaScript数组常用的增删改查与其他属性详解
Oct 13 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
php阻止页面后退的方法分享
2014/02/17 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
javascript常用对话框小集
2013/09/13 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
Python中if __name__ == &quot;__main__&quot;详细解释
2014/10/21 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
python实现媒体播放器功能
2018/02/11 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
电大毕业生自我鉴定
2013/11/10 职场文书
简历中自我评价范文3则
2013/12/14 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
贷款担保书范本
2015/09/22 职场文书
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android