json-editor-vue3 GitHub官网:GitHub - guyue88/json-editor-vue3
一. 介绍
基于 jsoneditor
开发的vue3 json editor,支持全屏编辑,有完善的事件回调,可以在失去焦点时,对编辑器内容做校验。
二. 安装
npm install json-editor-vue3
三. 全局安装
import Vue from 'vue'
import JsonEditorVue from 'json-editor-vue3'
Vue.use(JsonEditorVue)
四. 关于:vue3+ts无法渲染,报错 jsoneditor does not provide an export named 'default'
1. 安装插件 @originjs/vite-plugin-commonjs
npm install @originjs/vite-plugin-commonjs
2. vite.config.js 内
// vite.config.js
import { viteCommonjs } from '@originjs/vite-plugin-commonjs'
export default defineConfig({
plugins: [vue(),viteCommonjs()],
})
五. 完整项目代码(将代码中接口相关代码替换成自己的!!!)
<script lang="ts" setup>
import { ref, onMounted } from "vue";
import { message } from "ant-design-vue";
// 数据源
const data = ref();
// 是否存在错误
const errors = ref(0);
// 错误行数
const line = ref();
// 获取 接口字段
const classify = ref("ABC");
// 修改接口 字段
const setJson = ref({
classify: "",
jsonData: "",
});
// 获取JSON
const getJson = async () => {
const res = await 获取JSON数据接口;
data.value = res.data;
};
getJson();
// 数据更新时触发
const updataModel = (val: any) => {
data.value = val;
};
// 数据错误时触发
const editError = (a: any, error: any) => {
errors.value = error.length;
if (error[0]) {
line.value = error[0].line;
}
};
// 保存修改
const btn_save = async () => {
if (errors.value == 0) {
const toJson = JSON.stringify(data.value);
setJson.value.classify = classify.value;
setJson.value.jsonData = toJson;
await 更改JSON数据接口;
message.success("保存成功");
} else {
message.error("保存失败,第 " + line.value + " 行存在格式错误");
}
};
// 重置内容
const btn_reload = () => {
getJson();
};
// CDE按钮
const get_Json = (type: any) => {
if (type == "ABC") {
classify.value = type;
}
if (type == "TASk") {
classify.value = type;
}
if (type == "SYSTEM") {
classify.value = type;
}
if (type == "REBAR") {
classify.value = type;
}
if (type == "DICT") {
classify.value = type;
}
getJson();
};
onMounted(() => {
// 删除右上角logo和全屏按钮
const a = document.getElementsByClassName("jsoneditor-poweredBy");
const full = document.getElementsByClassName("full-screen");
const aArray = Array.from(a);
const fullArray = Array.from(full);
// 遍历数组并移除每个元素
aArray.forEach((element) => {
if (element.parentNode) {
element.parentNode.removeChild(element);
}
});
fullArray.forEach((element) => {
if (element.parentNode) {
element.parentNode.removeChild(element);
}
});
});
</script>
<template>
<div>
<div class="btn_style">
<div class="btn_left">
<!-- 更换不同数据源(带有选中效果) -->
<a-button
:type="classify === 'ABC' ? 'primary' : 'dashed'"
@click="get_Json('ABC')"
>Abc</a-button
>
<a-button
:type="classify === 'TASk' ? 'primary' : 'dashed'"
@click="get_Json('TASk')"
>Task</a-button
>
<a-button
:type="classify === 'SYSTEM' ? 'primary' : 'dashed'"
@click="get_Json('SYSTEM')"
>System</a-button
>
<a-button
:type="classify === 'REBAR' ? 'primary' : 'dashed'"
@click="get_Json('REBAR')"
>REBAR</a-button
>
<a-button
:type="classify === 'DICT' ? 'primary' : 'dashed'"
@click="get_Json('DICT')"
>DICT</a-button
>
</div>
<div class="btn_right">
<a-button danger ghost @click="btn_reload">复原</a-button>
<a-button type="primary" ghost @click="btn_save">保存</a-button>
</div>
</div>
<json-editor-vue
@update:modelValue="updataModel"
@validationError="editError"
class="editor"
v-model="data"
style="height: 94vh; position: relative"
/>
</div>
</template>
<style scoped>
.btn_save {
position: absolute;
top: 0;
right: 0;
}
.btn_reload {
position: absolute;
top: 0;
right: 60px;
}
.btn_style {
display: flex;
width: 100%;
justify-content: space-between;
padding: 10px 16px 16px;
box-sizing: border-box;
height: 50px;
}
.btn_left {
width: 380px;
display: flex;
justify-content: space-between;
}
.btn_right {
width: 140px;
display: flex;
justify-content: space-between;
}
</style>
注:本项目中,按钮样式、成功失败提示,使用 Ant-Design-Vue插件,按需安装插件。官方网址:Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js