Vue-Quill-Editor图片插入自定义

前言:

因为在项目中前端采用了Vue来实现,正好用到了富文本编辑器这一块,于是,经过技术上的选择,决定使用Vue-Quill-Editor。

使用的过程相对简单,但是图片插入时,保留的是base64二进制形式,会导致数据库字段太长,存储不易。

所以再三斟酌,决定使用Element-UI的Upload插件来进行图片的上传。

代码:

  1. <template>
  2. <div class="bg">
  3. <!-- 图片上传组件辅助-->
  4. <el-upload
  5. class="avatar-uploader"
  6. :action="serverUrl"
  7. :headers="header"
  8. :show-file-list="false"
  9. :on-success="uploadSuccess"
  10. :on-error="uploadError"
  11. :before-upload="beforeUpload">
  12. </el-upload>
  13. <quill-editor
  14. class="editor"
  15. v-model="content"
  16. ref="myQuillEditor"
  17. :options="editorOption"
  18. @blur="onEditorBlur($event)" @focus="onEditorFocus($event)"
  19. @change="onEditorChange($event)">
  20. </quill-editor>
  21. </div>
  22. </template>
  23. <script>
  24. // 工具栏配置
  25. const toolbarOptions = [
  26. ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
  27. ["blockquote", "code-block"], // 引用 代码块
  28. [{ header: 1 }, { header: 2 }], // 1、2 级标题
  29. [{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
  30. [{ script: "sub" }, { script: "super" }], // 上标/下标
  31. [{ indent: "-1" }, { indent: "+1" }], // 缩进
  32. // [{'direction': 'rtl'}], // 文本方向
  33. [{ size: ["small", false, "large", "huge"] }], // 字体大小
  34. [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
  35. [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
  36. [{ font: [] }], // 字体种类
  37. [{ align: [] }], // 对齐方式
  38. ["clean"], // 清除文本格式
  39. ["link", "image", "video"] // 链接、图片、视频
  40. ];
  41. import {quillEditor,Quill} from "vue-quill-editor";
  42. import "quill/dist/quill.core.css";
  43. import "quill/dist/quill.snow.css";
  44. import "quill/dist/quill.bubble.css";
  45. import {ImageResize} from 'quill-image-resize-module';
  46. Quill.register('modules/imageResize', ImageResize)
  47. export default {
  48. props: {
  49. /*编辑器的内容*/
  50. value: {
  51. type: String
  52. },
  53. /*图片大小*/
  54. maxSize: {
  55. type: Number,
  56. default: 4000 //kb
  57. },
  58. imagesValue:{
  59. type:String,
  60. default:null
  61. }
  62. },
  63. components: {
  64. quillEditor,
  65. Quill,
  66. ImageResize,
  67. },
  68. data() {
  69. return {
  70. content: this.value,
  71. quillUpdateImg: false, // 根据图片上传状态来确定是否显示loading动画,刚开始是false,不显示
  72. editorOption: {
  73. //placeholder: "",
  74. theme: "snow", // or 'bubble'
  75. placeholder: "您想说点什么?",
  76. modules: {
  77. toolbar: {
  78. container: toolbarOptions,
  79. // container: "#toolbar",
  80. handlers: {
  81. image: function(value) {
  82. if (value) {
  83. // 触发input框选择图片文件
  84. document.querySelector(".avatar-uploader input").click();
  85. } else {
  86. this.quill.format("image", false);
  87. }
  88. },
  89. // link: function(value) {
  90. // if (value) {
  91. // var href = prompt('请输入url');
  92. // this.quill.format("link", href);
  93. // } else {
  94. // this.quill.format("link", false);
  95. // }
  96. // },
  97. }
  98. },
  99. imageResize:{
  100. }
  101. },
  102. },
  103. serverUrl: "/api/upload/news", // 这里写你要上传的图片服务器地址
  104. imageUrl:'',
  105. images:null,
  106. header: {
  107. token: sessionStorage.token
  108. } // 有的图片服务器要求请求头需要有token
  109. };
  110. },
  111. methods: {
  112. onEditorBlur() {
  113. //失去焦点事件
  114. },
  115. onEditorFocus() {
  116. //获得焦点事件
  117. },
  118. onEditorChange() {
  119. //内容改变事件
  120. this.$emit("input", this.content,this.images);
  121. },
  122. // 富文本图片上传前
  123. beforeUpload(file) {
  124. console.log("1."+file)
  125. this.quillUpdateImg = true;
  126. },
  127. uploadSuccess(res, file) {
  128. console.log("2."+file)
  129. this.imageUrl = file.response
  130. this.images = (this.images==null?"":(this.images+"#")) + this.imageUrl
  131. // res为图片服务器返回的数据
  132. // 获取富文本组件实例
  133. let quill = this.$refs.myQuillEditor.quill;
  134. let length = quill.getSelection().index;
  135. // 插入图片 res.url为服务器返回的图片地址
  136. quill.insertEmbed(length, "image", this.imageUrl);
  137. // 调整光标到最后
  138. quill.setSelection(length + 1);
  139. // loading动画消失
  140. this.quillUpdateImg = false;
  141. },
  142. // 富文本图片上传失败
  143. uploadError() {
  144. // loading动画消失
  145. this.quillUpdateImg = false;
  146. this.$message.error("图片上传失败");
  147. }
  148. },
  149. created() {
  150. this.content=this.value
  151. this.images=this.imagesValue
  152. }
  153. };
  154. </script>
  155. <style>
  156. .bg {
  157. width: 100%;
  158. margin: 0 auto;
  159. }
  160. .editor {
  161. line-height: normal !important;
  162. height: 750px;
  163. }
  164. .ql-snow .ql-tooltip[data-mode=link]::before {
  165. content: "请输入链接地址:";
  166. }
  167. .ql-snow .ql-tooltip.ql-editing a.ql-action::after {
  168. border-right: 0px;
  169. content: '保存';
  170. padding-right: 0px;
  171. }
  172. .ql-snow .ql-tooltip[data-mode=video]::before {
  173. content: "请输入视频地址:";
  174. }
  175. .ql-snow .ql-picker.ql-size .ql-picker-label::before,
  176. .ql-snow .ql-picker.ql-size .ql-picker-item::before {
  177. content: '14px';
  178. }
  179. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,
  180. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
  181. content: '10px';
  182. }
  183. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,
  184. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
  185. content: '18px';
  186. }
  187. .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
  188. .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
  189. content: '32px';
  190. }
  191. .ql-snow .ql-picker.ql-header .ql-picker-label::before,
  192. .ql-snow .ql-picker.ql-header .ql-picker-item::before {
  193. content: '文本';
  194. }
  195. .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
  196. .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
  197. content: '标题1';
  198. }
  199. .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
  200. .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
  201. content: '标题2';
  202. }
  203. .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
  204. .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
  205. content: '标题3';
  206. }
  207. .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
  208. .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
  209. content: '标题4';
  210. }
  211. .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
  212. .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
  213. content: '标题5';
  214. }
  215. .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
  216. .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
  217. content: '标题6';
  218. }
  219. .ql-snow .ql-picker.ql-font .ql-picker-label::before,
  220. .ql-snow .ql-picker.ql-font .ql-picker-item::before {
  221. content: '标准字体';
  222. }
  223. .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
  224. .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
  225. content: '衬线字体';
  226. }
  227. .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
  228. .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
  229. content: '等宽字体';
  230. }
  231. </style>

