最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Monaco?Editor開發(fā)SQL代碼提示編輯器實(shí)例詳解

 更新時(shí)間:2022年08月07日 09:04:41   作者:Violet-Jack  
這篇文章主要為大家介紹了Monaco?Editor開發(fā)SQL編輯器實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

安裝

安裝依賴,這里請注意版本

yarn add monaco-editor@0.29.1
yarn add monaco-editor-webpack-plugin@5.0.0

配置 webpack 插件

// vue.config.js
...
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin')
module.export = {
  ...
  configureWebpack: {
    name: name,
    resolve: {
      alias: {
        '@': resolve('src'),
      },
    },
    plugins: [new MonacoWebpackPlugin()],
  },
  ...
}

請注意 monaco-editor-webpack-plugin 和 monaco-editor 的對(duì)應(yīng)關(guān)系,否則可能會(huì)出現(xiàn)無法運(yùn)行的情況。

monaco-editor-webpack-pluginmonaco-editor
7.*.*>= 0.31.0
6.*.*0.30.*
5.*.*0.29.*
4.*.*0.25.*, 0.26.*, 0.27.*, 0.28.*
3.*.*0.22.*, 0.23.*, 0.24.*
2.*.*0.21.*
1.9.*0.20.*
1.8.*0.19.*
1.7.*0.18.*

簡易 SQL 編輯器

先上干貨!

<template>
  <div ref="codeContainer" class="editor-container" :style="{ height: height + 'px' }" />
</template>
<script>
import * as monaco from 'monaco-editor'
/**
 * VS Code 編輯器
 *
 * 通過 getEditorVal 函數(shù)向外傳遞編輯器即時(shí)內(nèi)容
 * 通過 initValue 用于初始化編輯器內(nèi)容。
 * 編輯器默認(rèn) sql 語言,支持的語言請參考 node_modules\monaco-editor\esm\vs\basic-languages 目錄下~
 * 編輯器樣式僅有   'vs', 'vs-dark', 'hc-black' 三種
 */
export default {
  name: 'MonacoEditor',
  props: {
    initValue: {
      type: String,
      default: '',
    },
    readOnly: Boolean,
    language: {
      type: String,
      default: 'sql',
    },
    height: {
      type: Number,
      default: 300,
    },
    theme: {
      type: String,
      default: 'vs',
    },
  },
  data() {
    return {
      monacoEditor: null, // 語言編輯器
    }
  },
  computed: {
    inputVal() {
      return this.monacoEditor?.getValue()
    },
  },
  watch: {
    inputVal() {
      if (this.monacoEditor) {
        this.$emit('change', this.monacoEditor.getValue())
      }
    },
    theme() {
      this.setTheme(this.theme)
    },
    height() {
      this.layout()
    },
  },
  mounted() {
    this.initEditor()
  },
  beforeDestroy() {
    if (this.monacoEditor) {
      this.monacoEditor.dispose()
    }
  },
  methods: {
    initEditor() {
      if (this.$refs.codeContainer) {
        this.registerCompletion()
        // 初始化編輯器,確保dom已經(jīng)渲染
        this.monacoEditor = monaco.editor.create(this.$refs.codeContainer, {
          value: '', // 編輯器初始顯示文字
          language: 'sql', // 語言
          readOnly: this.readOnly, // 是否只讀 Defaults to false | true
          automaticLayout: true, // 自動(dòng)布局
          theme: this.theme, // 官方自帶三種主題vs, hc-black, or vs-dark
          minimap: {
            // 關(guān)閉小地圖
            enabled: false,
          },
          tabSize: 2, // tab縮進(jìn)長度
        })
      }
      this.setInitValue()
    },
    focus() {
      this.monacoEditor.focus()
    },
    layout() {
      this.monacoEditor.layout()
    },
    getValue() {
      return this.monacoEditor.getValue()
    },
    // 將 initValue Property 同步到編輯器中
    setInitValue() {
      this.monacoEditor.setValue(this.initValue)
    },
    setTheme() {
      monaco.editor.setTheme(this.theme)
    },
    getSelectionVal() {
      const selection = this.monacoEditor.getSelection() // 獲取光標(biāo)選中的值
      const { startLineNumber, endLineNumber, startColumn, endColumn } = selection
      const model = this.monacoEditor.getModel()
      return model.getValueInRange({
        startLineNumber,
        startColumn,
        endLineNumber,
        endColumn,
      })
    },
    setPosition(column, lineNumber) {
      this.monacoEditor.setPosition({ column, lineNumber })
    },
    getPosition() {
      return this.monacoEditor.getPosition()
    },
  },
}
</script>
<style lang="scss" scoped></style>

