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

vue3.0-monaco組件封裝存檔代碼解析

 更新時(shí)間:2024年03月22日 10:48:45   作者:土生土長的IU  
這篇文章主要介紹了vue3.0-monaco組件封裝存檔代碼解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

vue3.0-monaco組件封裝存檔

<template>
  <div
    ref="main"
    class="codeEditBox editor-container"
    style="width: 100%; height: 400px"
  />
</template>
<script lang="ts" setup>
import { ref, onMounted, onUnmounted } from 'vue'
import * as monaco from 'monaco-editor'
import { language } from 'monaco-editor/esm/vs/basic-languages/sql/sql'
const { keywords } = language
const main = ref()
const tables = {
  users: ['name', 'id', 'email', 'phone', 'password'],
  roles: ['id', 'name', 'order', 'created_at', 'updated_at', 'deleted_at'],
}
let editor: monaco.editor.IStandaloneCodeEditor
const props = defineProps({
  initValue: {
    type: String,
    default: '',
  },
})
const emit = defineEmits(['update:initValue', 'change', 'ctrlS'])
const defaultOptions: any = {
  // theme, // 主題
  value: props.initValue, // 默認(rèn)顯示的值
  language: 'sql', // 語言
  folding: true, // 是否折疊
  minimap: {
    // 關(guān)閉小地圖
    enabled: false,
  },
  wordWrap: 'on',
  wrappingIndent: 'indent',
  foldingHighlight: true, // 折疊等高線
  foldingStrategy: 'indentation', // 折疊方式  auto | indentation
  showFoldingControls: 'always', // 是否一直顯示折疊 always | mouseover
  disableLayerHinting: true, // 等寬優(yōu)化
  emptySelectionClipboard: false, // 空選擇剪切板
  selectionClipboard: true, // 選擇剪切板
  // automaticLayout: true, // 自動(dòng)布局
  // overviewRulerBorder: false, // 不要滾動(dòng)條的邊框
  codeLens: true, // 代碼鏡頭
  scrollBeyondLastLine: true, // 滾動(dòng)完最后一行后再滾動(dòng)一屏幕
  colorDecorators: true, // 顏色裝飾器
  accessibilitySupport: 'on', // 輔助功能支持  "auto" | "off" | "on"
  lineNumbers: 'on', // 行號(hào) 取值: "on" | "off" | "relative" | "interval" | function
  lineNumbersMinChars: 5, // 行號(hào)最小字符   number
  // enableSplitViewResizing: 'on',
  // readOnly: false, // 是否只讀  取值 true | false
  fixedOverflowWidgets: true,
  quickSuggestions: true,
  // acceptSuggestionOnEnter: 'on',
  theme: 'vs',
  formatOnPaste: true, // 粘貼時(shí)自動(dòng)格式化
}
onMounted(() => {
  initAutoCompletion()
  init()
})
onUnmounted(() => {
  editor.dispose()
})
function init() {
  // 使用 - 創(chuàng)建 monacoEditor 對(duì)象
  editor = monaco.editor.create(
    document.querySelector('.codeEditBox') as HTMLElement,
    defaultOptions,
  )
  // 監(jiān)聽值的變化
  editor.onDidChangeModelContent((val: any) => {
    const text = editor.getValue()
    emit('update:initValue', text)
  })
}
// 覆蓋默認(rèn)ctrl+s瀏覽器保存
onMounted(() => {
  window.addEventListener('keydown', handleKeyDown)
})
const handleKeyDown = (event) => {
  if (event.ctrlKey && event.key === 's') {
    event.preventDefault() // 阻止瀏覽器默認(rèn)的保存操作
    // 執(zhí)行調(diào)試
    emit('ctrlS')
  }
}
/**
 * @description: 初始化自動(dòng)補(bǔ)全
 */
