CodeMirror 創建標簽計算編輯器

? ? ? ? ?在日常開發中對于一些數據計算場景可能會遇到標簽計算的需求,下面關于如何使用CodeMirror實現標簽計算編輯功能。

1,結果圖

2,主體代碼邏輯

大家只需要復制粘貼主要codeMirror使用邏輯即可


<template><el-dialogref="dialogRef":model-value="visible"width="800px":close-on-press-escape="false"destroy-on-closeappend-to-body@close="() => {$emit('update:visible', false);}"><template #title><span> 編輯表達式 </span></template><!-- 左側無用dom元素已刪除 --><div class="content__right"><div class="symbol-group"><div v-for="item in symbolList" :key="item.code" class="symbol-item" @click="handleSymbolClick(item)">{{ item.name }}</div></div><!-- 代碼編輯器 --><textarearef="codeEditorContainerRef"v-model="currentCodeInEditor"class="editor"/></div></div><template #footer><div class="dialog-button-box"><el-buttonsize="small"@click="() => {$emit('update:visible', false);}">取消</el-button><el-button size="small" type="primary" @click="handleOk">確定</el-button></div></template></el-dialog>
</template><script lang="ts">
import { defineComponent, reactive, toRefs, watch, ref, onMounted, nextTick } from 'vue';
import { InfoFilled, Search } from '@element-plus/icons';
import { TreeNodeData } from 'element-plus/es/el-tree/src/tree.type.d';
// 引入代碼編輯器核心配置包
import * as CodeMirror from 'codemirror';
import 'codemirror/lib/codemirror.css';// 引入代碼編輯器主題樣式
import 'codemirror/theme/base16-light.css';
import 'codemirror/theme/ambiance.css';
import 'codemirror/addon/hint/show-hint.css';
import 'codemirror/theme/monokai.css';
import 'codemirror/theme/material.css';
import 'codemirror/theme/dracula.css';
import 'codemirror/addon/fold/foldgutter.css';
import 'codemirror/mode/javascript/javascript';// 引入代碼編輯器常用語言包
require('codemirror/addon/edit/matchbrackets');
require('codemirror/addon/selection/active-line');
require('codemirror/mode/sql/sql');
require('codemirror/addon/hint/show-hint');
require('codemirror/addon/hint/sql-hint');
require('codemirror/keymap/sublime');// 引入代碼折疊文件
require('codemirror/addon/fold/foldcode');
require('codemirror/addon/fold/foldgutter');
require('codemirror/addon/fold/brace-fold');
require('codemirror/addon/fold/xml-fold');
require('codemirror/addon/fold/indent-fold');
require('codemirror/addon/fold/markdown-fold');
require('codemirror/addon/fold/comment-fold');export default defineComponent({name: 'RemarksDialog',components: {},props: {visible: {type: Boolean,default: false,},data: {type: String,default: '',},},emits: ['update:visible', 'save'],setup(props, { emit }) {const dialogRef = ref();const state = reactive({// 符號列表symbolList: [{id: 'plus',code: 'plus',name: '+',type: 'operator',},{id: 'minus',code: 'minus',name: '-',type: 'operator',},{id: 'multiply',code: 'multiply',name: '*',type: 'operator',},{id: 'exception',code: 'exception',name: '/',type: 'operator',},{id: 'leftBrackets',code: 'leftBrackets',name: '(',type: 'operator',},{id: 'rightBrackets',code: 'rightBrackets',name: ')',type: 'operator',},] as SymbolItem[],});// 代碼編輯器容器實例const codeEditorContainerRef = ref<HTMLElement | null>();// 代碼編輯器let editor : TreeNodeData | null;// 編輯器當前所用編程語言const currentLanguage = ref('javascript');// 編輯器當前主題const currentTheme = ref('base16-light');// 編輯器當前展示的代碼const currentCodeInEditor = ref();// 獲取表達式的元素集合const getCalcResult = (): SymbolItem[] => {const temp: any[] = editor?.getValue().split('$');// 清除最后一個空格元素temp.pop();// 循環生成最后的集合return temp.map((item: string) => state.calculationIdMap[item]).filter((item) => !!item);};/*** @description: 創建標簽* @return {*}*/const makeLabel = (mark: any) => {const spanDom = document.createElement('span');const label = mark.variable;spanDom.title = label;spanDom.innerText = label;spanDom.classList.add('textarea-tag');spanDom.dataset.variable = mark.variable;editor?.markText(mark.start, mark.end, {replacedWith: spanDom, // 將特定位置的文本替換成給定的節點元素,必須是行元素,不能是塊元素atomic: true, // 原子化,會把節點元素當成一個整體,光標不會進入其中});};/*** @description: 插入標簽* @return {*}*/const insertLabel = (content: any, isCalcDim: boolean) => {if (!content) return;const cursor = editor?.getCursor();editor?.replaceSelection(`${content.code}$`);makeLabel({start: cursor,end: editor?.getCursor(), // 獲取自定義標簽插入之后的光標對象variable: content.name,});editor?.setCursor(editor?.getCursor());editor?.focus();};/*** 初始化代碼編輯器*/const initEditor = () => {nextTick(() => {if (codeEditorContainerRef.value) {editor = CodeMirror.fromTextArea(codeEditorContainerRef.value, {// 編輯器語言的模式mode: currentLanguage.value,// 編輯器主題風格theme: currentTheme.value,// 縮進的時候,是否把前面的 N*tab 大小的空間,轉化為 N個tab 字符indentWithTabs: true,// 是否使用 mode 提供的上下文的縮進smartIndent: true,// 編輯器左側是否顯示行號lineNumbers: true,// 括號匹配matchBrackets: true,// 初始化時是否自動獲得焦點autofocus: true,// 代碼自動換行lineWrapping: true,// 代碼塊折疊foldGutter: true,// 只讀readOnly: false,// 代碼塊折疊樣式gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],// 自定義快捷鍵extraKeys: { Ctrl: 'autocomplete' },// 自定義提示選項hintOptions: {tables: {users: ['name', 'score', 'birthDate'],countries: ['name', 'population', 'size'],},},});// 公式回顯if (props.data) {const dataArray = JSON.parse(props.data);dataArray.forEach((item: any) => {insertLabel(item, false);state.calculationIdMap[item.code] = item;});// 重新計算時間維度和可用維度setTimeout(() => {// 重新計算時間維度和其他可用維度resetCurrentDateDimension();resetCurrentOtherDimension();}, 500);}}});};/*** @description: 符號點擊觸發方法* @param {SymbolItem} data* @return {*}*/const handleSymbolClick = (data: SymbolItem) => {insertLabel(data, false);state.calculationIdMap[data.code] = data;};watch(() => props.visible,async (newVal) => {if (newVal) {initEditor();await getIndicatorList();} else {state.currentOtherDimension = [];state.currentDateDimension = {} as any;}},);return {...toRefs(state),dialogRef,Search,codeEditorContainerRef,currentCodeInEditor,handleSymbolClick,};},
});
</script><style lang="scss" scoped></style>

大家只需要關注codeMirror插件的引入以及相關api 的使用即可。

未解決的問題:在點擊生成標簽只有,不能通過鼠標點擊直接移動光標位置,只能通過方向鍵移動光標位置。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22321.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抖店商家疑惑,自然流量突然下滑,為什么呢?

大家好&#xff0c;我是噴火龍。 很多的抖店商家會遇到一種情況&#xff0c;那就是自己店鋪的流量好好的&#xff0c;不知道怎么的就突然沒流量了&#xff0c;各方面的數據都斷崖式的下降。 為什么會這樣呢&#xff1f;原因有以下幾點&#xff0c;大家可以檢查一下&#xff0…

低代碼和零代碼軟件時代質量管理(QM)和質量管理系統(QMS)

【前言】 質量控制過程的目的是為了確保產品的制造標準得到保持和改進。質量控制過程使公司能夠滿足客戶的期望&#xff0c;同時確保產品質量的一致水平。采用這些標準創造了一種公司文化&#xff0c;鼓勵所有員工努力實現高質量的生產標準。低代碼和零代碼軟件可以成為質量控…

【網絡通信層】華為云連接MQTT設備

本文介紹華為云設備連接到設備的操作。 目錄 一、在華為云創建設備 二、連接MQTT 三、通信 一、在華為云創建設備 現在華為云上可以免費使用部分受限服務&#xff0c;包括免費創建自己的設備連接。 首先&#xff0c;登錄華為云平臺共建智能世界云底座-華為云 (huaweicl…

徐州服務器機柜租用的好處

隨著服務器的廣泛應用&#xff0c;越來越多的企業都選擇服務器托管和租用等服務&#xff0c;在選擇服務器租用之前我們還需要進行機柜租用&#xff0c;便于放置所適用的服務器&#xff0c;那么企業選擇徐州服務器機柜租用的好處有哪些呢&#xff1f; 選擇徐州服務器機柜租用&am…

Qt Window Dialog 無標題欄 ,無邊框,可拖動

1.效果&#xff1a; 2. 主要實現步驟&#xff1a; 設置窗口 flag&#xff1a; this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); 創建變量存儲位置 QPoint m_dragPosition; 對鼠標左鍵按下和移動事件做處理 void DraggableDialog::mousePre…

Java 集合中的組內平均值計算

在Java開發中&#xff0c;集合&#xff08;Collection&#xff09;是一個重要的數據結構&#xff0c;廣泛應用于各種場景。計算集合中的組內平均值是一個常見的操作&#xff0c;尤其是在數據分析、統計和處理時更為重要。本文將深入探討如何使用Java來計算集合中的組內平均值&a…

Web 頁面性能衡量指標-以用戶為中心的效果指標

Web 頁面性能衡量指標-以用戶為中心的性能指標 以用戶為中心的性能指標是理解和改進站點體驗的關鍵點 一、以用戶為中心的性能指標 1. 指標是用來干啥的&#xff1f; 指標是用來衡量性能和用戶體驗的 2. 指標類型 感知加載速度&#xff1a;網頁可以多快地加載網頁中的所有…

如何在vs code中安裝JavaFX

目錄 下載JavaFX 配置vs code工程 編寫測試代碼 下載JavaFX 網站鏈接:https://openjfx.io 選擇如下的版本

從1.0到4.0,看看你公司的費控模式是第幾代?

早在2021年9月&#xff0c;艾媒咨詢在《2021H1企業費控報銷服務專題研究報告》中&#xff0c;第一次對企業費用管控模式的進化歷程進行了清晰的劃代&#xff1a;1.0手工模式、2.0網報模式、3.0移動報銷模式、4.0智能費控模式。 2022年&#xff0c;在《中國企業費用管理發展白皮…

vr樣板房實景漫游展示制作解決了地產商難題

家具和軟裝銷售中&#xff0c;如何直觀展示產品優勢一直是老板們的難題。口頭描述往往難以讓客戶真正感受到產品的獨特之處&#xff0c;這不僅影響了銷售效果&#xff0c;也增加了溝通的難度。但現在&#xff0c;我們有了全新的解決方案——樣板房VR全景編輯軟件! 樣板房VR全景…

精打細算:可燃氣體報警器檢驗收費的合理規劃與管理

隨著工業化的快速發展&#xff0c;可燃氣體報警器已經成為各類工業場所不可或缺的安全設備。 它的主要功能是在可燃氣體濃度超標時發出警報&#xff0c;有效預防和減少火災、爆炸等安全事故的發生。 然而&#xff0c;為了確保報警器能夠持續、準確地發揮作用&#xff0c;定期…

科技盛事即將拉開帷幕,WWDC2024官宣定檔,亮點搶先看!

隨著全球科技愛好者們對蘋果年度開發者大會&#xff08;WWDC&#xff09;的期待日益高漲&#xff0c;今年的WWDC24&#xff08;蘋果全球開發者大會&#xff09;&#xff0c;正式宣告這一科技盛事將于北京時間6月11日凌晨1點拉開帷幕。距離WWDC 2024的召開只剩下一周時間&#x…

【電子取證篇】電子數據取證標準合集更新202405(附下載)

【電子取證篇】電子數據取證標準合集更新202405&#xff08;附下載&#xff09; 電子數據取證相關標準合集&#xff0c;按照司法鑒定職業分類目錄&#xff0c;對電子數據鑒定可能涉及的測試、測量方法進行標準歸類&#xff0c;更新于2024年05月14日—【蘇小沐】 &#xff08;…

前端localForage存儲數據使用教程

前言 前端本地化存儲算是一個老生常談的話題了&#xff0c;我們對于 cookies、Web Storage&#xff08;sessionStorage、localStorage&#xff09;的使用已經非常熟悉&#xff0c;在面試與實際操作之中也會經常遇到相關的問題&#xff0c;但這些本地化存儲的方式還存在一些缺陷…

「技能培訓」硬蛋學堂職業技能培訓,助你掌握未來技術!!!

硬蛋學堂職業技能培訓 &#x1f680; 火熱報名中&#xff01; &#x1f680; &#x1f31f; 2024年已過半&#xff0c;我們迎來了年中的轉折點。你是否還在為年初制定的宏偉計劃而奮斗&#xff1f;是否渴望在職場上更進一步&#xff0c;卻苦于缺乏機會和資源&#xff1f; &a…

systemctl系統控制器

systemctl系統控制器 作用&#xff1a;控制服務的開啟、關閉、開機自啟、禁止開機自啟 查看linux中所有的服務 systemctl --type service 檢查服務狀態 systemctl is-active 服務名 &#xff08;簡要&#xff09;systemctl status 服務名&#xff08;詳情&#xff09; 開…

期權懂題庫免費!期權開戶測試難嗎?多少分算合格通過?

今天帶你了解期權懂題庫免費&#xff01;期權開戶測試難嗎&#xff1f;多少分算合格通過&#xff1f;期權開戶測試通常要求投資者達到一定的合格分數&#xff0c;以確保他們具備足夠的理解和知識來參與期權交易。 期權開戶測試難嗎&#xff1f; 期權開戶測試的難度因人而異&am…

【設計模式深度剖析】【1】【行為型】【模板方法模式】| 以烹飪過程為例加深理解

&#x1f448;?上一篇:結構型設計模式對比 文章目錄 模板方法模式定義英文原話直譯如何理解呢&#xff1f; 2個角色類圖代碼示例 應用優點缺點使用場景 示例解析&#xff1a;以烹飪過程為例類圖代碼示例 模板方法模式 模板方法模式&#xff08;Template Method Pattern&…

C++linux下使用clog和重定向實現寫日志

Clinux下使用clog和重定向實現寫日志 實現文件基本功能測試編譯運行額外知識點 實現文件 LogUtil.hpp /** * 通用日志實現 * lsl * 2024-06-04 */#ifndef LOGUTIL_HPP #define LOGUTIL_HPP #include<iostream> #include <time.h> #include <cstring> #defi…

LED驅動IC:HC2161,升壓型LED恒流驅動ic,供應LED燈杯單節電池以上供電的LED燈串平板顯示LED背光大功率LED照明

LED驅動IC&#xff1a; HC2161:升壓型LED恒流驅動ic 概述&#xff1a;HC2161是一款高效率、高精度的升 壓型大功率LED恒流驅動控制芯片。 HC2161內置高精度誤差放大器&#xff0c;固 定關斷時間控制電路&#xff0c;恒流驅動電路等&#xff0c; 特別適合大功率、多個高亮…