您好,登錄后才能下訂單哦!
本篇內容主要講解“codemirror6在線代碼編輯器如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“codemirror6在線代碼編輯器如何使用”吧!
CodeMirror是Web的代碼編輯器組件。它可以在網站中用于實現文本輸入字段,并支持許多編輯功能,并具有豐富的編程接口以允許進一步擴展。
其實codemirror
官網中的遷移指南有詳細列舉兩個版本關鍵特性的一些對比,下面列舉一些實際項目中用到的特性對比:
對比項 | codemirror5 | codemirror6 |
---|---|---|
創建編輯器 | 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}}) ②替換整個狀態:cm.setState(EditorState.create({doc: text, extensions: ...})) |
取值 | cm.getValue() | cm.state.doc.toString() |
由上表的對比也可以看出,codemirror6創建編輯器需要靠自己組裝,組裝部分并不難,但必須安裝并導入所需的組件。以下是核心包,沒有它們就很難設置一個編輯器,它們是:
@codemirror/state,它定義了表示編輯器狀態和對該狀態的更改的數據結構。
@codemirror/view,這是一個顯示組件,它知道如何向用戶顯示編輯器狀態,并將基本的編輯操作轉換為狀態更新。
@codemirror/commands定義了很多編輯命令和一些鍵綁定。
舉個栗子,我們可以看官網對于最輕量的編輯器的示例:
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({ // 狀態 state: startState, // 綁定元素 parent: document.body })
// 安裝codemirror npm i codemirror // 這里語言包要自行安裝 npm i @codemirror/lang-javascript
<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目前提供了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值的操作主要是對state的操作,數據流的互動如下圖所示,即該視圖聆聽事件。當DOM事件進來時,它(或綁定到密鑰的命令或按擴展名注冊的事件處理程序)將其轉換為狀態交易并分配它們。這建立了一個新狀態。當將新狀態授予視圖時,它將自行更新。
const undateValue = ()=>{ const value = editorView.value.state.doc.toString() if(value){ // 具體邏輯根據自己業務場景做變化 editorView.value.dispatch({changes: {from: 0, to:editorView.value.state.doc.length, insert: 'test'}}) } }
到此,相信大家對“codemirror6在線代碼編輯器如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。