亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue使用codemirror實現(xiàn)一個可插入自定義標(biāo)簽的textarea

 更新時間:2024年02月01日 11:08:51   作者:橙某人  
這篇文章主要為大家詳細(xì)介紹了Vue如何使用codemirror實現(xiàn)一個可插入自定義標(biāo)簽的textarea,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

寫在開頭

本章來分享一個小案例,具體效果如上圖所示。

該案例主要通過 CodeMirror 來實現(xiàn),而 CodeMirror 是一個通過 JS 實現(xiàn)的Web代碼編輯器組件,它帶有大量的語言模式、CSS主題和很多高級的插件功能,還允許進(jìn)一步擴展,總之它非常強大。

是一個很不錯的產(chǎn)品,值得推薦入手。

本次小編使用的是 CodeMirror5 版本,最新版本已經(jīng)到 6 了,而且開發(fā)者們也在積極維護(hù)。

這兩個版本差別還是挺大的,不過呢,對本篇文案的案例影響卻不大,我們只是使用到了其中一個很小的功能,所以你想使用哪個版本都是可以的。

貼兩個版本的文檔地址,可以自己瞅瞅:

codemirror5文檔

codemirror6文檔

正文

接下來就開始進(jìn)入主題了。

安裝:

npm install codemirror@5.65.14

演示部分小編選擇使用 Vue,其他技術(shù)棧都是可以的。

頁面結(jié)構(gòu):

<template>
  <div>
    <div class="textarea-editor">
      <textarea ref="textarea" class="textarea" />
    </div>
    <input v-model="content" placeholder="請輸入標(biāo)簽內(nèi)容" />&nbsp;
    <button @click="addTag">添加</button>
  </div>
</template>

JS 邏輯:

// 編輯器基本樣式
import "codemirror/lib/codemirror.css";
// 提示語樣式
import "codemirror/addon/display/placeholder";
import CodeMirror from "codemirror";

export default {
  data() {
    return {
      content: "",
      $cm: null, // 添加 $ 開頭能避免實例對象進(jìn)行依賴收集
    };
  },
  mounted() {
   this.init();
  },
  methods: {
    /** @name 初始化 **/
    init() {
      this.$cm = CodeMirror.fromTextArea(this.$refs.textarea, {
        placeholder: "請輸入......",
        lineWrapping: true, // 自動換行
      });
    },
    /** @name 標(biāo)記 **/
    markVariable(mark) {
      // 創(chuàng)建自定義的標(biāo)簽元素
      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;
      // 標(biāo)記特定的文本:https://codemirror.net/5/doc/manual.html#api_history
      this.$cm.markText(mark.start, mark.end, {
        replacedWith: spanDom, // 將特定位置的文本替換成給定的節(jié)點元素,必須是行元素,不能是塊元素
        atomic: true, // 原子化,會把節(jié)點元素當(dāng)成一個整體,光標(biāo)不會進(jìn)入其中
      });
    },
    /** @name 插入 **/
    insertVariable(content) {
      if (!content) return;
      // 獲取自定義標(biāo)簽未插入之前的光標(biāo)對象,記錄了光標(biāo)的位置和狀態(tài)
      const cursor = this.$cm.getCursor();
      // 將自定義標(biāo)簽插入textarea中:https://codemirror.net/5/doc/manual.html#api_selection
      // 在前后加上 ##與 $$ 只是方便我們后期getValue()的時候好進(jìn)行內(nèi)容匹配
      this.$cm.replaceSelection(`##${content}$$`);
      // 將插入的自定義標(biāo)簽進(jìn)行標(biāo)記(將 ##${content}$$ 變成 <span>{content}</span>)
      this.markVariable({
        start: cursor,
        end: this.$cm.getCursor(),  // 獲取自定義標(biāo)簽插入之后的光標(biāo)對象
        variable: content,
      });
      this.$cm.setCursor(this.$cm.getCursor());
      this.$cm.focus();
    },
    /** @name 添加自定義標(biāo)簽 **/
    addTag() {
      this.insertVariable(this.content);
    },
    /** @name 獲取值 **/
    getValue() {
      const value = this.$cm.getValue();
      console.log(value);
    },
  },
};

Em......以上代碼小編都寫上了詳細(xì)的注釋,代碼也縮減到不能再縮啦,應(yīng)該不是很難,相信都能看懂啦。

可能需要注意的是 CodeMirror 的光標(biāo)對象:

CodeMirror 給我們提供了很多操作輸入內(nèi)容的方法,很多時候都需要我們提供這個光標(biāo)對象。

最后就是樣式啦:

