1. 程式人生 > >vue-quill-editor自定義圖片上傳

vue-quill-editor自定義圖片上傳

我們通常都會使用富文字編輯器在後臺編輯內容,開發vue當然也少不了,我們通過vue官網的連結可以找到一些資源,或者去github上查詢一些開源的編輯器。

我使用的是vue-quill-editor,它的介面很簡潔,功能也滿足平時的編輯需要,不過於臃腫,但是它預設的圖片上傳是使用Data URL方式儲存到了內容裡,這不是我想要的,我相信大部分人也不想這樣去儲存圖片,還好quill提供瞭如何去自定義按鈕事件的demo(03-example.vue),那麼我們就可以自己去實現圖片的儲存方式了。

這裡我用的是iview 的上傳元件,上傳成功後獲得圖片的地址,在編輯器中顯示

先下載vue-quill-editor 然後下面是主要程式碼

<template>
	<div>

		<quill-editor  ref="myQuillEditor"
		    @change="onEditorChange($event)">
		</quill-editor>		
		<Upload :show-upload-list="false"
			style="display: none;"

ref="up"

name="upfile" :format="accept" :max-size="maxsize" multiple type="drag" :on-exceeded-size="handleMaxSize" :on-success="handleSuccess" :action="imgUrl" > <input :id="refid" /> </Upload> </div> </template> <script> import { quillEditor } from 'vue-quill-editor' import $ from 'jquery' export default { name:'quill', components: { quillEditor }, data() { return { visible: false, src: '', uploadList: [] } }, props:{ imgUrl:{ type:String, }, accept:{ type:Array }, maxsize:{ type:Number }, refid:{ type:String } }, computed: { editor() { return this.$refs.myQuillEditor.quill }, }, mounted() { this.uploadList = this.$refs.up.fileList; this.$refs.myQuillEditor.quill.getModule('toolbar').addHandler('image', this.imgClick) this.$refs.myQuillEditor.quill.getModule('toolbar').addHandler('video', this.imgClick) }, methods: { //點選圖片觸發事件 imgClick() { var up=this.refid; console.log("up===",up) $('#'+this.refid).click() }, //檢視圖片 handleView(name) { this.src = 'http://' + name; this.visible = true; }, //刪除圖片 handleRemove(file) { // 從 upload 例項刪除資料 const fileList = this.$refs.up.fileList; this.$refs.up.fileList.splice(fileList.indexOf(file), 1); }, //成功回撥 handleSuccess(response, file, fileList) { console.log("返回圖片") if(response.code == 500) { this.$Message.error('上傳失敗!') } else { this.$Message.success('上傳成功!') //把圖片插入指定的位置 this.editor.insertEmbed(this.editor.getSelection().index, 'image', 'http://'+response.data.picName) } console.log(response) console.log(fileList) console.log(file) }, //檔案太大,錯誤提示 handleMaxSize (file) { this.$Notice.warning({ title: 'Exceeding file size limit', desc: 'File ' + file.name + ' is too large, no more than 100M.' }); console.log('File ' + file.name + ' is too large, no more than 100M.'); }, onEditorChange({editor,html,text}) { this.$emit('quilCon',html) } } }; </script> <style> .info { border-radius: 10px; line-height: 20px; padding: 10px; margin: 10px; background-color: #ffffff; } </style> <style scoped> .demo-upload-list { display: inline-block; width: 60px; height: 60px; text-align: center; line-height: 60px; border: 1px solid transparent; border-radius: 4px; overflow: hidden; background: #fff; position: relative; box-shadow: 0 1px 1px rgba(0, 0, 0, .2); margin-right: 4px; } .demo-upload-list img { width: 100%; height: 100%; } .demo-upload-list:hover .demo-upload-list-cover { display: block; } .demo-upload-list-cover { color: #fff; font-size: 16px; display: none; position: absolute; top: 0; bottom: 0; left: 0; right: 0; background: rgba(0, 0, 0, .6); } </style>