vue-quill-editor 使用記

安裝

npm install vue-quill-editor --save

引入

全局引用
// main.js
import VueQuillEditor from 'vue-quill-editor'
// require styles
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
Vue.use(VueQuillEditor)

封裝組件

import Cookies from 'vue-cookies'  // cookies用于存放token
import apis from '../http/apis/common/index' // 引入存放上傳圖片接口的路徑

let base = process.env.VUE_APP_BASE_URL + process.env.VUE_APP_MAPPING // 域名
let url = base + apis.upload.url  // 上傳圖片接口
/* 富文本編輯圖片上傳配置 */
const uploadConfig = {
  action: url, // 必填參數(shù) 圖片上傳地址
  methods: 'POST', // 必填參數(shù) 圖片上傳方式
  token: Cookies.get('token'), // 可選參數(shù) 如果需要token驗(yàn)證荧琼,假設(shè)你的token有存放在sessionStorage
  name: 'file', // 必填參數(shù) 文件的參數(shù)名
  size: 500, // 可選參數(shù)   圖片大小,單位為Kb, 1M = 1024Kb
  accept: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon' // 可選 可上傳的圖片格式
}

// toolbar工具欄的工具選項(xiàng)(默認(rèn)展示全部)
const toolOptions = [
  ['bold', 'italic', 'underline', 'strike'],
  ['blockquote', 'code-block'],
  [{ 'header': 1 }, { 'header': 2 }],
  [{ 'list': 'ordered' }, { 'list': 'bullet' }],
  [{ 'script': 'sub' }, { 'script': 'super' }],
  [{ 'indent': '-1' }, { 'indent': '+1' }],
  [{ 'direction': 'rtl' }],
  // [{ 'size': ['small', false, 'large', 'huge'] }],
  // [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
  [{ 'color': [] }, { 'background': [] }],
  // [{ 'font': [] }],
  [{ 'align': [] }],
  ['clean'],
  ['link', 'image', 'video'],
// 自己添加編輯源碼方法
  ['sourceEditor']
  // ['image']
]
const handlers = {
  shadeBox: null,
  // 添加編輯源碼方法
  sourceEditor: function() {
    const container = this.container;
    const firstChild = container.nextElementSibling.firstChild;

    // 在第一次點(diǎn)擊源碼編輯的時(shí)候懊悯,會(huì)在整個(gè)工具條上加一個(gè)div,層級(jí)比工具條高,再次點(diǎn)擊工具條任意位置沮翔,就會(huì)退出源碼編輯焰望∩б冢可以在下面cssText里面加個(gè)背景顏色看看效果。

    if (!this.shadeBox) {
      let shadeBox = this.shadeBox = document.createElement('div')

      shadeBox.style.cssText = 'position:absolute; top:0; left:0; width:100%; height:100%; cursor:pointer;'
      container.style.position = 'relative'
      container.appendChild(shadeBox)
      firstChild.innerText = firstChild.innerHTML

      shadeBox.addEventListener('click', function() {
        this.style.display = 'none'
        firstChild.innerHTML = firstChild.innerText.trim()
      }, false)
    } else {
      this.shadeBox.style.display = 'block'
      firstChild.innerText = firstChild.innerHTML
    }
  },
  image: function image() {
    var self = this
    var fileInput = this.container.querySelector('input.ql-image[type=file]')
    if (fileInput === null) {
      fileInput = document.createElement('input')
      fileInput.setAttribute('type', 'file')
      // 設(shè)置圖片參數(shù)名
      if (uploadConfig.name) {
        fileInput.setAttribute('name', uploadConfig.name)
      }
      // 可設(shè)置上傳圖片的格式
      fileInput.setAttribute('accept', uploadConfig.accept)
      fileInput.classList.add('ql-image')
      // 監(jiān)聽選擇文件
      fileInput.addEventListener('change', function() {
        // 創(chuàng)建formData
        var formData = new FormData()
        formData.append(uploadConfig.name, fileInput.files[0])
        formData.append('object', 'product')
        // 如果需要token且存在token
        if (uploadConfig.token) {
          formData.append('token', uploadConfig.token)
        }
        // 圖片上傳
        var xhr = new XMLHttpRequest()
        xhr.open(uploadConfig.methods, uploadConfig.action, true)
        // 上傳數(shù)據(jù)成功熊赖,會(huì)觸發(fā)
        xhr.onload = function(e) {
          if (xhr.status === 200) {
            var res = JSON.parse(xhr.responseText)
            let length = self.quill.getSelection(true).index
            // 這里很重要来屠,你圖片上傳成功后,img的src需要在這里添加,res.data.path就是你服務(wù)器返回的圖片鏈接俱笛。
            self.quill.insertEmbed(length, 'image', res.data.path)
            self.quill.setSelection(length + 1)
          }
          fileInput.value = ''
        }
        // 開始上傳數(shù)據(jù)
        xhr.upload.onloadstart = function(e) {
          fileInput.value = ''
        }
        // 當(dāng)發(fā)生網(wǎng)絡(luò)異常的時(shí)候會(huì)觸發(fā)捆姜,如果上傳數(shù)據(jù)的過程還未結(jié)束
        xhr.upload.onerror = function(e) {
        }
        // 上傳數(shù)據(jù)完成(成功或者失敗)時(shí)會(huì)觸發(fā)
        xhr.upload.onloadend = function(e) {
          // console.log('上傳結(jié)束')
        }
        xhr.send(formData)
      })
      this.container.appendChild(fileInput)
    }
    fileInput.click()
  }
}