组件的使用方法:

  1. <Editor v-if="step==2" @input="chTwo" :value="news.context" :imagesValue="news.images"/>

上传图片到服务器后回返图片路径,

核心代码:

  1. uploadSuccess(res, file) {
  2. console.log("2."+file)
  3. this.imageUrl = file.response
  4. this.images = (this.images==null?"":(this.images+"#")) + this.imageUrl
  5. // res为图片服务器返回的数据
  6. // 获取富文本组件实例
  7. let quill = this.$refs.myQuillEditor.quill;
  8. let length = quill.getSelection().index;
  9. // 插入图片 res.url为服务器返回的图片地址
  10. quill.insertEmbed(length, "image", this.imageUrl);
  11. // 调整光标到最后
  12. quill.setSelection(length + 1);
  13. // loading动画消失
  14. this.quillUpdateImg = false;
  15. },

7.Vue-Quill-Editor图片插入自定义的更多相关文章

  1. vue quill editor输入文字出现首字母的问题

    当使用vue quill editor输入中文时,第一个中文的汉语拼音第一个字母会显示如图. 解决的办法就是升级vue quill editor js文件的版本,目前的我升级之后ok的版本是 < ...

  2. 百度ueditor vue项目应用 -- 图片上传源码修改

    本文目的有两个,一.废掉单图上传,二.改造多图上传 大家都知道百度ueditor不是针对vue项目开发的,官方文档提供的源码包里有需要后端配置的接口,but到vue项目就不太好办了,网上有些文章也介绍 ...

  3. 基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作

    在很多场合,我们需要在线编辑HTML内容,然后在页面上或者其他终端上(如小程序.APP应用等)显示,编辑HTML内容的插件有很多,本篇介绍基于Bootstrap的 summernote插件实现HTML ...

  4. ueditor插入自定义内容和样式

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点   通过UEditor提供的API接口可以很方便的读写操作内容并设置编辑器里的样式   页 ...

  5. iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

    一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...

  6. GridView控件中插入自定义删除按钮并弹出确认框

    GridView控件中插入自定义删除按钮,要实现这个功能其实有多种方法,这里先记下我使用的方法,以后再添加其他方法. 一.实现步骤 1.在GridView中添加模板列(TemplateField). ...

  7. Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)

    Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...

  8. 使用Emacs中的org-mode写cnblogs之图片插入

    .title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium ...

  9. LaTeX的图片插入及排版

    LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. UNIX下的各种应用软件都 ...

