• vue-quill-editor富文本编辑器的使用


    富文本编辑器  封装组件可用于信息、新闻编辑、商品内容编辑等等。常用的文本编辑、文字样式段落、对齐、大小、上传图片、标题等基础模板。

    还要在基础模块之上进行一些扩展如 上传图片修改成url格式(默认base64 不便于存储传输)

    参考的一些文章:

    vue-quill-editor富文本编辑器使用方法,最全,含部分源码解读,含图片上传,如果页面有多个富文本,图片上传解决方案_cplvfx的博客-CSDN博客_quill修改源码vue-quill-editor富文本编辑器使用方法,最全,含部分源码解读,含图片上传,如果页面有多个富文本,图片上传解决方案https://blog.csdn.net/cplvfx/article/details/125557966?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166815875216782388063005%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166815875216782388063005&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-125557966-null-null.nonecase&utm_term=quill&spm=1018.2226.3001.4450入基础版

    安装:

    npm install vue-quill-editor

    npm install quill

    全局引入:main.js

    1. import VueQuillEditor from 'vue-quill-editor'
    2. import 'quill/dist/quill.core.css'
    3. import 'quill/dist/quill.snow.css'
    4. import 'quill/dist/quill.bubble.css'
    5. Vue.use(VueQuillEditor);

    按需某个组件引入:

    1. import { quillEditor } from 'vue-quill-editor'
    2. import 'quill/dist/quill.core.css'
    3. import 'quill/dist/quill.snow.css'
    4. import 'quill/dist/quill.bubble.css'
    5. export default {
    6. components: {
    7. quillEditor
    8. }
    9. }

    模板中使用:

    后面事件用的不多 需要的话在 methods配置回调即可

    1. <template>
    2. <quill-editor
    3. v-model="content" 双向绑定的数据
    4. ref="myQuillEditor" ref标识
    5. :options="editorOption" 配置项
    6. @blur="onEditorBlur($event)" 失去焦点事件 可传入 quill 实例
    7. @focus="onEditorFocus($event)" 获得焦点事件 可传入 quill 实例
    8. @change="onEditorChange($event)" 值发生改变事件 可传入 quill 实例
    9. @ready="onEditorReady($event)"> 加载完成事件 可传入 quill 实例
    10. quill-editor>
    11. template>

    绑定数据和配置项

    鼠标悬浮在图表上有 中文提示

    实现本质就是为元素添加上titile 属性

    先定义数据 Chiice 就是类名  title就是要添加的title

    在组件渲染到页面上时开始循环 查找Chiice 找到了就设置 title 

    1. const titleConfig = [
    2. { Choice: '.ql-insertMetric', title: '跳转配置' },
    3. { Choice: '.ql-bold', title: '加粗' },
    4. { Choice: '.ql-italic', title: '斜体' },
    5. { Choice: '.ql-underline', title: '下划线' },
    6. { Choice: '.ql-header', title: '段落格式' },
    7. { Choice: '.ql-strike', title: '删除线' },
    8. { Choice: '.ql-blockquote', title: '块引用' },
    9. { Choice: '.ql-code', title: '插入代码' },
    10. { Choice: '.ql-code-block', title: '插入代码段' },
    11. { Choice: '.ql-font', title: '字体' },
    12. { Choice: '.ql-size', title: '字体大小' },
    13. { Choice: '.ql-list[value="ordered"]', title: '编号列表' },
    14. { Choice: '.ql-list[value="bullet"]', title: '项目列表' },
    15. { Choice: '.ql-direction', title: '文本方向' },
    16. { Choice: '.ql-header[value="1"]', title: 'h1' },
    17. { Choice: '.ql-header[value="2"]', title: 'h2' },
    18. { Choice: '.ql-align', title: '对齐方式' },
    19. { Choice: '.ql-color', title: '字体颜色' },
    20. { Choice: '.ql-background', title: '背景颜色' },
    21. { Choice: '.ql-image', title: '图像' },
    22. { Choice: '.ql-video', title: '视频' },
    23. { Choice: '.ql-link', title: '添加链接' },
    24. { Choice: '.ql-formula', title: '插入公式' },
    25. { Choice: '.ql-clean', title: '清除字体格式' },
    26. { Choice: '.ql-script[value="sub"]', title: '下标' },
    27. { Choice: '.ql-script[value="super"]', title: '上标' },
    28. { Choice: '.ql-indent[value="-1"]', title: '向左缩进' },
    29. { Choice: '.ql-indent[value="+1"]', title: '向右缩进' },
    30. { Choice: '.ql-header .ql-picker-label', title: '标题大小' },
    31. { Choice: '.ql-header .ql-picker-item[data-value="1"]', title: '标题一' },
    32. { Choice: '.ql-header .ql-picker-item[data-value="2"]', title: '标题二' },
    33. { Choice: '.ql-header .ql-picker-item[data-value="3"]', title: '标题三' },
    34. { Choice: '.ql-header .ql-picker-item[data-value="4"]', title: '标题四' },
    35. { Choice: '.ql-header .ql-picker-item[data-value="5"]', title: '标题五' },
    36. { Choice: '.ql-header .ql-picker-item[data-value="6"]', title: '标题六' },
    37. { Choice: '.ql-header .ql-picker-item:last-child', title: '标准' },
    38. { Choice: '.ql-size .ql-picker-item[data-value="small"]', title: '小号' },
    39. { Choice: '.ql-size .ql-picker-item[data-value="large"]', title: '大号' },
    40. { Choice: '.ql-size .ql-picker-item[data-value="huge"]', title: '超大号' },
    41. { Choice: '.ql-size .ql-picker-item:nth-child(2)', title: '标准' },
    42. { Choice: '.ql-align .ql-picker-item:first-child', title: '居左对齐' },
    43. { Choice: '.ql-align .ql-picker-item[data-value="center"]', title: '居中对齐' },
    44. { Choice: '.ql-align .ql-picker-item[data-value="right"]', title: '居右对齐' },
    45. { Choice: '.ql-align .ql-picker-item[data-value="justify"]', title: '两端对齐' },
    46. { Choice: '.ql-upload', title: '上传文件' },
    47. { Choice: '.ql-table', title: '插入表格' },
    48. { Choice: '.ql-table-insert-row', title: '插入行' },
    49. { Choice: '.ql-table-insert-column', title: '插入列' },
    50. { Choice: '.ql-table-delete-row', title: '删除行' },
    51. { Choice: '.ql-table-delete-column', title: '删除列' }
    52. ];
    53. mounted(){
    54. for (let item of titleConfig) {
    55. let tip = document.querySelector('.quill-editor ' + item.Choice)
    56. if (!tip) continue
    57. tip.setAttribute('title', item.title)
    58. }
    59. }

    到这里 基础的富文本编辑器就能使用了

     改造图片上传

    原因:quill 自动将上传的图片转成了 base64格式 传输和储存起来不方便、转成url模式、更加方便的储存及使用

    思路:劫持quill本身上传图片的事件 、走向自己的方法

    1. 操作点击一个隐藏的上传文件按钮、将选择的图片发送到服务器
    2. 上传操作 成功后 服务器返回 图片的url地址
    3. 将图片插入到编辑器显示区域(光标的最后面)

    留一个隐藏的上传按钮放在模板里

    1. <template>
    2. <div id="RichText">
    3. <quill-editor .../>
    4. <input type="file" ref="uploadInput" @change="EditorUpload" class="uploadImgEditor" hidden />
    5. div>
    6. template>

     设置里 toolbar => handler => image 标识点击上传图片图表的回调  更改为 点击上面新增的输入框 输入框 选择好图片 再触发 @change='EditorUpload' 

    1. editorOption: {
    2. placeholder: '请在这里输入', // 默认提示 被上面覆盖了
    3. theme: 'snow', //主题 snow:有工具栏的;bubble:只有文本域的
    4. history: { // 历史记录 可回退步数相关配置
    5. delay: 1000,
    6. maxStack: 50,
    7. userOnly: false
    8. },
    9. toolbar: { //工具栏相关配置
    10. container: toolbarOptions, // 抽离出啦一个对象
    11. handlers: {
    12. image: function (value) {
    13. if (value) {
    14. document.querySelector(".uploadImgEditor").click();
    15. } else {
    16. this.Quill.format("image", false);
    17. }
    18. }
    19. }
    20. }

    收集图片以 formData格式  新增  配置好 请求头和携带内容发送请求 请求成功后 then 将图片插入到内容区、此时就是url格式的

    1. methods:{
    2. //富文本-点击图片上传事件
    3. EditorUpload() {
    4. var file = this.$refs.uploadInput.files[0];
    5. var fd = new FormData();
    6. fd.append("file", file);
    7. this.uploadLogo(fd);
    8. },
    9. //富文本-图片上传请求
    10. uploadLogo(fd) {
    11. let config = {
    12. headers: { //添加请求头
    13. "Content-Type": "multipart/form-data",
    14. "Authorization":"Bearer ....",
    15. },
    16. };
    17. // 发起请求
    18. axios
    19. .post(
    20. "http://127.0.0.1:8888/api/private/v1/upload",fd,config
    21. )
    22. .then((res) => {
    23. let quill = this.$refs.myTextEditor.quill;//获取富文本编辑器dom对象
    24. let length = quill.getSelection().index;//光标位置
    25. quill.insertEmbed(length, 'image',res.data.data.url); // 插入图片 图片地址
    26. quill.setSelection(length + 1);// 调整光标到最后
    27. });
    28. },
    29. }

  • 相关阅读:
    从零开始搭建仿抖音短视频APP-开发用户业务模块(3)
    排序算法之【希尔排序】
    好用的考勤打卡APP
    mlflow详细安装部署
    如何快速地编译并且运行Github中的Android项目
    如何将LLM 集成到自动化生产系统
    Metaverse Web 3.0 和 DeFi大师班
    电力巡检/电力抢修行业解决方案:AI+视频技术助力解决巡检监管难题
    Hudi(三)集成Flink
    戳印序列原理及C++实现二
  • 原文地址:https://blog.csdn.net/benlalagang/article/details/127783044