<template> <div class="json-editor"> <label> <textarea ref="textarea" /> </label> </div> </template> <script> import CodeMirror from "codemirror"; import "codemirror/addon/lint/lint.css"; import "codemirror/lib/codemirror.css"; import "codemirror/theme/rubyblue.css"; import "codemirror/mode/javascript/javascript"; import "codemirror/addon/lint/lint"; import "codemirror/addon/lint/json-lint"; require("script-loader!jsonlint"); export default { name: "JsonEditor", props: { value: { type: [Array, Object], default: () => { return null; }, }, }, data() { return { jsonEditor: false, }; }, watch: { value(value) { const editorValue = this.jsonEditor.getValue(); if (editorValue) { this.$emit("change", editorValue); } else { this.$baseMessage("JSON不能为空,否则无法生成表格", "error"); } if (value !== editorValue) { this.jsonEditor.setValue(JSON.stringify(this.value, null, 2)); } }, }, mounted() { this.jsonEditor = CodeMirror.fromTextArea(this.$refs.textarea, { lineNumbers: true, mode: "application/json", gutters: ["CodeMirror-lint-markers"], theme: "rubyblue", lint: true, }); this.jsonEditor.setValue(JSON.stringify(this.value, null, 2)); this.jsonEditor.on("change", (cm) => { if (this.isJsonString(cm.getValue())) { this.$emit("change", cm.getValue()); } }); }, methods: { getValue() { return this.jsonEditor.getValue(); }, isJsonString(str) { try { if (typeof JSON.parse(str) == "object") { return true; } } catch (e) {} return false; }, }, }; </script> <style scoped> .json-editor { position: relative; height: 100%; } .json-editor >>> .CodeMirror { height: auto; min-height: calc(100vh - 220px); } .json-editor >>> .CodeMirror-scroll { min-height: calc(100vh - 220px); } .json-editor >>> .cm-s-rubyblue span.cm-string { color: #f08047; } .json-editor >>> .cm-s-rubyblue .CodeMirror-gutters { padding-right: 10px; /* background: transparent; */ border-right: 1px solid #fff; } .json-editor >>> .cm-s-rubyblue.CodeMirror { /* background: #08233e; */ color: white; } </style>