Bootstrap

vue项目利用vue2-ace-editor实现代码编辑器

vue代码编辑器的实现:

简介:项目场景:示例:新增的时候需要添加一段代码,页面需要展示成平时代码编辑器的那种效果,并且前面要有两行注释


技术

vue2.x + vant + vue2-ace-editor

我的项目组件库是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>
;