function initAutoCompletion() {
  monaco.languages.registerCompletionItemProvider('sql', {
    // 觸發(fā)提示的字符
    triggerCharacters: ['.', ' ', ...keywords],
    provideCompletionItems: (model, position) => {
      let suggestions: any = []
      // 行號(hào),列號(hào)
      const { lineNumber, column } = position
      // 光標(biāo)之前的所有字符,即從這一行的 0 到當(dāng)前的字符
      const textBeforePointer = model.getValueInRange({
        startLineNumber: lineNumber,
        startColumn: 0,
        endLineNumber: lineNumber,
        endColumn: column,
      })
      // trim() 取消兩邊空格,保證拆分出來前后都不是空值
      // \s是指空白,包括空格、換行、tab縮進(jìn)等所有的空白
      const words = textBeforePointer.trim().split(/\s+/)
      // 最后的一個(gè)有效詞
      const lastWord = words[words.length - 1]
      if (lastWord.endsWith('.')) {
        // 如果這個(gè)詞以 . 結(jié)尾,那么認(rèn)為是希望補(bǔ)全表的字段
        // 拿到真實(shí)的表名,把 . 去掉
        const tableName = lastWord.slice(0, lastWord.length - 1)
        if (Object.keys(tables).includes(tableName)) {
          suggestions = [...getFieldsSuggest(tableName)]
        }
      } else if (lastWord === '.') {
        // 如果這個(gè)詞本身就是一個(gè) . 即點(diǎn)前面是空的,那么什么都不用補(bǔ)全了
        // 按理說這應(yīng)該是個(gè)語法錯(cuò)誤
        suggestions = []
      } else {
        // 其他時(shí)候都補(bǔ)全表名,以及關(guān)鍵字
        suggestions = [...getTableSuggest(), ...getKeywordsSuggest()]
      }
      return {
        suggestions,
      }
    },
  })
}
/**
 * @description: 獲取關(guān)鍵字的補(bǔ)全列表
 * @tips: CompletionItemKind 的所有枚舉可以在monaco.d.ts 文件中找到,有二十多個(gè),取需即可
 */
function getKeywordsSuggest() {
  return keywords.map((key) => ({
    label: key, // 顯示的名稱
    kind: monaco.languages.CompletionItemKind.Keyword,
    insertText: key, // 真實(shí)補(bǔ)全的值
  }))
}
/**
 * @description: 獲取表名的補(bǔ)全列表
 */
function getTableSuggest() {
  return Object.keys(tables).map((key) => ({
    label: key, // 顯示的名稱
    kind: monaco.languages.CompletionItemKind.Variable,
    insertText: key, // 真實(shí)補(bǔ)全的值
  }))
}
watch(() => props.initValue, (newVal) => {
  console.log('newVal', newVal)
  editor.setValue(newVal)
})
/**
 * @description: 根據(jù)表名獲取字段補(bǔ)全列表
 * @param {*} tableName
 */
function getFieldsSuggest(tableName) {
  const fields = tables[tableName]
  if (!fields) {
    return []
  }
  return fields.map((name) => ({
    label: name,
    kind: monaco.languages.CompletionItemKind.Field,
    insertText: name,
  }))
}
</script>
<style>
.editor-container {
  border: 1px solid #ccc;
}
</style>

解析

editor.onDidChangeModelContent當(dāng)編輯器內(nèi)容發(fā)生變化時(shí)觸發(fā),如:輸入、刪除、粘貼等

雙向綁定

由于在外部動(dòng)態(tài)改變initValue的值無法更新編輯器的值,所以添加watch監(jiān)聽initValue的值動(dòng)態(tài)設(shè)置進(jìn)編輯器

watch(() => props.initValue, (newVal) => {
  editor.setValue(newVal)
})

使用

    <MonacoEditor
          language="JSON"
          v-model:initValue="clickItem.form"
          ref="monacoRef"
        />

