Vue3集成json-editor-vue3的代碼實(shí)現(xiàn)
安裝依賴
npm install json-editor-vue3 --save
引入
main.js
import "jsoneditor";
具體模塊
import JsonEditorVue from 'json-editor-vue3';
代碼實(shí)現(xiàn)
<json-editor-vue ref="jsonEditor" class="editor" v-model="state.addFormField.powerTypes" @keyup="jsonValidate" />
完整代碼
<template> <div> <div class="card-wrap" style="padding: 0 12px;"> <el-form :model="state.queryParams" ref="queryRef" :inline="true" class="form-search-wrap"> <el-form-item label="code"> <el-input v-model="state.queryParams.code" clearable style="width: 240px" /> </el-form-item> <el-form-item> <el-button type="primary" icon="Search" @click="getList()">Search</el-button> <el-button icon="Refresh" @click="resetSearchForm">Reset</el-button> </el-form-item> </el-form> </div> <div class="card-wrap" style="padding-bottom: 100px;"> <div class="operation-wrap"> <el-button type="primary" @click="handleEdit(null, 1)">Add</el-button> <el-button type="danger" @click="batchRemove" >Remove</el-button> </div> <el-table :data="state.tableData" v-loading="state.loading" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" /> <el-table-column prop="code" label="Code"></el-table-column> <el-table-column prop="value" label="Value"></el-table-column> <el-table-column prop="i18n" label="I18n"></el-table-column> <el-table-column label="Operation" align="center"> <template #default="scope"> <el-button type="primary" icon="Edit" @click="handleEdit(scope.row, 0)" circle /> <el-button type="danger" icon="Delete" @click="remove(scope.row.id, 0)" circle /> </template> </el-table-column> </el-table> <div class="pagination"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="state.queryParams.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.queryParams.size" layout="total, sizes, prev, pager, next, jumper" :total="state.queryParams.total"> </el-pagination> </div> </div> <el-dialog :title="state.type?'add':'update'" v-model="state.dialogVisible" width="30%" destroy-on-close @close='resetForm'> <el-form ref="addForm" :rules="state.rules" :model="state.addFormField" label-width="100px"> <el-form-item label="code" prop="code"> <el-input v-model="state.addFormField.code" style="width: 80%;" ></el-input> </el-form-item> <el-form-item label="value" prop="value"> <el-input v-model="state.addFormField.value" style="width: 80%;" ></el-input> </el-form-item> <el-form-item label="i18n" prop="i18n"> <el-input v-model="state.addFormField.i18n" style="width: 80%;" ></el-input> </el-form-item> <el-form-item label="numberOfEngine" prop="numberOfEngine"> <el-input v-model="state.addFormField.numberOfEngine" style="width: 80%;" ></el-input> </el-form-item> <el-form-item label="powerTypes" prop="powerTypes"> <json-editor-vue ref="jsonEditor" class="editor" v-model="state.addFormField.powerTypes" @keyup="jsonValidate" /> </el-form-item> <el-form-item label="siebelCode" prop="siebelCode"> <el-input v-model="state.addFormField.siebelCode" style="width: 80%;" ></el-input> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="state.dialogVisible = false">Cancel</el-button> <el-button type="primary" @click="add">Confirm</el-button> </span> </template> </el-dialog> </div> </template> <script setup> import { reactive, ref } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; import * as api from '@/api/dic/common'; import JsonEditorVue from 'json-editor-vue3'; const addForm = ref(); const jsonEditor = ref(); const moduleUrl = "boatType"; const state = reactive({ multipleSelection: [], dialogVisible: false, jsonEditFlag: true, num: 1, loading: false, type: "add", tableData: [], addFormField: { id: "", code: "", value: "", i18n: "", numberOfEngine: "", powerTypes: "", siebelCode: "", }, queryParams: { code: undefined, page: 1, size: 10, total: 0, }, rules: { code: [ { required: "true", message: "code is required", trigger: ["change"] }, ], value: [ { required: "true", message: "value is required", trigger: ["change"] }, ], i18n: [ { required: "true", message: "i18n is required", trigger: ["change"] }, ], }, }); async function jsonValidate () { if (jsonEditor.value) { const res = await jsonEditor.value.editor.validate(); if(res.length != 0){ state.jsonEditFlag = false; }else { state.jsonEditFlag = true; } } } function handleSelectionChange(val) { state.multipleSelection = val } function commonRemove(idList) { ElMessageBox.confirm('Are you sure to remove this data?') .then(() => { api .remove({idList: idList}, moduleUrl) .then((res) => { ElMessage.success("success"); }) .finally(() => { state.loading = false; }); setTimeout(() => { getList(); }, 300); }) } function remove(id){ let idList = []; idList.push(id) commonRemove(idList); } function batchRemove() { if(state.multipleSelection == undefined || state.multipleSelection.length <= 0){ ElMessage.warning("Please select checkbox"); return; } let idList = []; state.multipleSelection.forEach((value, index) => { idList.push(value.id) }); commonRemove(idList); } function handleEdit(row, type){ if(row){ state.addFormField = JSON.parse(JSON.stringify(row)); } if (type) { state.type = true; } else{ state.type = false; } state.dialogVisible = true; } function resetForm(){ state.addFormField = { id: undefined, code: undefined, value: undefined, i18n: undefined, } } function resetSearchForm(){ state.queryParams.code = undefined; } function add(){ addForm.value.validate((valid) => { if(!state.jsonEditFlag){ ElMessage.error("JSON input wrong format"); return ; } if (valid) { let id = state.addFormField.id; if (id) { api .update(state.addFormField, moduleUrl) .then((res) => { ElMessage.success("success"); }) .finally(() => { state.loading = false; }); }else{ api .add(state.addFormField, moduleUrl) .then((res) => { ElMessage.success("success"); }) .finally(() => { state.loading = false; }); } resetForm(); state.dialogVisible = false; setTimeout(() => { getList(); }, 200); } else { return false; } }); } function getList(){ state.loading = true; let data = {}; if(state.queryParams){ data = JSON.stringify(state.queryParams).replace(/:/g, '=').replace(/,/g, '&').replace(/{/g, '?').replace(/}/g, '').replace(/"/g, ''); } api .getList(data, moduleUrl) .then((res) => { state.tableData = res.items; state.queryParams.page = res.page; state.queryParams.size = res.size; state.queryParams.total = res.total; }) .finally(() => { state.loading = false; }); } function handleSizeChange(val){ state.queryParams.size = val; getList(); } function handleCurrentChange(val){ state.queryParams.page = val; getList(); } getList(); </script> <style scoped > /deep/ .el-dialog{ width: 50%; } /deep/ .el-form-item--default{ margin-left: 30px; } .pagination { background: #fff; padding: 20px 10px 0; display: flex; justify-content: flex-end; box-sizing: border-box; } .card-wrap{ padding: 15px 20px 20px 20px; border-radius: 4px; border: 1px solid #e6ebf5; background-color: #fff; overflow: hidden; color: #303133; -webkit-transition: .3s; transition: .3s; box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%); margin: 10px; } .operation-wrap{ margin: 0 0 16px 0; } .form-search-wrap{ margin: 10px 0 0 12px; } </style>
到此這篇關(guān)于Vue3集成json-editor-vue3的文章就介紹到這了,更多相關(guān)Vue3集成json-editor-vue3內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue2實(shí)現(xiàn)未登錄攔截頁面功能的基本步驟和示例代碼
在Vue 2中實(shí)現(xiàn)未登錄攔截頁面功能,通??梢酝ㄟ^路由守衛(wèi)和全局前置守衛(wèi)來完成,以下是一個(gè)基本的實(shí)現(xiàn)步驟和示例代碼,幫助你創(chuàng)建一個(gè)簡單的未登錄攔截邏輯,需要的朋友可以參考下2024-04-04Vue項(xiàng)目報(bào)錯(cuò):parseComponent問題及解決
這篇文章主要介紹了Vue項(xiàng)目報(bào)錯(cuò):parseComponent問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05vue3+Typescript實(shí)現(xiàn)路由標(biāo)簽頁和面包屑功能
在使用 Vue.js 開發(fā)后臺(tái)管理系統(tǒng)時(shí),經(jīng)常會(huì)遇到需要使用路由標(biāo)簽頁的場景,這篇文章主要介紹了vue3+Typescript實(shí)現(xiàn)路由標(biāo)簽頁和面包屑,需要的朋友可以參考下2023-05-05vue實(shí)現(xiàn)樹形結(jié)構(gòu)樣式和功能的實(shí)例代碼
這篇文章主要介紹了vue樹形結(jié)構(gòu)樣式和功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Vue生成隨機(jī)卡密并綁定到表單輸入框的實(shí)現(xiàn)技巧
在現(xiàn)代Web應(yīng)用中,隨機(jī)生成驗(yàn)證碼、卡密等是一項(xiàng)常見需求,對(duì)于開發(fā)人員來說,如何在表單中快速生成一個(gè)符合格式的隨機(jī)卡密,并與其他表單字段一同提交,是一個(gè)常見的場景,本篇文章將詳細(xì)介紹如何在Vue.js框架中實(shí)現(xiàn)一個(gè)隨機(jī)卡密生成功能,需要的朋友可以參考下2024-11-11vue數(shù)據(jù)監(jiān)聽解析Object.defineProperty與Proxy區(qū)別
這篇文章主要為大家介紹了vue數(shù)據(jù)監(jiān)聽解析Object.defineProperty Proxy源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03淺談使用mpvue開發(fā)小程序需要注意和了解的知識(shí)點(diǎn)
這篇文章主要介紹了淺談使用mpvue開發(fā)小程序需要注意和了解的知識(shí)點(diǎn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05