完成的实际效果是这样
完成这种效果很容易,需要后台返回代码数据再借助插件Monaco-Editor展现在页面中。
首先为了更好的复用插件,我们先把Monaco-Editor进行封装,不然每次Monaco-Editor一大堆配置写起来很烦。
JNPFCodeEditor子组件代码
<template> <div class="monaco-container" ref="codeEditor"></div> </template> <script> import * as monaco from "monaco-editor" const defaultOptions = { selectOnLineNumbers: true, roundedSelection: false, wordWrap: 'on', // 自动换行 'on','off' language: 'java', // 常用的有css/html/java/javascript/json/csharp(.net)' theme: 'vs', // vs, hc-black, or vs-dark formatOnPaste: true, formatOnType: true, glyphMargin: true, //字形边缘 fontSize: 14, // 字体大小 readOnly: false // 只读 } export default { name: 'MonacoEditor', props: { options: { type: Object, default: () => { } }, value: { type: String, default: '' } }, data() { return { content: this.value, monacoEditor: null } }, watch: { value(val) { this.content = val }, options: { handler(val) { this.monacoEditor.updateOptions({ ...val }) }, deep: true } }, mounted() { this.initEditor() }, methods: { initEditor() { // 初始化编辑器实例 this.monacoEditor = monaco.editor.create(this.$refs['codeEditor'], { value: this.content, autoIndex: true, ...defaultOptions, ...this.options }) // 监听编辑器content变化 this.monacoEditor.onDidChangeModelContent(() => { this.$emit('input', this.monacoEditor.getValue()) }) }, changeEditor(data) { this.monacoEditor.setValue(data.value) this.monacoEditor.updateOptions({ ...data.options }) }, insert(text) { text = text || '' var position = this.monacoEditor.getPosition(); this.monacoEditor.executeEdits('', [ { range: { startLineNumber: position.lineNumber, startColumn: position.column, endLineNumber: position.lineNumber, endColumn: position.column }, text: text } ]); }, } } </script>
封装完毕后留了两个可传参数 value和options,分别是代码的值(就是后端传给你的代码字段)和详细配置,接下来上父组件代码(只上关键代码)
父组件代码
HTML
<el-dropdown-item @click.native="generatedCode(scope.row.table)"> 生成实体代码 </el-dropdown-item>
<!-- 实体代码弹出框 --> <el-dialog title="实体代码" :visible.sync="showDataCode" width="1100px" class="JNPF-dialog JNPF-dialog_center form-script-dialog" :before-close="handleClose"> <div style="height: 500px;width: 100%;"> <JNPFCodeEditor v-model="text" :options="options" ref="DataItemCode" /> </div> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="showDataCode = false">确 定</el-button> </span> </el-dialog>
JS
export default { data() { return { showDataCode: false, // 代码字符段 text: '', // 代码配置 options: { language: 'java' } } }, methods:{ // 实体代码下· async generatedCode(table) { // 控制弹出框 this.showDataCode = true // 调接口 const res = await DataModelCode(this.dataBase, table) this.text = res.data // 调用封装好的事件 this.$nextTick(() => { this.$refs.DataItemCode.changeEditor({ value: this.text, options: this.options }) }); }, } }
思路就是点击生成实体代码按钮触发click事件携带参数发起接口请求,获取到接口数据拿出接口数据的核心字段复制给text,更新后触发JNPFCodeEditor组件的changeEditor事件。当然配置要调的话记得调一下,language改成javascript或者css都可以 根据自己的需求来。
基本实现就在这了,其他的样式 错误提醒 加载框需要加的自己加。