最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕)

 更新時(shí)間:2017年08月24日 09:08:28   作者:碼農(nóng)技術(shù)宅  
本篇文章主要介紹了VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕),具有一定的參考價(jià)值,有興趣的可以了解一下

0x00 前言

VueJS 社區(qū)里面關(guān)于富文本編輯器的集成也不少了,但是之前小調(diào)研了一下,基本上就是 quill,medium-editor,因?yàn)橹坝?AngularJS 用過(guò) medium-editor,并且需要自定義某些按鈕,而且最好還是選中彈出式的,所以就決定用 medium-editor。

社區(qū)里面 star 較多的就是這個(gè)了:vue-medium-editor,但是打開(kāi)它官網(wǎng),看了看文檔,越看越別扭,來(lái)看看它用法:

<!-- index.html -->
<medium-editor :text='myText' :options='options' custom-tag='h2' v-on:edit='applyTextEdit'>

gosh,傳這么多參數(shù),我只想要一個(gè)簡(jiǎn)單的 editor 啊

打開(kāi)源碼一看,就 62 行,所以決定自己動(dòng)手來(lái)一個(gè)簡(jiǎn)單點(diǎn)的

0x01 最簡(jiǎn)版

最簡(jiǎn)版,其實(shí)就在 vue 組件中實(shí)例化一下 medium-editor 就可以了

<template>
 <div class="textEditor" @input="handleInput">
 </div>
</template>
<script>
/* eslint-disable no-new */
import MediumEditor from 'medium-editor'
export default {
 props: {
  value: String,
  options: {
   type: Object,
   default: () => ({})
  }
 },
 data () {
  return {
   editor: null // 用來(lái)存放 editor 
  }
 },
 watch: {
  // refer: https://github.com/FranzSkuffka/vue-medium-editor/blob/master/index.js
  value (newVal, oldVal) {
   if (newVal !== this.$el.innerHTML) { // 用 $el.innerHTML 來(lái)解決 v-html 的光標(biāo)跳到行首的問(wèn)題
    this.$el.innerHTML = newVal || ''
   }
  }
 },
 methods: {
  handleInput (e) {
   this.$emit('input', e.target.innerHTML)
  }
 },
 mounted () {
  // 處理初始值的情況
  this.$el.innerHTML = this.value
  // 這里當(dāng)然可以自定義 options 啦
  this.editor = new MediumEditor(this.$el, Object.assign({}, this.options))
  // medium-editor 的 api,監(jiān)聽(tīng)內(nèi)容改變化
  this.editor.subscribe('editableInput', this.handleInput)
 },
 beforeDestroy () {
  this.editor.unsubscribe('editableInput', this.handleInput)
  this.editor.destroy()
 }
}
</script>

完成~,是不是很簡(jiǎn)單~~哈哈,最簡(jiǎn)版是一個(gè) v-html 控制的,但是會(huì)有自動(dòng)跳轉(zhuǎn)到首行的問(wèn)題,所以這里是最終版,細(xì)節(jié)問(wèn)題看注釋啦

0x02 用法

咋用呢?很簡(jiǎn)單,在其他組件中這樣:

<text-editor v-model="vm.richText"></text-editor>

當(dāng)然 你首先得安裝 medium-editor的 js 和 css了

0x03 自定義 button

下面是我項(xiàng)目中用到的自定義 button 的相關(guān)代碼,是一個(gè) 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: <textarea> elements depend on the editableInput event to stay synchronized
   this.base.checkContentChanged()
  }
 })
}
export default {
 P1: pButtonCreator(pHash['p1']),
 P2: pButtonCreator(pHash['p2']),
 P3: pButtonCreator(pHash['p3']),
 P4: pButtonCreator(pHash['p4']),
 P5: pButtonCreator(pHash['p5']),
 P6: pButtonCreator(pHash['p6'])
}

簡(jiǎn)單來(lái)說(shuō)就是給選中的文字加一些 class (上面是 fs-xx 之類的),其中需要引一個(gè)鼠標(biāo)選中的庫(kù) 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 上

復(fù)制代碼 代碼如下:

this.editor = new MediumEditor(this.$el, Object.assign({}, editorOptions, this.options))

當(dāng)然上面實(shí)例化的步驟不一定要寫(xiě)到這個(gè)組件里面,配置 options 也可以從組件外傳入

0x04 細(xì)節(jié)和坑

1、這里用到了 v-model 的自定義實(shí)現(xiàn),詳見(jiàn)官方文檔:v-model

簡(jiǎn)單來(lái)說(shuō)呢就是 props: value ,和 this.$emit('input', model) 就可以實(shí)現(xiàn)在組件中模擬 v-model 啦

