当前位置:   article > 正文

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

quilleditor image 自适应div

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 }], // 12 级标题
  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>

组件的使用方法:

<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. },

转载于:https://www.cnblogs.com/TimerHotel/p/vue_07.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/883895
推荐阅读
相关标签
  

闽ICP备14008679号