溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

codemirror6在線代碼編輯器如何使用

發(fā)布時間:2023-01-09 09:13:02 來源:億速云 閱讀:403 作者:iii 欄目:開發(fā)技術

本篇內(nèi)容主要講解“codemirror6在線代碼編輯器如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“codemirror6在線代碼編輯器如何使用”吧!

介紹

    CodeMirror是Web的代碼編輯器組件。它可以在網(wǎng)站中用于實現(xiàn)文本輸入字段,并支持許多編輯功能,并具有豐富的編程接口以允許進一步擴展。

codemirror5、codemirror6對比

    其實codemirror官網(wǎng)中的遷移指南有詳細列舉兩個版本關鍵特性的一些對比,下面列舉一些實際項目中用到的特性對比:

對比項codemirror5codemirror6
創(chuàng)建編輯器codemirror.fromTextarea(element)import { basicSetup, EditorState, EditorView } from '@codemirror/basic-setup';
const editor = new EditorView({state:EditorState.create(
{doc: code,extensions: [basicSetup]}),
parent: this.$refs.editor as HTMLDivElement,});
設置值cm.setValue(text)①更改值:cm.dispatch({changes: {from: 0, to:cm.state.doc.length, insert: text}})
②替換整個狀態(tài):cm.setState(EditorState.create({doc: text, extensions: ...}))
取值cm.getValue()cm.state.doc.toString()

codemirror6 核心包

    由上表的對比也可以看出,codemirror6創(chuàng)建編輯器需要靠自己組裝,組裝部分并不難,但必須安裝并導入所需的組件。以下是核心包,沒有它們就很難設置一個編輯器,它們是:

  • @codemirror/state,它定義了表示編輯器狀態(tài)和對該狀態(tài)的更改的數(shù)據(jù)結構。

  • @codemirror/view,這是一個顯示組件,它知道如何向用戶顯示編輯器狀態(tài),并將基本的編輯操作轉換為狀態(tài)更新。

  • @codemirror/commands定義了很多編輯命令和一些鍵綁定。

    舉個栗子,我們可以看官網(wǎng)對于最輕量的編輯器的示例:

import {EditorState} from "@codemirror/state"
import {EditorView, keymap} from "@codemirror/view"
import {defaultKeymap} from "@codemirror/commands"
let startState = EditorState.create({
  // 顯示文本
  doc: "Hello World",
  // 擴展,**keymap:** 配置要使用的快捷鍵;語言包等也是作為擴展在此配置
  extensions: [keymap.of(defaultKeymap)]
})
let view = new EditorView({
  // 狀態(tài)
  state: startState,
  // 綁定元素
  parent: document.body
})

vue3+codemirror6實現(xiàn)簡易在線代碼編輯器

安裝依賴

// 安裝codemirror
npm i codemirror
// 這里語言包要自行安裝
npm i  @codemirror/lang-javascript

創(chuàng)建編輯器

<template>
  <div ref="editorRef" class="editor-main"></div>
</template>
<script lang="ts" setup>
import { basicSetup, EditorView } from "codemirror";
import { EditorState } from "@codemirror/state";
import { javascript } from "@codemirror/lang-javascript";
import {json} from '@codemirror/lang-json'
import { onMounted, ref } from "vue";
const editorRef = ref();
const editorView = ref();
const initEditor = () => {
  if (typeof editorView.value !== "undefined") {
    editorView.value.destroy();
  }
  const jsonString = `{
  root: true,
  extends: [
    "plugin:vue/vue3-essential",
    "eslint:recommended",
    "@vue/eslint-config-typescript",
    "@vue/eslint-config-prettier",
    "vue-global-api"
  ],
  parserOptions: {
    ecmaVersion: "latest",
  },
  rules: {
    "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
    "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
    endOfLine: "auto",
    "prettier/prettier": ["error", { "endOfLine": "auto" }]
  },
}`
  const startState = EditorState.create({
    doc:jsonString,
    extensions: [basicSetup, javascript(),json()],
  });
  if (editorRef.value) {
    editorView.value = new EditorView({
      state: startState,
      parent: editorRef.value,
    });
  }
};
// onMounted生命周期可以保證讀取到dom元素
onMounted(() => {
  initEditor();
});
</script>
<style lang="scss" scoped>
.editor-main{
  width: 100vw;
  height: 100vh;
}
</style>

    這里的basicSetup擴展包含了行號,不需要再做額外的配置~

效果截圖

codemirror6在線代碼編輯器如何使用

主題

    codemirror6目前提供了theme-one-dark主題,也可以使用theme進行拓展

// 安裝
npm i @codemirror/theme-one-dark
// 使用
import { oneDarkTheme } from "@codemirror/theme-one-dark";
const startState = EditorState.create({
    doc: jsonString,
    extensions: [basicSetup,oneDarkTheme, javascript(), json()],
  });
// 自定義主題
const  myTheme = EditorView.theme({
  "&": {
    color: "white",
    backgroundColor: "#034"
  },
  ".cm-content": {
    caretColor: "#0e9"
  },
  "&.cm-focused .cm-cursor": {
    borderLeftColor: "#0e9"
  },
  "&.cm-focused .cm-selectionBackground, ::selection": {
    backgroundColor: "#074"
  },
  ".cm-gutters": {
    backgroundColor: "#045",
    color: "#ddd",
    border: "none"
  }
}, {dark: true})
// 使用
  const startState = EditorState.create({
    doc: jsonString,
    extensions: [basicSetup,myTheme, javascript(), json()],
  });

主題效果截圖:

codemirror6在線代碼編輯器如何使用

獲取、更改編輯器的值

    從兩個版本對比中也可以知道,codemirror6值的操作主要是對state的操作,數(shù)據(jù)流的互動如下圖所示,即該視圖聆聽事件。當DOM事件進來時,它(或綁定到密鑰的命令或按擴展名注冊的事件處理程序)將其轉換為狀態(tài)交易并分配它們。這建立了一個新狀態(tài)。當將新狀態(tài)授予視圖時,它將自行更新。

codemirror6在線代碼編輯器如何使用

const undateValue = ()=>{
  const value = editorView.value.state.doc.toString()
  if(value){
   // 具體邏輯根據(jù)自己業(yè)務場景做變化
    editorView.value.dispatch({changes: {from: 0, to:editorView.value.state.doc.length, insert: 'test'}})
  }
}

到此,相信大家對“codemirror6在線代碼編輯器如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI