1. 安装
使用npm:
$ npm install vue-json-viewer@2 --save
// Vue2
$ npm install vue-json-viewer@3 --save
// Vue3
使用yarm:
$ yarn add vue-json-viewer@2
// Vue2
$ yarn add vue-json-viewer@3
// Vue3
使用pnpm也可以
2. 使用方法
在main.ts中注册插件
import { createApp } from 'vue';
import JsonViewer from 'vue-json-viewer'
import App from './App.vue';
const app = createApp(App);
app.use(JsonViewer )
app.mount('#app');
在界面中使用
<template>
<json-viewer
:value="data"
:expand-depth="5"
copyable
boxed
sort
class="w-100%"></json-viewer>
</template>
<script setup lang="ts">
const data = {// 注意:绑定得数据一定是JSON,而不是JSON字符串
total: 25,
limit: 10,
data: [
{
id: '5968fcad629fa84ab65a5247',
firstname: 'Ada',
lastname: 'Lovelace',
},
],
};
</script>
注意:在main.ts文件中可能会出现以下得ts类型报错:
无法找到模块“vue-json-viewer”的声明文件。
解决方法:
- 先尝试安装
npm i --save-dev @types/vue-json-viewer
- 如果上面方法不行,在全局的
.d.ts
结尾的文件中添加上declare module 'vue-json-viewer'
3. json-viewer属性和方法
json-viewer属性:
json-viewer事件监听:
json-viewer插槽:
json-viewer快捷键:
4. 表格中原始数据和格式化数据切换
实现:给表格中每行数据单独添加一个变量,用于单独控制展示的方式。
//获取到表格数据后,添加一个自定义变量,记录json显示的方式
state.tableData.forEach((item) => {
item.showJsonView = false;
});
<!--el-table-column 插槽中 -->
<template #default="scope">
<div v-if="col.key === 'accountConfig'">
<el-link
type="primary"
:underline="false"
@click="() => (scope.row.showJsonView = !scope.row.showJsonView)">
{{ scope.row.showJsonView ? '原始数据' : '格式化数据' }}
</el-link>
<div v-if="scope.row.showJsonView">
<json-viewer
:value="JSON.parse(scope.row[col.key])"
:expand-depth="1"
copyable></json-viewer>
</div>
<div v-else>
<pre class="text-pre-wrap">{{ scope.row[col.key] }}</pre>
</div>
</div>
<div v-else>
{{ scope.row[col.key] }}
</div>
</template>
注:如果表格中有el-switch
, 单独控制每行的操作,请求时显示的loading
,也是同样的方法实现。
5. 自定义主题:
- 添加
theme="my-awesome-json-theme"
到JsonViewer的组件属性上 - 复制粘贴下面的模板并且根据自定义的theme名称做对应调整。
// values are default one from jv-light template
.my-awesome-json-theme {
background: #fff;
white-space: nowrap;
color: #525252;
font-size: 14px;
font-family: Consolas, Menlo, Courier, monospace;
.jv-ellipsis {
color: #999;
background-color: #eee;
display: inline-block;
line-height: 0.9;
font-size: 0.9em;
padding: 0px 4px 2px 4px;
border-radius: 3px;
vertical-align: 2px;
cursor: pointer;
user-select: none;
}
.jv-button { color: #49b3ff }
.jv-key { color: #111111 }
.jv-item {
&.jv-array { color: #111111 }
&.jv-boolean { color: #fc1e70 }
&.jv-function { color: #067bca }
&.jv-number { color: #fc1e70 }
&.jv-number-float { color: #fc1e70 }
&.jv-number-integer { color: #fc1e70 }
&.jv-object { color: #111111 }
&.jv-undefined { color: #e08331 }
&.jv-string {
color: #42b983;
word-break: break-word;
white-space: normal;
}
}
.jv-code {
.jv-toggle {
&:before {
padding: 0px 2px;
border-radius: 2px;
}
&:hover {
&:before {
background: #eee;
}
}
}
}
}