富文本編輯器-2-組件封裝

目前github上已經(jīng)有將Quill封裝一層的vue-quill-editor,對(duì)于使用Vue且想直接用Quill基本功能的同學(xué)剔宪,可以直接安裝使用宿饱。由于公司業(yè)務(wù)需要定制一些功能,用vue-quill-editor或直接用quill沒(méi)有太大區(qū)別针余,都需要自行封裝組件饲鄙,所以沒(méi)有引入vue-quill-editor,而是參考其封裝圆雁。

主要的props

  1. value: v-model綁定內(nèi)容
  2. toolbarOptions:指定工具欄功能項(xiàng)忍级,可以傳入數(shù)組,也可以傳入類(lèi)或id伪朽,如'.toolbar'轴咱。一開(kāi)始考慮用html的方式實(shí)現(xiàn)工具欄,以更靈活地進(jìn)行改寫(xiě)烈涮,綁定事件等朴肺。但這樣做,如果使用者想用組件已有幾種功能坚洽,也必須在外部重寫(xiě)toolbar的slot戈稿。最后選擇默認(rèn)使用options數(shù)組。
defaultToolbarOptions: [
  ['undo', 'redo'],
  [{ 'size': this.sizeList }],
  [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
  ['blockquote', 'divider'],
  ['clean', 'formatBrush'],
  ['link', 'emoji', 'image'],
  ['bold', 'italic', 'underline', 'strike'],
  [{ 'color': [] }, {'background': []}],
  [{ 'script': 'sub' }, { 'script': 'super' }],
  [{ 'indent': '-1' }, { 'indent': '+1' }, { 'align': [] }, { 'direction': 'rtl' }],
  [{ 'list': 'ordered' }, { 'list': 'bullet' }]
]
...
// 初始化
let toolbarOptions = this.toolbarOptions || this.defaultToolbarOptions
  1. options: 指定整個(gè)Quill初始化的options讶舰。用toolbarOptions可以滿(mǎn)足大部分業(yè)務(wù)器瘪,但不排除部分業(yè)務(wù)處理方法也需要定制,所以也應(yīng)該支持由外部來(lái)指定初始化的options绘雁。
  2. disabled: 是否可寫(xiě)

基礎(chǔ)文本模塊的封裝

一開(kāi)始考慮直接在組件中添加/重寫(xiě)模塊橡疼,分為以下4步:

  1. 組件引入格式類(lèi)
  2. 組件引入handler.js
  3. 統(tǒng)一增加對(duì)應(yīng)的工具欄圖標(biāo)
  4. 注冊(cè)引入的格式
  5. 綁定點(diǎn)擊工具欄圖標(biāo)的handler
···
  // 1.引入對(duì)應(yīng)的格式類(lèi)
  import Blockquote, {BlockquoteItem} from './editor-blot/blockquote.js'
  import Divider from './editor-blot/divider.js'
// 2.引入handler
  import {undo, redo, insertDivider, copyFormat} from './editor-blot/handler.js'
···
  init () {
        Quill.register('modules/imageResize', ImageResize)
        // 3.圖標(biāo)增加
        this.addIcons()
        // 4.重寫(xiě)/添加格式功能
        this.registerFormats()
        this.options = {
          modules: {
            toolbar: {
              container: this.$refs.toolbar,
              // 5.改寫(xiě)handler
              handlers: {
                'undo': () => { undo(this.quill) },
                'redo': () => { redo(this.quill) },
                'divider': () => { insertDivider(this.quill) },
                'formatBrush': () => { copyFormat(this.quill, this.copyFormatting) },
                'emoji': function () {},
                'image': () => {
                  this.img.show = true
                }
              }
            },
            imageResize: {},
            toolbar_emoji: true,
            short_name_emoji: true,
            textarea_emoji: false,
            tooltip: true
          },
          readOnly: this.readOnly,
          placeholder: '請(qǐng)輸入內(nèi)容',
          theme: 'snow'
        }
        this.quill = new Quill(this.$refs.editor, this.options)
      },
      /* 添加icons */
      addIcons () {
        let icons = Quill.import('ui/icons')
        for (let key in ToolIcons) {
          icons[key] = ToolIcons[key]
        }
      },
      /* 注冊(cè)格式 */
      registerFormats () {
        // 字號(hào)重寫(xiě)
        let Size = Quill.import('attributors/style/size')
        Size.whitelist = ['12px', '14px', '16px', '18px', '20px', '24px']
        Quill.register({
          // 字號(hào)
          'formats/size': Size,
          // 段落
          'formats/blockquote': Blockquote,
          'formats/blockquote-item': BlockquoteItem,
          // 分割線(xiàn)
          'formats/divider': Divider
        })
      },

但這樣做,存在問(wèn)題:

  1. 如果使用者使用options屬性定制整個(gè)Quill庐舟,且又需要段落欣除、分割線(xiàn)等模塊,則需要將步驟1挪略,2, 4 , 5重復(fù)寫(xiě)一遍历帚。
  2. handler中需要傳入組件的this.quill,意味著在使用文件需要用this.refs.editor.refs.quill來(lái)傳參杠娱,顯然這種方式不太友好挽牢。

為了解決這些問(wèn)題,最終決定參考github的其他Quill功能模塊(如quill-emoji)摊求,多一步封裝過(guò)程禽拔,合并格式類(lèi)和handler,將功能模塊化:
1.編寫(xiě)格式類(lèi)
2.編寫(xiě)模塊類(lèi),編寫(xiě)對(duì)應(yīng)的handler睹栖,并注冊(cè)到Quill的modules上(模塊對(duì)應(yīng)的index.js)
3.使用時(shí)硫惕,(組件/外部)直接引入模塊,并在options設(shè)置模塊為true
這樣一來(lái)野来,即便以后需要實(shí)現(xiàn)其他個(gè)性化業(yè)務(wù)恼除,使用者也能用步驟3,簡(jiǎn)單地引用已有模塊曼氛。如果需要新的模塊豁辉,可以編寫(xiě)后在組件引入。

...
  // 引入模塊
  import './quill-tooltip/tooltip-body.js'
  import './quill-blockquote/index.js'
  import './quill-divider/index.js'
  import './quill-undo-redo/index.js'
  import './quill-format-brush/index.js'
...
  init () {
        Quill.register('modules/imageResize', ImageResize)
        this.addIcons()
        this.registerFont()
        let toolbarOptions = this.toolbarOptions || this.defaultToolbarOptions
        this.defaultOptions = {
          modules: {
            toolbar: {
              container: toolbarOptions,
              handlers: {
                'emoji': () => {},
                'image': () => { this.img.show = true }
              }
            },
            imageResize: {},
            toolbar_emoji: true,
            short_name_emoji: true,
            textarea_emoji: false,
            //  設(shè)置需要的模塊為true,從外部傳入模塊時(shí)舀患,直接設(shè)置即可
            tooltip: true,
            divider: true,
            undo_redo: true,
            format_brush: true
          },
          placeholder: '請(qǐng)輸入內(nèi)容',
          theme: 'snow'
        }
        let options = this.options || this.defaultOptions
        this.quill = new Quill(this.$refs.editor, options)
        this.quill.enable(false)
        this.initContent()
        if (!this.disabled) {
          this.quill.enable(true)
        }
        this.addEvents()
      }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秋忙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子构舟,更是在濱河造成了極大的恐慌灰追,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狗超,死亡現(xiàn)場(chǎng)離奇詭異弹澎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)努咐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)苦蒿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人渗稍,你說(shuō)我怎么就攤上這事佩迟。” “怎么了竿屹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵报强,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拱燃,道長(zhǎng)秉溉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任碗誉,我火速辦了婚禮召嘶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哮缺。我一直安慰自己弄跌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布尝苇。 她就那樣靜靜地躺著铛只,像睡著了一般埠胖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上格仲,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天押袍,我揣著相機(jī)與錄音诵冒,去河邊找鬼凯肋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汽馋,可吹牛的內(nèi)容都是我干的侮东。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼豹芯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悄雅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起铁蹈,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宽闲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后握牧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體容诬,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年沿腰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了览徒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颂龙,死狀恐怖习蓬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情措嵌,我是刑警寧澤躲叼,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站企巢,受9級(jí)特大地震影響押赊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜包斑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一流礁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罗丰,春花似錦神帅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)元镀。三九已至,卻和暖如春霎桅,著一層夾襖步出監(jiān)牢的瞬間栖疑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工滔驶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遇革,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓揭糕,卻偏偏與公主長(zhǎng)得像萝快,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子著角,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1揪漩、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,988評(píng)論 3 119
  • 基于Vue的組件庫(kù) https://github.com/ElemeFE/element" element 餓了...
    _執(zhí)著執(zhí)著再執(zhí)著閱讀 32,731評(píng)論 4 230
  • 上班路上,穿梭在車(chē)流中吏口,望望車(chē)窗外奄容,天朗氣清,干凈整潔产徊。 這個(gè)小城昂勒,永遠(yuǎn)閑適靜謐,車(chē)輛適中囚痴。突然叁怪,側(cè)前方一個(gè)轎車(chē)?yán)?..
    銀子姐閱讀 297評(píng)論 0 2
  • 古人云:“讀萬(wàn)卷書(shū),行萬(wàn)里路深滚∞忍罚”哲人也說(shuō):“書(shū)籍是人類(lèi)進(jìn)步的階梯〕占觯”培養(yǎng)閱讀習(xí)慣血柳,當(dāng)你的孩子愛(ài)上閱讀,他將同時(shí)學(xué)會(huì)...
    伊呀學(xué)語(yǔ)閱讀 136評(píng)論 0 0
  • 今天由于自己沒(méi)有管住自己生兆,向自己的父親大聲呵斥难捌,說(shuō)完之后雖然心里痛快了,但總覺(jué)得有點(diǎn)難受鸦难。 對(duì)不起根吁,老爸。其實(shí)我想...
    尼誠(chéng)閱讀 360評(píng)論 0 0