如何在 Vue 3 中使用 CodeMirror V6

CodeMirror 是一個(gè)強(qiáng)大的代碼編輯器,它支持語(yǔ)法高亮、代碼折疊、自動(dòng)完成等功能。它廣泛用于在線編輯器和開(kāi)發(fā)工具中,支持多種語(yǔ)言和功能。CodeMirror V6 是其全新版本,采用了更加模塊化和可擴(kuò)展的架構(gòu)。在本教程中,我們將展示如何在 Vue 3 中集成 CodeMirror V6,創(chuàng)建一個(gè)簡(jiǎn)單的 XML 編輯器。


image.png

步驟 1: 安裝所需依賴(lài)

首先,我們需要安裝一些 CodeMirror V6 的核心依賴(lài)。由于 CodeMirror V6 拆分成了多個(gè)小模塊,所以我們需要單獨(dú)安裝每個(gè)需要的包。

在項(xiàng)目目錄中運(yùn)行以下命令來(lái)安裝 CodeMirror 所需的模塊:

pnpm i @codemirror/lang-xml@6.0.1 @codemirror/state@6.0.1 @codemirror/view@^6.0.1 codemirror@6.0.1

這個(gè)命令會(huì)安裝以下幾個(gè)模塊:

  • @codemirror/lang-xml:提供 XML 語(yǔ)言支持。
  • @codemirror/state:管理編輯器的狀態(tài)。
  • @codemirror/view:處理編輯器的視圖和 UI。
  • codemirror:基礎(chǔ)包,包含一些常見(jiàn)功能(例如基礎(chǔ)的編輯器設(shè)置)。

步驟 2: 創(chuàng)建 Vue 3 組件

在 Vue 3 中集成 CodeMirror V6 相對(duì)簡(jiǎn)單。我們需要使用 Vue 的 ref 和生命周期鉤子來(lái)初始化編輯器,并將其渲染到頁(yè)面上。

Vue 3 代碼示例

以下是一個(gè)簡(jiǎn)單的 Vue 3 組件,它展示了如何將 CodeMirror V6 集成到 Vue 項(xiàng)目中:

<script setup lang="ts">
  // 引入所需的 CodeMirror 模塊
  import { basicSetup } from 'codemirror'
  import { EditorView } from '@codemirror/view'
  import { Compartment, EditorState } from '@codemirror/state'
  import { xml } from '@codemirror/lang-xml'

  // 初始化編輯器內(nèi)容
  const contentStr = ref<string>(`<div>hello world!</div>`)
  const view = ref()
  const viewRef = ref<Element>()

  // 初始化編輯器實(shí)例
  const init = () => {
    if (view.value) return  // 確保只初始化一次

    const language = new Compartment() // 語(yǔ)言設(shè)置
    const tabSize = new Compartment()  // 縮進(jìn)設(shè)置

    // 創(chuàng)建 CodeMirror 編輯器狀態(tài)
    const state = EditorState.create({
      doc: contentStr.value,  // 設(shè)置文檔內(nèi)容
      extensions: [
        basicSetup,  // 使用 CodeMirror 的基礎(chǔ)設(shè)置
        language.of(xml()),  // 設(shè)置語(yǔ)言為 XML
        tabSize.of(EditorState.tabSize.of(8)),  // 設(shè)置 tab 縮進(jìn)大小
        // 注冊(cè)一個(gè)更新監(jiān)聽(tīng)器,捕捉編輯器內(nèi)容變化
        EditorView.updateListener.of(v => {
          contentStr.value = v.state.doc.toString()  // 更新內(nèi)容
        }),
      ],
    })

    // 創(chuàng)建并渲染編輯器視圖
    view.value = new EditorView({
      state,
      parent: viewRef.value,  // 將編輯器附加到 DOM 元素
    })
  }

  // 在組件掛載時(shí)初始化編輯器
  onMounted(() => {
    init()
  })
</script>

<template>
  <div class="app-container">
    <div ref="viewRef" style="height: 600px"></div>  <!-- 編輯器容器 -->
  </div>
</template>

<style lang="scss" scoped>
/* 樣式可以根據(jù)需要調(diào)整 */
</style>

代碼解析

  1. 引入 CodeMirror 模塊

    • basicSetup: 這是一個(gè) CodeMirror 提供的預(yù)設(shè)配置,包含了很多常用功能(如行號(hào)顯示、語(yǔ)法高亮、編輯功能等)。
    • EditorViewEditorState: 用于管理編輯器視圖和狀態(tài)。
    • xml: 這是我們使用的語(yǔ)言支持包,在這里我們使用 XML 語(yǔ)法高亮。
  2. 創(chuàng)建編輯器實(shí)例

    • EditorState.create: 創(chuàng)建一個(gè)新的編輯器狀態(tài)對(duì)象,它保存著編輯器的文檔內(nèi)容、光標(biāo)位置等信息。
    • extensions: 這是 CodeMirror 中用于擴(kuò)展編輯器功能的配置數(shù)組。我們使用了 basicSetup(啟用一些常見(jiàn)的編輯功能)、XML 語(yǔ)言支持以及 Tab 大小設(shè)置等。
    • EditorView.updateListener: 用于監(jiān)聽(tīng)編輯器內(nèi)容的變化,每當(dāng)內(nèi)容更新時(shí),都會(huì)觸發(fā)該回調(diào),我們將文檔內(nèi)容同步到 Vue 的響應(yīng)式 contentStr 變量中。
  3. 掛載編輯器視圖

    • EditorView 用于創(chuàng)建實(shí)際的編輯器實(shí)例,我們將其掛載到 DOM 中的 viewRef 元素上。

步驟 3: 運(yùn)行項(xiàng)目

完成以上步驟后,你就可以啟動(dòng) Vue 項(xiàng)目并查看 CodeMirror 編輯器在瀏覽器中的顯示效果。在瀏覽器中,你應(yīng)該能夠看到一個(gè)帶有 XML 語(yǔ)法高亮的編輯器,并且可以進(jìn)行文本編輯。編輯器的內(nèi)容會(huì)自動(dòng)同步到 Vue 的響應(yīng)式變量中。

你可以查看 CodeMirror 6 的文檔 來(lái)了解更多可用的擴(kuò)展和配置選項(xiàng)。

總結(jié)

在本教程中,我們展示了如何在 Vue 3 中集成 CodeMirror V6,并創(chuàng)建了一個(gè)簡(jiǎn)單的 XML 編輯器。通過(guò)安裝所需的依賴(lài)并配置 EditorStateEditorView,我們能夠輕松地將 CodeMirror 編輯器嵌入到 Vue 應(yīng)用中。接下來(lái),你可以根據(jù)需要擴(kuò)展和定制編輯器功能,以滿足特定的業(yè)務(wù)需求。

希望這篇教程對(duì)你有所幫助,如果你有任何問(wèn)題,歡迎在評(píng)論區(qū)留言!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容