赞
踩
简介:项目场景:示例:新增的时候需要添加一段代码,页面需要展示成平时代码编辑器的那种效果,并且前面要有两行注释
我的项目组件库是vant,用什么组件库都不影响咱们使用vue2-ace-editor
vue2-ace-editor git仓库地址
官方文档地址
简单的实现效果图片如下:
有选择性的效果如下:
npm install --save-dev vue2-ace-editor
main.js 文件全局引入
import Editor from 'vue2-ace-editor'
Vue.component('editor', Editor)
局部注册组件代码如下:
components: {
editor: require('vue2-ace-editor'),
},
提示:项目将输入框单独拆分成组件,下面代码可以直接用:
//编辑器子组件 <template> <div> <editor :value="content" @input="handleInput" @init="editorInit" :theme="aceConfig.selectTheme" :lang="aceConfig.selectLang" :options="aceConfig.options" width="100%" height="100px"/> </div> </template> <script> // 编辑器主题 const themes = [ 'xcode', 'eclipse', 'monokai', 'cobalt' ] // 编辑器语言 const langs = [ 'java', 'c_cpp', 'javascript', 'golang' ] // tabs const tabs = [2, 4, 8] // 字体大小 const fontSizes = [14, 15, 16, 17, 18, 19, 20, 21, 22] // 编辑器选项 const options = { tabSize: 4, // tab默认大小 showPrintMargin: true, // 去除编辑器里的竖线 fontSize: 15, // 字体大小 highlightActiveLine: true, // 高亮配置 enableBasicAutocompletion: true, //启用基本自动完成 enableSnippets: true, // 启用代码段 enableLiveAutocompletion: true, // 启用实时自动完成 } export default { name: "CodeEdit", components: { editor: require('vue2-ace-editor'), }, data() { return { aceConfig: { langs, themes, tabs, fontSizes, options, selectTheme: 'xcode', selectLang: 'java', readOnly: false, }, } }, model: { prop: 'content', event: 'change' }, props: { content: String }, methods: { handleInput(e) { this.$emit('change', e) }, // 代码块初始化 editorInit () { require('brace/ext/language_tools') // language extension prerequsite... require(`brace/mode/${this.aceConfig.selectLang}`) // 语言 require(`brace/theme/${this.aceConfig.selectTheme}`) // 主题 }, } } </script>
父组件引入和定义一个value值即可
<template>
<!--双向绑定代码块即可-->
<CodeEdit v-model="content" />
</template>
import CodeEdit from "@/components/codeEdit/index.vue"
components:{CodeEdit},
data(){
return{
content: '#代码追踪范围包括 code\n#Stack.include= ', // 代码块
}
}
提示:这里代码不全,看着引用,html代码如下:
<template> <div> <Card title="代码编辑器"> <!--主题select选择框--> <Select slot="extra" style="width: 120px" :default-value="aceConfig.selectTheme" @change="handleThemeChange"> <Option v-for="theme in aceConfig.themes" :key="theme"> {{theme}} </Option> </Select> <!--语言select选择框--> <Select slot="extra" style="width: 120px; margin-left: 10px" :default-value="aceConfig.selectLang" @change="handleLangChange"> <Option v-for="lang in aceConfig.langs" :key="lang"> {{lang}} </Option> </Select> <!--编辑器设置按钮--> <Button slot="extra" type="link" @click="showSettingModal" > <Icon key="setting" type="setting" style="font-size: 15px"/> </Button> <!--editor插件--> <!--其中的@input中的方法就是子组件值改变时调用的方法,该方法会给父组件传入改变值--> <editor :value="content" @input="handleInput" @init="editorInit" :lang="aceConfig.selectLang" :theme="aceConfig.selectTheme" :options="aceConfig.options" width="100%" height="400px"/> </Card> <!--编辑器设置模态窗口(未开发完成,可以自行拓展)--> <Modal v-model="visible" width="500px" title="编辑器设置(功能暂未开发)" @ok="handleOk"> <Row type="flex"> <Col flex="330px"> <span class="settingTitle" >Tab 长度</span> <br/> <span class="settingDescription">选择你想要的 Tab 长度,默认设置为4个空格</span> </Col> <Col flex="80px"> <Select style="width: 120px;" :default-value="aceConfig.options.tabSize" @change="handleTabChange" disabled> <Option v-for="tab in aceConfig.tabs" :key="tab"> {{tab}}个空格 </Option> </Select> </Col> </Row> <Row type="flex" style="margin-top: 50px"> <Col flex="330px"> <span class="settingTitle">字体设置</span> <br/> <span class="settingDescription">调整适合你的字体大小</span> </Col> <Col flex="80px"> <Select style="width: 120px;" :default-value="aceConfig.options.fontSize" @change="handleFontChange" disabled> <Option v-for="font in aceConfig.fontSizes" :key="font"> {{font}}px </Option> </Select> </Col> </Row> </Modal> </div> </template>
<script> data() { return { visible: false, // 模态窗口显示控制 aceConfig: { // 代码块配置 langs, // 语言 themes, // 主题 tabs, // tab空格 fontSizes, options, // 编辑器属性设置 selectTheme: 'xcode', // 默认选择的主题 selectLang: 'c_cpp', // 默认选择的语言 readOnly: false, // 是否只读 }, } }, // 接收父组件v-model传来的值 model: { prop: 'content', event: 'change' }, props: { content: String // content就是上面prop中声明的值,要保持一致 }, methods: { // 当该组件中的值改变时,通过该方法将该组件值传给父组件,实现组件间双向绑定 handleInput(e) { this.$emit('change', e) // 这里e是每次子组件修改的值,change就是上面event中声明的,不要变 }, // 显示'编辑器设置'模态窗口 showSettingModal() { this.visible = true }, // '编辑器设置'模态窗口确认按钮回调 handleOk() { this.visible = false // this.editorInit() }, //分割线:以下为该代码组件的配置 // 代码块主题切换 handleThemeChange(value) { this.aceConfig.selectTheme = value this.editorInit() }, // 代码块语言切换 handleLangChange(value) { this.aceConfig.selectLang = value this.editorInit() }, // tab切换 handleTabChange(value) { this.aceConfig.options.tabSize = value this.editorInit() }, // 字体大小切换 handleFontChange(value) { this.aceConfig.options.tabSize = value this.editorInit() }, // 代码块初始化 editorInit () { require('brace/ext/language_tools') // language extension prerequsite... require(`brace/mode/${this.aceConfig.selectLang}`) // 语言 require(`brace/theme/${this.aceConfig.selectTheme}`) // 主题 }, } <style scoped> .settingTitle{ font-size: larger; } .settingDescription{ font-size: small; color: #a8a8af } </style>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。