十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章將為大家詳細(xì)講解有關(guān)VueJS中集成Medium Editor的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在桓臺等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需制作網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),桓臺網(wǎng)站建設(shè)費(fèi)用合理。
0x00 前言
VueJS 社區(qū)里面關(guān)于富文本編輯器的集成也不少了,但是之前小調(diào)研了一下,基本上就是 quill,medium-editor,因?yàn)橹坝?AngularJS 用過 medium-editor,并且需要自定義某些按鈕,而且最好還是選中彈出式的,所以就決定用 medium-editor。
社區(qū)里面 star 較多的就是這個了:vue-medium-editor,但是打開它官網(wǎng),看了看文檔,越看越別扭,來看看它用法:
gosh,傳這么多參數(shù),我只想要一個簡單的 editor 啊
打開源碼一看,就 62 行,所以決定自己動手來一個簡單點(diǎn)的
0x01 最簡版
最簡版,其實(shí)就在 vue 組件中實(shí)例化一下 medium-editor 就可以了
完成~,是不是很簡單~~哈哈,最簡版是一個 v-html 控制的,但是會有自動跳轉(zhuǎn)到首行的問題,所以這里是最終版,細(xì)節(jié)問題看注釋啦
0x02 用法
咋用呢?很簡單,在其他組件中這樣:
當(dāng)然 你首先得安裝 medium-editor的 js 和 css了
0x03 自定義 button
下面是我項(xiàng)目中用到的自定義 button 的相關(guān)代碼,是一個 buttonBuilder:
import MediumEditor from 'medium-editor' import rangy from 'rangy/lib/rangy-core.js' import 'rangy/lib/rangy-classapplier' import 'rangy/lib/rangy-highlighter' import 'rangy/lib/rangy-selectionsaverestore' import 'rangy/lib/rangy-textrange' import 'rangy/lib/rangy-serializer' const pHash = { p1: { name: 'p1', class: 'fs-36' }, p2: { name: 'p2', class: 'fs-30' }, p3: { name: 'p3', class: 'fs-24' }, p4: { name: 'p4', class: 'fs-18' }, p5: { name: 'p5', class: 'fs-14' }, p6: { name: 'p6', class: 'fs-12' } } function pButtonCreator (p) { return MediumEditor.Extension.extend({ name: p.name, init: function () { this.classApplier = rangy.createClassApplier(p.class, { elementTagName: 'span', normalize: false }) this.button = this.document.createElement('button') this.button.classList.add('medium-editor-action') this.button.innerHTML = p.name this.button.title = p.class this.on(this.button, 'click', this.handleClick.bind(this)) }, getButton: function () { return this.button }, clearFontSize: function () { MediumEditor.selection.getSelectedElements(this.document).forEach(function (el) { if (el.nodeName.toLowerCase() === 'span' && el.hasAttribute('class')) { el.removeAttribute('class') } }) }, handleClick: function (event) { this.clearFontSize() this.classApplier.toggleSelection() // Ensure the editor knows about an html change so watchers are notified // ie:
簡單來說就是給選中的文字加一些 class (上面是 fs-xx 之類的),其中需要引一個鼠標(biāo)選中的庫 rangy,挺煩人的也是,然后在 text-editor 中這樣用:
先實(shí)例化
import ButtonBuilder from './buttonBuilder' var editorOptions = { toolbar: { buttons: ['bold', 'italic', 'underline', 'removeFormat', 'p3', 'p4', 'p5', 'p6'] }, buttonLabels: 'fontawesome', // use font-awesome icons for other buttons extensions: { p3: new ButtonBuilder.P3(), p4: new ButtonBuilder.P4(), p5: new ButtonBuilder.P5(), p6: new ButtonBuilder.P6() }, placeholder: false }
再放到 editor 上
this.editor = new MediumEditor(this.$el, Object.assign({}, editorOptions, this.options))
當(dāng)然上面實(shí)例化的步驟不一定要寫到這個組件里面,配置 options 也可以從組件外傳入
0x04 細(xì)節(jié)和坑
1、這里用到了 v-model 的自定義實(shí)現(xiàn),詳見官方文檔:v-model
簡單來說呢就是 props: value ,和 this.$emit('input', model) 就可以實(shí)現(xiàn)在組件中模擬 v-model 啦
2、多個 editor 使用的自定義button 實(shí)例的問題。由于我自己應(yīng)用的時(shí)候有兩個挨著的 要解決這個也很簡單,修改這一行: this.editor = new MediumEditor(this.$el, Object.assign({}, _.cloneDeep(editorOptions), this.options)) 將自定義的 options 深復(fù)制一下,這里借助了 lodash 的函數(shù)。 關(guān)于“VueJS中集成Medium Editor的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
分享題目:VueJS中集成MediumEditor的示例分析
文章鏈接:http://m.jiaotiyi.com/article/gcosii.html