<style scoped>
.textarea-editor {
    width: 300px;
    height: 140px;
    border: 1px solid rgb(234, 234, 234);
    font-size: 14px;
    overflow: hidden;
    position: relative;
    cursor: text;
    margin-bottom: 10px;
}
.textarea-editor:hover {
    border-color: #6c8dff;
}
.textarea {
    width: 100%;
    height: 100%;
    border: none;
    background-color: transparent;
}
</style>

<style>
/* 全局樣式,覆蓋codemirror一些基本樣式 */
.textarea-editor .CodeMirror {
    width: 100%;
    height: 100%;
}
.textarea-editor pre.CodeMirror-line,
.textarea-editor pre.CodeMirror-line-like {
    line-height: 24px;
    outline: none;
}
.textarea-tag {
    width: fit-content;
    height: 24px;
    line-height: 24px;
    text-align: center;
    min-width: 60px;
    max-width: 260px;
    font-size: 12px;
    border-radius: 11px;
    color: #fff;
    background-color: #fab30b;
    box-sizing: border-box;
    padding: 2px 6px;
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap;
}
</style>

以上就是這個案例的全部源碼內(nèi)容啦。

結(jié)尾

可能有小伙伴會在想做一個可插入自定義標(biāo)簽的 textarea ,需要那么麻煩專門去引入 CodeMirror 嗎?

當(dāng)然不需要,如果僅僅是這個功能的話

但是,由于小編業(yè)務(wù)中對這個 textarea 還有很多其他需求,比如字體顏色的處理、智能提示、復(fù)制粘貼、兼容性問題等等,所以選擇 CodeMirror 可以幫忙省下很多麻煩事。

到此這篇關(guān)于Vue使用codemirror實現(xiàn)一個可插入自定義標(biāo)簽的textarea的文章就介紹到這了,更多相關(guān)Vue codemirror實現(xiàn)自定義標(biāo)簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VUE2實現(xiàn)事件驅(qū)動彈窗示例

    VUE2實現(xiàn)事件驅(qū)動彈窗示例

    本篇文章主要介紹了VUE2實現(xiàn)事件驅(qū)動彈窗示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Vue集成three.js并加載glb、gltf、FBX、json模型的場景分析

    Vue集成three.js并加載glb、gltf、FBX、json模型的場景分析

    這篇文章主要介紹了Vue集成three.js,并加載glb、gltf、FBX、json模型,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • vue2.0 + element UI 中 el-table 數(shù)據(jù)導(dǎo)出Excel的方法

    vue2.0 + element UI 中 el-table 數(shù)據(jù)導(dǎo)出Excel的方法

    下面小編就為大家分享一篇vue2.0 + element UI 中 el-table 數(shù)據(jù)導(dǎo)出Excel的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue 圖片裁剪上傳組件的實現(xiàn)

    vue 圖片裁剪上傳組件的實現(xiàn)

    這篇文章主要介紹了vue 圖片裁剪上傳組件的實現(xiàn),幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-11-11
  • vue3 name 屬性的使用技巧詳解

    vue3 name 屬性的使用技巧詳解

    這篇文章主要為大家介紹了vue3 name 屬性的使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • vue?vue-esign簽字板的demo

    vue?vue-esign簽字板的demo

    這篇文章主要介紹了vue?vue-esign簽字板的實例講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue動畫之第三方類庫實現(xiàn)動畫方式

    Vue動畫之第三方類庫實現(xiàn)動畫方式

    這篇文章主要介紹了Vue動畫之第三方類庫實現(xiàn)動畫方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue項目開發(fā)中setTimeout等定時器的管理問題

    vue項目開發(fā)中setTimeout等定時器的管理問題

    這篇文章主要介紹了vue項目開發(fā)中setTimeout等定時器的管理問題,需要的朋友可以參考下
    2018-09-09
  • vue3自己封裝面包屑功能組件的幾種方式

    vue3自己封裝面包屑功能組件的幾種方式

    網(wǎng)站中我們經(jīng)??吹接袀€導(dǎo)航路徑,可以直觀地顯示當(dāng)前頁面的路徑,并快速返回之前的任意頁面,這是一個非常實用的功能,也是在Web前端必備的導(dǎo)航UI之一,這篇文章主要給大家介紹了關(guān)于vue3自己封裝面包屑功能組件的幾種方式,需要的朋友可以參考下
    2021-09-09
  • VuePress在build打包時window?document?is?not?defined問題解決

    VuePress在build打包時window?document?is?not?defined問題解決

    這篇文章主要為大家介紹了VuePress在build打包時window?document?is?not?defined問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評論