随机推荐

  1. django(7)modelform操作及验证、ajax操作普通表单数据提交、文件上传、富文本框基本使用

    一.modelForm操作及验证 1.获取数据库数据,界面展示数据并且获取前端提交的数据,并动态显示select框中的数据 views.py from django.shortcuts import ...

  2. tomcat和应用集成

    将tomcat作为应用的一部分集成到应用中,使得应用可以直接开启http服务,对外提供接口.此时应用程序不必再遵守j2ee中的文件目录格式要求. 此种方式改变了以往先部署tomcat容器,再按照j2e ...

  3. git获取别人远程dev分支上的代码

    我们在使用 git clone  xxx.git 下载代码的时候,获取到的只是 master上的代码 假入有个 dev 分支我们想获取上面的代码怎么办! #下载dev分支上的代码并切换到dev分支 g ...

  4. Array、ArrayList和List三者的区别

    数组 class TestArraysClass { static void Main() { // Declare a single-dimensional array ]; // Declare ...

  5. spring cloud Eureka 服务注册发现与调用

    记录一下用spring cloud Eureka搭建服务注册与发现框架的过程. 为了创建spring项目方便,使用了STS. 一.Eureka注册中心 1.新建项目-Spring Starter Pr ...

  6. myeclipse更改类或者是配置文件不用重启tomcat的方法

    一.修改java代码(如action)无需重启与部署方法 方法1:在WebRoot下的META-INF文件夹中新建一个名为context.xml文件,里面添加如下内容(要区分大小写): <Con ...

  7. Scrapy框架之日志等级和请求传参

    一.Scrapy的日志等级 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. 1.日志等级(信息种类) ERROR:错误 WARN ...

  8. JavaScirpt(JS)的this细究

    一.js中function的不同形态 js中类和函数都要通过function关键字来构建. 1.js中当函数名大写时,一般是当作类来处理 function Foo(name, age) { this. ...

  9. ArcGisJS实现地图常用工具条、距离测量和面积测量(非官方实例)

    常用地图工具包括:平移.拉框缩小.拉框放大.全图.距离测量.面积测量.清除标记,距离测量.面积测量没有使用官方自带的组件代码. 1.距离测量 2.面积测量 3.源代码 <!DOCTYPE htm ...

  10. yanxin8文章归档

    文章归档 - 2015年四月 (共21篇文章) 26日: 14443协议的CRC_A和CRC_B (0条评论) 25日: 百度钱包-1分钱5元话费 (0条评论) 22日: 驾照考试总结 (0条评论) ...