7.Vue-Quill-Editor圖片插入自定義
阿新 • • 發佈:2018-11-26
Vue-Quill-Editor圖片插入自定義
前言:
因為在專案中前端採用了Vue來實現,正好用到了富文字編輯器這一塊,於是,經過技術上的選擇,決定使用Vue-Quill-Editor。
使用的過程相對簡單,但是圖片插入時,保留的是base64二進位制形式,會導致資料庫欄位太長,儲存不易。
所以再三斟酌,決定使用Element-UI的Upload外掛來進行圖片的上傳。
程式碼:
<template> <div class="bg"> <!-- 圖片上傳元件輔助--> <el-upload class="avatar-uploader" :action="serverUrl" :headers="header" :show-file-list="false" :on-success="uploadSuccess" :on-error="uploadError" :before-upload="beforeUpload"> </el-upload> <quill-editor class="editor" v-model="content" ref="myQuillEditor" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @change="onEditorChange($event)"> </quill-editor> </div> </template> <script> // 工具欄配置 const toolbarOptions = [ ["bold", "italic", "underline", "strike"], // 加粗 斜體 下劃線 刪除線 ["blockquote", "code-block"], // 引用 程式碼塊 [{ header: 1 }, { header: 2 }], // 1、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"] // 連結、圖片、視訊 ]; import {quillEditor,Quill} from "vue-quill-editor"; import "quill/dist/quill.core.css"; import "quill/dist/quill.snow.css"; import "quill/dist/quill.bubble.css"; import {ImageResize} from 'quill-image-resize-module'; Quill.register('modules/imageResize', ImageResize) export default { props: { /*編輯器的內容*/ value: { type: String }, /*圖片大小*/ maxSize: { type: Number, default: 4000 //kb }, imagesValue:{ type:String, default:null } }, components: { quillEditor, Quill, ImageResize, }, data() { return { content: this.value, quillUpdateImg: false, // 根據圖片上傳狀態來確定是否顯示loading動畫,剛開始是false,不顯示 editorOption: { //placeholder: "", theme: "snow", // or 'bubble' placeholder: "您想說點什麼?", modules: { toolbar: { container: toolbarOptions, // container: "#toolbar", handlers: { image: function(value) { if (value) { // 觸發input框選擇圖片檔案 document.querySelector(".avatar-uploader input").click(); } else { this.quill.format("image", false); } }, // link: function(value) { // if (value) { // var href = prompt('請輸入url'); // this.quill.format("link", href); // } else { // this.quill.format("link", false); // } // }, } }, imageResize:{ } }, }, serverUrl: "/api/upload/news", // 這裡寫你要上傳的圖片伺服器地址 imageUrl:'', images:null, header: { token: sessionStorage.token } // 有的圖片伺服器要求請求頭需要有token }; }, methods: { onEditorBlur() { //失去焦點事件 }, onEditorFocus() { //獲得焦點事件 }, onEditorChange() { //內容改變事件 this.$emit("input", this.content,this.images); }, // 富文字圖片上傳前 beforeUpload(file) { console.log("1."+file) this.quillUpdateImg = true; }, uploadSuccess(res, file) { console.log("2."+file) this.imageUrl = file.response this.images = (this.images==null?"":(this.images+"#")) + this.imageUrl // res為圖片伺服器返回的資料 // 獲取富文字元件例項 let quill = this.$refs.myQuillEditor.quill; let length = quill.getSelection().index; // 插入圖片 res.url為伺服器返回的圖片地址 quill.insertEmbed(length, "image", this.imageUrl); // 調整游標到最後 quill.setSelection(length + 1); // loading動畫消失 this.quillUpdateImg = false; }, // 富文字圖片上傳失敗 uploadError() { // loading動畫消失 this.quillUpdateImg = false; this.$message.error("圖片上傳失敗"); } }, created() { this.content=this.value this.images=this.imagesValue } }; </script> <style> .bg { width: 100%; margin: 0 auto; } .editor { line-height: normal !important; height: 750px; } .ql-snow .ql-tooltip[data-mode=link]::before { content: "請輸入連結地址:"; } .ql-snow .ql-tooltip.ql-editing a.ql-action::after { border-right: 0px; content: '儲存'; padding-right: 0px; } .ql-snow .ql-tooltip[data-mode=video]::before { content: "請輸入視訊地址:"; } .ql-snow .ql-picker.ql-size .ql-picker-label::before, .ql-snow .ql-picker.ql-size .ql-picker-item::before { content: '14px'; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { content: '10px'; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { content: '18px'; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { content: '32px'; } .ql-snow .ql-picker.ql-header .ql-picker-label::before, .ql-snow .ql-picker.ql-header .ql-picker-item::before { content: '文字'; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { content: '標題1'; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { content: '標題2'; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { content: '標題3'; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { content: '標題4'; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { content: '標題5'; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { content: '標題6'; } .ql-snow .ql-picker.ql-font .ql-picker-label::before, .ql-snow .ql-picker.ql-font .ql-picker-item::before { content: '標準字型'; } .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { content: '襯線字型'; } .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { content: '等寬字型'; } </style>
元件的使用方法:
<Editor v-if="step==2" @input="chTwo" :value="news.context" :imagesValue="news.images"/>
上傳圖片到伺服器後回返圖片路徑,
核心程式碼:
uploadSuccess(res, file) { console.log("2."+file) this.imageUrl = file.response this.images = (this.images==null?"":(this.images+"#")) + this.imageUrl // res為圖片伺服器返回的資料 // 獲取富文字元件例項 let quill = this.$refs.myQuillEditor.quill; let length = quill.getSelection().index; // 插入圖片 res.url為伺服器返回的圖片地址 quill.insertEmbed(length, "image", this.imageUrl); // 調整游標到最後 quill.setSelection(length + 1); // loading動畫消失 this.quillUpdateImg = false; },