相關(guān)功能

獲取選中代碼

    getSelectionVal() {
      const selection = this.monacoEditor.getSelection() // 獲取光標(biāo)選中的值
      const { startLineNumber, endLineNumber, startColumn, endColumn } = selection
      const model = this.monacoEditor.getModel()
      return model.getValueInRange({
        startLineNumber,
        startColumn,
        endLineNumber,
        endColumn,
      })
    },

替換選中代碼

insertStringInTemplate(str) {
      const selection = this.monacoEditor.getSelection() // 獲取光標(biāo)選中的值
      const { startLineNumber, endLineNumber, startColumn, endColumn } = selection
      const model = this.monacoEditor.getModel()
      const textBeforeSelection = model.getValueInRange({
        startLineNumber: 1,
        startColumn: 0,
        endLineNumber: startLineNumber,
        endColumn: startColumn,
      })
      const textAfterSelection = model.getValueInRange({
        startLineNumber: endLineNumber,
        startColumn: endColumn,
        endLineNumber: model.getLineCount(),
        endColumn: model.getLineMaxColumn(model.getLineCount()),
      })
      this.monacoEditor.setValue(textBeforeSelection + str + textAfterSelection)
      this.monacoEditor.focus()
      this.monacoEditor.setPosition({
        lineNumber: startLineNumber,
        column: startColumn + str.length,
      })
    },

處理光標(biāo)位置

  setPosition(column, lineNumber) {
      this.monacoEditor.setPosition({ column, lineNumber })
    },
    getPosition() {
      return this.monacoEditor.getPosition()
    },

自定義 SQL 庫表提示,并保留原有 SQL 提示

首先由后端提供具體的庫表信息:

export const hintData = {
  adbs: ['dim_realtime_recharge_paycfg_range', 'dim_realtime_recharge_range'],
  dimi: ['ads_adid', 'ads_spec_adid_category'],
}

然后根據(jù)已有庫表信息進(jìn)行自定義 AutoComplete

import * as monaco from 'monaco-editor'
import { language } from 'monaco-editor/esm/vs/basic-languages/sql/sql'
const { keywords } = language
export default {
  ...
  mounted() {
    this.initEditor()
  },
  methods: {
    ...
    registerCompletion() {
      const _that = this
      monaco.languages.registerCompletionItemProvider('sql', {
        triggerCharacters: ['.', ...keywords],
        provideCompletionItems: (model, position) => {
          let suggestions = []
          const { lineNumber, column } = position
          const textBeforePointer = model.getValueInRange({
            startLineNumber: lineNumber,
            startColumn: 0,
            endLineNumber: lineNumber,
            endColumn: column,
          })
          const tokens = textBeforePointer.trim().split(/\s+/)
          const lastToken = tokens[tokens.length - 1] // 獲取最后一段非空字符串
          if (lastToken.endsWith('.')) {
            const tokenNoDot = lastToken.slice(0, lastToken.length - 1)
            if (Object.keys(_that.hintData).includes(tokenNoDot)) {
              suggestions = [..._that.getTableSuggest(tokenNoDot)]
            }
          } else if (lastToken === '.') {
            suggestions = []
          } else {
            suggestions = [..._that.getDBSuggest(), ..._that.getSQLSuggest()]
          }
          return {
            suggestions,
          }
        },
      })
    },
    // 獲取 SQL 語法提示
    getSQLSuggest() {
      return keywords.map((key) => ({
        label: key,
        kind: monaco.languages.CompletionItemKind.Enum,
        insertText: key,
      }))
    },
    getDBSuggest() {
      return Object.keys(this.hintData).map((key) => ({
        label: key,
        kind: monaco.languages.CompletionItemKind.Constant,
        insertText: key,
      }))
    },
    getTableSuggest(dbName) {
      const tableNames = this.hintData[dbName]
      if (!tableNames) {
        return []
      }
      return tableNames.map((name) => ({
        label: name,
        kind: monaco.languages.CompletionItemKind.Constant,
        insertText: name,
      }))
    },
    initEditor() {
      if (this.$refs.codeContainer) {
        this.registerCompletion()
        // 初始化編輯器,確保dom已經(jīng)渲染
        this.monacoEditor = monaco.editor.create(this.$refs.codeContainer, {
          value: '', // 編輯器初始顯示文字
          language: 'sql', // 語言
          readOnly: this.readOnly, // 是否只讀 Defaults to false | true
          automaticLayout: true, // 自動(dòng)布局
          theme: this.theme, // 官方自帶三種主題vs, hc-black, or vs-dark
          minimap: {
            // 關(guān)閉小地圖
            enabled: false,
          },
          tabSize: 2, // tab縮進(jìn)長度
        })
      }
      this.setValue(this.value)
    },
  }
}

