vue3+json-editor-vue3实现JSON编辑器

avatar
作者
筋斗云
阅读量:0

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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!