2、多個(gè) editor 使用的自定義button 實(shí)例的問(wèn)題。由于我自己應(yīng)用的時(shí)候有兩個(gè)挨著的 <text-editor>,用的上面的代碼會(huì)導(dǎo)致兩個(gè) editor 實(shí)例用的是同一個(gè) button 實(shí)例,這會(huì)導(dǎo)致一個(gè)很?chē)?yán)重的問(wèn)題:即編輯下面編輯器的內(nèi)容,可能會(huì)修改的上面的編輯器!!

要解決這個(gè)也很簡(jiǎn)單,修改這一行:

復(fù)制代碼 代碼如下:

this.editor = new MediumEditor(this.$el, Object.assign({}, _.cloneDeep(editorOptions), this.options))

將自定義的 options 深復(fù)制一下,這里借助了 lodash 的函數(shù)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue.js實(shí)現(xiàn)條件渲染的實(shí)例代碼

    vue.js實(shí)現(xiàn)條件渲染的實(shí)例代碼

    這篇文章主要介紹了vue.js實(shí)現(xiàn)條件渲染的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • vue render函數(shù)動(dòng)態(tài)加載img的src路徑操作

    vue render函數(shù)動(dòng)態(tài)加載img的src路徑操作

    這篇文章主要介紹了vue render函數(shù)動(dòng)態(tài)加載img的src路徑操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • elementui[el-table]toggleRowSelection默認(rèn)多選事件無(wú)法選中問(wèn)題

    elementui[el-table]toggleRowSelection默認(rèn)多選事件無(wú)法選中問(wèn)題

    這篇文章主要介紹了elementui[el-table]toggleRowSelection默認(rèn)多選事件無(wú)法選中問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue3全局屬性app.config.globalProperties的實(shí)現(xiàn)

    Vue3全局屬性app.config.globalProperties的實(shí)現(xiàn)

    Vue3中的app.config.globalProperties是一個(gè)強(qiáng)大的全局配置功能,允許我們?cè)趹?yīng)用級(jí)別設(shè)置和訪問(wèn)屬性,本文主要介紹了Vue3全局屬性app.config.globalProperties的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • vue實(shí)現(xiàn)購(gòu)物車(chē)列表

    vue實(shí)現(xiàn)購(gòu)物車(chē)列表

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)購(gòu)物車(chē)列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 拿來(lái)就用vue-gird-layout組件封裝示例

    拿來(lái)就用vue-gird-layout組件封裝示例

    這篇文章主要介紹了vue-gird-layout組件封裝示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • vue?el-table實(shí)現(xiàn)動(dòng)態(tài)添加行和列具體代碼

    vue?el-table實(shí)現(xiàn)動(dòng)態(tài)添加行和列具體代碼

    最近遇到一個(gè)動(dòng)態(tài)增加行和列的需求,所以這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于vue?el-table實(shí)現(xiàn)動(dòng)態(tài)添加行和列的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Vue路由跳轉(zhuǎn)的5種方式及擴(kuò)展

    Vue路由跳轉(zhuǎn)的5種方式及擴(kuò)展

    這篇文章主要給大家介紹了關(guān)于Vue路由跳轉(zhuǎn)的5種方式及擴(kuò)展,在Vue中路由是一種用于導(dǎo)航和管理頁(yè)面之間跳轉(zhuǎn)的機(jī)制,Vue Router是Vue官方提供的路由管理器,需要的朋友可以參考下
    2023-11-11
  • vue調(diào)用原生方法交互解讀

    vue調(diào)用原生方法交互解讀

    這篇文章主要介紹了vue調(diào)用原生方法交互,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 前端報(bào)錯(cuò)npm ERR! cb() never called!問(wèn)題解決辦法

    前端報(bào)錯(cuò)npm ERR! cb() never called!問(wèn)題解決辦法

    最近接手了一個(gè)前臺(tái)項(xiàng)目,執(zhí)行npm install的時(shí)候一直報(bào)錯(cuò),所以這里就給大家總結(jié)下,這篇文章主要給給大家介紹了關(guān)于前端報(bào)錯(cuò)npm?ERR! cb() never called!問(wèn)題的解決辦法,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

潢川县| 工布江达县| 雅江县| 海盐县| 保山市| 萝北县| 翁源县| 定远县| 海南省| 富宁县| 凤阳县| 韩城市| 岳池县| 深泽县| 琼海市| 深水埗区| 旬邑县| 德惠市| 河曲县| 东阿县| 鹰潭市| 山阴县| 寿阳县| 武邑县| 彩票| 邵阳县| 五大连池市| 平阴县| 富源县| 昌平区| 米易县| 昂仁县| 保靖县| 赫章县| 福州市| 百色市| 宁陵县| 阿巴嘎旗| 灵台县| 府谷县| 华宁县|