編輯器 resize

    resize() {
      this.monacoEditor.layout()
    },

編輯器設(shè)置主題

注意!設(shè)置主題并非在編輯器實(shí)例上修改的哦!

    setTheme() {
      monaco.editor.setTheme(this.theme)
    },

SQL 代碼格式化

編輯器自身不支持 sql 格式化(試了下 JavaScript 是支持的),所以用到了 sql-formatter 這個(gè)庫。

import { format } from 'sql-formatter'
...
    format() {
      this.monacoEditor.setValue(
        format(this.monacoEditor.getValue(), {
          indentStyle: 'tabularLeft',
        }),
      )
    },
...

右鍵菜單漢化

需要安裝以下兩個(gè)庫

npm install monaco-editor-nls --save
npm install monaco-editor-esm-webpack-plugin --save-dev

具體用法可以直接去 www.npmjs.com/package/mon… 里面看,我就不搬運(yùn)了~

記得銷毀編輯器對(duì)象哦

  beforeDestroy() {
    if (this.monacoEditor) {
      this.monacoEditor.dispose()
    }
  },

踩坑

下面是我遇到的幾個(gè)坑。

  • 最新版本的 Monaco Editor 已經(jīng)使用了 ES2022 的語法,所以老項(xiàng)目可能會(huì)出現(xiàn)編譯不過的問題。所以我把版本調(diào)低了一些。
  • 在最初調(diào)試編輯器的時(shí)候出現(xiàn)了無法編輯的情況,后來發(fā)現(xiàn)是同事用到了 default-passive-events 這個(gè)庫來關(guān)閉 chrome 的 Added non-passive event listener to a scroll-blocking <some> event. Consider marking event handler as 'passive' to make the page more responsive 警告。結(jié)果攔截一些 event。

如何快速去看懂 Monaco Editor

一開始我看它的官方文檔是非常懵的,各種接口、函數(shù)、對(duì)象的定義,完全不像是個(gè)前端庫那么好理解。鼓搗了好久才慢慢找到門路。

  • 先看示例
    • 查看它的 playground,上面其實(shí)是有一些功能可以直接找到的。
    • 查看它在 github 上的 /samples 目錄,里面也有不少示例。
    • 去掘金這類網(wǎng)站上找別人寫的示例,能有不少啟發(fā)。
  • 再看 API
    • 了解了自己所需要的功能相關(guān)的代碼,再去看它文檔的 API 就會(huì)發(fā)現(xiàn)容易理解多了。逐步發(fā)散理解更多關(guān)聯(lián)功能。

參考資料

  • 官方文檔

microsoft.github.io/monaco-edit…

相關(guān)庫

Monaco Editor www.npmjs.com/package/mon…

右鍵菜單漢化 www.npmjs.com/package/mon…

webpack 插件 www.npmjs.com/package/mon…

漢化 webpack 插件 www.npmjs.com/package/mon…

SQL 代碼格式化 www.npmjs.com/package/sql…

