踩了很多坑最后写出来了,需要props里加属性自己加,css部分也是很关键的内容
引用后可以在父组件用class设置height
很多处理的灵感来源于vue2.0项目vue-json-editor的代码,原项目代码还是写的很精彩的
安装命令:npm install jsoneditor --save
原项目文档:https://github.com/josdejong/jsoneditor
<template>
<div>
<div class="json" />
</div>
</template>
<script>
import JSONEditor from 'jsoneditor';
export default {
props: {
name: String,
modelValue: {
type: [String, Number, Object, Array],
default: () => {
return {};
}
}
},
data() {
return {
jsonEditor: null,
internalChange: false
}
},
mounted() {
this.init();
},
watch: {
modelValue: {
handler(json) {
if (!this.internalChange) {
this.setValue(json);
}
}
}
},
methods: {
init() {
let self = this;
this.jsonEditor = new JSONEditor(
self.$el.querySelector(".json"), {
mode: 'code',
modes: ['code', 'view', 'tree'],
indentation: 4,
name: this.name,
mainMenuBar: true,
onModeChange() {
// 去除作者信息
if (document.getElementsByClassName('jsoneditor-poweredBy').item(0)) {
document.getElementsByClassName('jsoneditor-poweredBy').item(0).remove();
}
},
onChange() {
self.internalChange = true;
self.$emit('update:modelValue', self.jsonEditor.getText());
// 防止双向绑定重复刷新数据
self.$nextTick(function () {
self.internalChange = false;
});
}
}, self.modelValue);
// 去除作者信息
document.getElementsByClassName('jsoneditor-poweredBy').item(0).remove();
},
setValue(jsonStr) {
if (this.jsonEditor) {
this.jsonEditor.set(jsonStr ? JSON.parse(jsonStr) : '');
}
}
}
};
</script>
<style>
@import '~jsoneditor/dist/jsoneditor.min.css';
.json {
height: 100%;
}
.jsoneditor {
border: thin solid #409EFF;
}
.jsoneditor-menu {
background-color: #409EFF;
}
.ace-jsoneditor {
min-height: 50px;
}
</style>
引入,省略import部分
<json-editor class="json" name="body" v-model="bodyJson"></json-editor>