到此這篇關(guān)于vue3.0-monaco組件封裝存檔的文章就介紹到這了,更多相關(guān)vue3.0組件封裝存檔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue多組件倉庫開發(fā)與發(fā)布詳解

    Vue多組件倉庫開發(fā)與發(fā)布詳解

    這篇文章主要介紹了Vue多組件倉庫開發(fā)與發(fā)布詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • vue3中g(shù)etCurrentInstance示例講解

    vue3中g(shù)etCurrentInstance示例講解

    這篇文章主要給大家介紹了關(guān)于vue3中g(shù)etCurrentInstance的相關(guān)資料,文中還介紹了Vue3中關(guān)于getCurrentInstance的大坑,需要的朋友可以參考下
    2023-03-03
  • Vue配置文件中的proxy配置方式詳解

    Vue配置文件中的proxy配置方式詳解

    今天被vue中proxy配置困擾了一天,記錄一下,下面這篇文章主要給大家介紹了關(guān)于Vue配置文件中的proxy配置方式的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • vue3.x使用swiper實(shí)現(xiàn)卡片輪播

    vue3.x使用swiper實(shí)現(xiàn)卡片輪播

    這篇文章主要為大家詳細(xì)介紹了vue3.x使用swiper實(shí)現(xiàn)卡片輪播,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • vue-router 路由傳參用法實(shí)例分析

    vue-router 路由傳參用法實(shí)例分析

    這篇文章主要介紹了vue-router 路由傳參用法,結(jié)合實(shí)例形式分析了vue-router 路由傳參基本使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • vuex state及mapState的基礎(chǔ)用法詳解

    vuex state及mapState的基礎(chǔ)用法詳解

    這篇文章主要介紹了vuex state及mapState的基礎(chǔ)用法詳解,本文通過實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),需要的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-04-04
  • vue+element?tree懶加載更新數(shù)據(jù)的示例代碼

    vue+element?tree懶加載更新數(shù)據(jù)的示例代碼

    這篇文章主要介紹了vue+element?tree懶加載更新數(shù)據(jù),文中給大家補(bǔ)充介紹了Vue Element Ui 樹形表懶加載新增、修改、刪除等操作后局部數(shù)據(jù)更新的詳細(xì)代碼,感興趣的朋友跟隨小編一起看看吧
    2022-09-09
  • Fragment 占位組件不生成標(biāo)簽與路由組件lazyLoad案例

    Fragment 占位組件不生成標(biāo)簽與路由組件lazyLoad案例

    這篇文章主要為大家介紹了Fragment 占位組件不生成標(biāo)簽與路由組件lazyLoad案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Vue?Router?實(shí)現(xiàn)登錄后跳轉(zhuǎn)到之前想要訪問的頁面

    Vue?Router?實(shí)現(xiàn)登錄后跳轉(zhuǎn)到之前想要訪問的頁面

    這篇文章主要介紹了Vue?Router?實(shí)現(xiàn)登錄后跳轉(zhuǎn)到之前相要訪問的頁面,本文僅演示路由跳轉(zhuǎn)和導(dǎo)航守衛(wèi)相關(guān)代碼的實(shí)現(xiàn),不包含具體的權(quán)限驗(yàn)證和登錄請(qǐng)求,需要的朋友可以參考下
    2022-12-12
  • Vue 獲取數(shù)組鍵名的方法

    Vue 獲取數(shù)組鍵名的方法

    本篇文章主要介紹了Vue 獲取數(shù)組鍵名的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06

最新評(píng)論

揭西县| 达拉特旗| 龙里县| 金溪县| 牙克石市| 阿合奇县| 阳朔县| 崇礼县| 长宁区| 襄汾县| 宽城| 新绛县| 大埔县| 故城县| 来安县| 类乌齐县| 遵化市| 休宁县| 天峨县| 泊头市| 安阳市| 民权县| 余姚市| 丹东市| 土默特右旗| 于田县| 东安县| 交口县| 阿坝| 镇远县| 宿迁市| 土默特左旗| 凤阳县| 原阳县| 锦州市| 博客| 永兴县| 沈阳市| 辽宁省| 罗甸县| 江津市|