博客

http://m.fzitv.net/article/258307.htm

http://m.fzitv.net/article/258269.htm

以上就是Monaco Editor開發(fā)SQL編輯器實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于Monaco Editor開發(fā)SQL編輯器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入解析Vue的自定義指令

    深入解析Vue的自定義指令

    這篇文章主要介紹了深入解析Vue的自定義指令,自定義指令主要是為了重用涉及普通元素的底層 DOM 訪問的邏輯,一個(gè)自定義指令由一個(gè)包含類似組件生命周期鉤子的對(duì)象來定義,需要的朋友可以參考下
    2023-05-05
  • vue3?+?elementPlus?reset重置表單問題

    vue3?+?elementPlus?reset重置表單問題

    這篇文章主要介紹了vue3?+?elementPlus?reset重置表單問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 詳解如何在你的Vue項(xiàng)目配置vux

    詳解如何在你的Vue項(xiàng)目配置vux

    這篇文章主要介紹了詳解如何在你的Vue項(xiàng)目配置vux,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Vue3組件不發(fā)生變化如何監(jiān)聽pinia中數(shù)據(jù)變化

    Vue3組件不發(fā)生變化如何監(jiān)聽pinia中數(shù)據(jù)變化

    這篇文章主要給大家介紹了關(guān)于Vue3組件不發(fā)生變化如何監(jiān)聽pinia中數(shù)據(jù)變化的相關(guān)資料,pinia是Vue的存儲(chǔ)庫,它允許您跨組件/頁面共享狀態(tài),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • vue3+elementplus基于el-table-v2封裝公用table組件詳細(xì)代碼

    vue3+elementplus基于el-table-v2封裝公用table組件詳細(xì)代碼

    在日常開發(fā)后端管理系統(tǒng)項(xiàng)目中,用于展示數(shù)據(jù)多會(huì)用表格進(jìn)行展示,下面這篇文章主要給大家介紹了關(guān)于vue3+elementplus基于el-table-v2封裝公用table組件的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 如何解決vue在ios微信

    如何解決vue在ios微信"復(fù)制鏈接"功能問題

    這篇文章主要介紹了如何解決vue在ios微信"復(fù)制鏈接"功能問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Vue制作Todo List網(wǎng)頁

    Vue制作Todo List網(wǎng)頁

    這篇文章主要為大家詳細(xì)介紹了Vue制作Todo List網(wǎng)頁的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • vue-cli創(chuàng)建項(xiàng)目時(shí)由esLint校驗(yàn)導(dǎo)致報(bào)錯(cuò)或警告的問題及解決

    vue-cli創(chuàng)建項(xiàng)目時(shí)由esLint校驗(yàn)導(dǎo)致報(bào)錯(cuò)或警告的問題及解決

    這篇文章主要介紹了vue-cli創(chuàng)建項(xiàng)目時(shí)由esLint校驗(yàn)導(dǎo)致報(bào)錯(cuò)或警告的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Vue中關(guān)于computed計(jì)算屬性的妙用

    Vue中關(guān)于computed計(jì)算屬性的妙用

    這篇文章主要介紹了Vue中關(guān)于computed計(jì)算屬性的妙用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • VUE使用canvas實(shí)現(xiàn)簽名組件

    VUE使用canvas實(shí)現(xiàn)簽名組件

    這篇文章主要為大家詳細(xì)介紹了VUE使用canvas實(shí)現(xiàn)簽名組件,兼容PC移動(dòng)端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論

沭阳县| 许昌市| 义马市| 漾濞| 应城市| 合江县| 射洪县| 澄迈县| 自贡市| 理塘县| 南川市| 淅川县| 上高县| 长岛县| 芜湖市| 伊宁县| 理塘县| 额济纳旗| 迁西县| 饶平县| 巴彦淖尔市| 商河县| 正安县| 杭锦后旗| 中卫市| 普兰县| 上高县| 东乡族自治县| 克东县| 三穗县| 赞皇县| 马鞍山市| 华阴市| 河西区| 宣恩县| 安多县| 福鼎市| 白水县| 阿瓦提县| 河源市| 肇源县|