export default {
  placeholder: '請(qǐng)輸入內(nèi)容',
  theme: 'snow', // 主題
  modules: {
    toolbar: {
      container: toolOptions, // 工具欄選項(xiàng)
      handlers: handlers // 事件重寫
    }
  }
}

使用組件

<template>
 <div>
   <quill-editor class="quill-editor" v-model="editorInfo" :options="option">
   </quill-editor>
 </div>
</template>
<script>
// script
import quillConfig from '@/utils/quill-config'
data(){
  return {
    option:quillConfig,
  }
}
// 根據(jù)后端需求要求轉(zhuǎn)換editor 
// 傳參時(shí):encodeURI(editorInfo)
// 接受參數(shù)時(shí):decodeURI(res.data.editorInfo)
</script>
<style lang="scss">
// editor 源碼編輯按鈕
.ql-sourceEditor {
  background: url("https://i.loli.net/2021/03/25/MC5puJHoaxjTbBz.jpg") no-repeat !important;
  background-size: contain !important;
  width: 18px !important;
  height: 18px !important;
}
</style>

局部使用

<template>
    <div>
        <quill-editor ref="myTextEditor" v-model="editorInfo" :options="editorOption" style="height:500px;"></quill-editor>
    </div>
</template>
<script>
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import { quillEditor } from 'vue-quill-editor'

export default {
    data(){
        return{
            editorInfo: '',
            editorOption: {
               placeholder: '編輯文章內(nèi)容'
             }
        }
    },
    components: {
        quillEditor
    },
    methods:{
        onEditorChange({ editor, html, text }) {
            this.editorInfo= html
        }
    }
}
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迎膜,一起剝皮案震驚了整個(gè)濱河市泥技,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磕仅,老刑警劉巖零抬,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宽涌,居然都是意外死亡平夜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門卸亮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忽妒,“玉大人,你說我怎么就攤上這事兼贸《沃保” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵溶诞,是天一觀的道長鸯檬。 經(jīng)常有香客問我,道長螺垢,這世上最難降的妖魔是什么喧务? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮枉圃,結(jié)果婚禮上功茴,老公的妹妹穿的比我還像新娘。我一直安慰自己孽亲,他們只是感情好坎穿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著返劲,像睡著了一般玲昧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上篮绿,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天孵延,我揣著相機(jī)與錄音,去河邊找鬼搔耕。 笑死隙袁,一個(gè)胖子當(dāng)著我的面吹牛痰娱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播菩收,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼梨睁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娜饵?” 一聲冷哼從身側(cè)響起坡贺,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箱舞,沒想到半個(gè)月后遍坟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晴股,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年愿伴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片电湘。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隔节,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寂呛,到底是詐尸還是另有隱情怎诫,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布贷痪,位于F島的核電站幻妓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏劫拢。R本人自食惡果不足惜肉津,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尚镰。 院中可真熱鬧阀圾,春花似錦、人聲如沸狗唉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽分俯。三九已至,卻和暖如春哆料,著一層夾襖步出監(jiān)牢的瞬間缸剪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工东亦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杏节,地道東北人唬渗。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像奋渔,于是被迫代替她去往敵國和親镊逝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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