首页 > 其他分享 >vue项目中使用vue-quill-editor富文本编辑器、支持大小和拖拉;以及 vue 引入quill - image - resize - module 插件报错

vue项目中使用vue-quill-editor富文本编辑器、支持大小和拖拉;以及 vue 引入quill - image - resize - module 插件报错

时间:2023-06-20 12:23:49浏览次数:48  
标签:文本编辑 vue image module editor import quill

在本内容的最后面附上了demo代码

1. 实现的效果图
image
2. 首先需要先引入依赖
如果引入了下面这两个依赖报错的话,那么请查看当前内容的第8点,哪里有解决这个报错的方案
npm install quill - image - resize - module
npm install quill - image - drop - module

npm install vue - quill - editor
npm install quill - image - resize - module
npm install quill - image - drop - module

3. 在main.js里面引入使用

import VueQuillEditor from 'vue-quill-editor';
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
Vue.use(VueQuillEditor,)

4. 页面使用
这里搭配了elementUl使用上传图片

<!-- 图片上传组件辅助-->
<el-upload class="avatar-uploader" :action="uploadUrl" name="file" :show-file-list="false" :on-success="uploadSuccess" :before-upload="beforeUpload">
</el-upload>
<!--富文本编辑器组件-->
<quill-editor v-model="form.content" :content="form.content" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @ready="onEditorReady($event)" ref="QuillEditor">
</quill-editor>

5. 在页面里面引入下面的代码

import { ImageDrop } from 'quill-image-drop-module' // 图片拖动组件引用
import ImageResize from 'quill-image-resize-module' // 图片缩放组件引用
Quill.register('modules/imageDrop', ImageDrop) // 注册
Quill.register('modules/imageResize', ImageResize) // 注册
const toolbarOptions = [
  ['bold', 'italic', 'underline', 'strike'],        // 加粗,斜体,下划线,删除线
  ['blockquote', 'code-block'],                      //引用,代码块
  [{ 'header': 1 }, { 'header': 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': ['SimSun', 'SimHei', 'Microsoft-YaHei', 'KaiTi', 'FangSong', 'Arial'] }],// 字体
  [{ 'align': [] }], // 居中
  ['clean'],                                       // 清除样式,
  ['link', 'image'],  // 上传图片、上传视频
]

6. data里面加上

 data () {
    return {
      editorOption: {
        placeholder: '请在这里输入',
        theme: 'snow', //主题 snow/bubble
        modules: {
          history: {
            delay: 1000,
            maxStack: 50,
            userOnly: false
          },
          imageResize: {          //放大缩小
            displayStyles: {
              backgroundColor: "black",
              border: "none",
              color: "white"
            },
            modules: ["Resize", "DisplaySize", "Toolbar"]
          },
          imageDrop: true,      //图片拖拽
          toolbar: {
            container: toolbarOptions,
            handlers: {
              image: function (value) {
                if (value) {
                  // 调用element的图片上传组件
                  document.querySelector('.avatar-uploader input').click()
                } else {
                  this.quill.format('image', false)
                }
              }
            }
          }
        }
      },
      uploadUrl: `xxx`, 	// 服务器上传图片地址
    };
  },
  1. method使用
// 失去焦点
    onEditorBlur (editor) { },
    // 获得焦点
    onEditorFocus (editor) { },
    // 开始
    onEditorReady (editor) { },
    // 值发生变化
    onEditorChange (editor) {
      this.content = editor.html;
    },
    beforeUpload (file) { },
    uploadSuccess (res) {
      // 获取富文本组件实例
      let quill = this.$refs.QuillEditor.quill;
      // 如果上传成功
      if (res) {
        // 获取光标所在位置
        let length = quill.getSelection().index;
        // 插入图片,res为服务器返回的图片链接地址
        quill.insertEmbed(length, 'image', res); // 直接使用 res

        // 调整光标到最后
        quill.setSelection(length + 1);
      } else {
        // 提示信息,需引入Message
        this.$message.error('图片插入失败!');
      }
    },

8. 如果遇到下面的错误
vue 引入quill - image - resize - module 插件报错
image

9. 记得在vue.config.js里面配置一下
这里配置好之后,记住重新npm run serve一下,不然可能还是会出现这个报错

const webpack = require('webpack')  //别忘了这个
// vue 引入quill - image - resize - module 插件报错
module.exports = {
  configureWebpack: {
    plugins: [
      new webpack.ProvidePlugin({
        'window.Quill': 'quill/dist/quill.js',
        Quill: 'quill/dist/quill.js'
      })
    ]
  },
}

10. 完整demo代码
别忘了npm install vue - quill - editor之后在main.js里面引入

import VueQuillEditor from 'vue-quill-editor';
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
Vue.use(VueQuillEditor,)

然后剩下的就是下面这些了

<template>
  <div>
    <!-- 图片上传组件辅助-->
    <el-upload class="avatar-uploader" :action="uploadUrl" name="file" :show-file-list="false" :on-success="uploadSuccess" :before-upload="beforeUpload">
    </el-upload>
    <!--富文本编辑器组件-->
    <quill-editor v-model="form.synopsis" :content="form.synopsis" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @ready="onEditorReady($event)" ref="QuillEditor">
    </quill-editor>
  </div>
</template>

<script>
import { ImageDrop } from 'quill-image-drop-module' // 图片拖动组件引用
import ImageResize from 'quill-image-resize-module' // 图片缩放组件引用
Quill.register('modules/imageDrop', ImageDrop) // 注册
Quill.register('modules/imageResize', ImageResize) // 注册
const toolbarOptions = [
  ['bold', 'italic', 'underline', 'strike'],        // 加粗,斜体,下划线,删除线
  ['blockquote', 'code-block'],                      //引用,代码块
  [{ 'header': 1 }, { 'header': 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': ['SimSun', 'SimHei', 'Microsoft-YaHei', 'KaiTi', 'FangSong', 'Arial'] }],// 字体
  [{ 'align': [] }], // 居中
  ['clean'],                                       // 清除样式,
  ['link', 'image'],  // 上传图片、上传视频
]
export default {
  name: 'VueDemo3',

  data () {
    return {
      editorOption: {
        placeholder: '请在这里输入',
        theme: 'snow', //主题 snow/bubble
        modules: {
          history: {
            delay: 1000,
            maxStack: 50,
            userOnly: false
          },
          imageResize: {          //放大缩小
            displayStyles: {
              backgroundColor: "black",
              border: "none",
              color: "white"
            },
            modules: ["Resize", "DisplaySize", "Toolbar"]
          },
          imageDrop: true,      //图片拖拽
          toolbar: {
            container: toolbarOptions,
            handlers: {
              image: function (value) {
                if (value) {
                  // 调用element的图片上传组件
                  document.querySelector('.avatar-uploader input').click()
                } else {
                  this.quill.format('image', false)
                }
              }
            }
          }
        }
      },
      uploadUrl: `xxx`, 	// 服务器上传图片地址
    };
  },

  mounted () {

  },

  methods: {
    // 失去焦点
    onEditorBlur (editor) { },
    // 获得焦点
    onEditorFocus (editor) { },
    // 开始
    onEditorReady (editor) { },
    // 值发生变化
    onEditorChange (editor) {
      this.content = editor.html;
    },
    beforeUpload (file) { },
    uploadSuccess (res) {
      // 获取富文本组件实例
      let quill = this.$refs.QuillEditor.quill;
      // 如果上传成功
      if (res) {
        // 获取光标所在位置
        let length = quill.getSelection().index;
        // 插入图片,res为服务器返回的图片链接地址
        quill.insertEmbed(length, 'image', res); // 直接使用 res

        // 调整光标到最后
        quill.setSelection(length + 1);
      } else {
        // 提示信息,需引入Message
        this.$message.error('图片插入失败!');
      }
    },
  },
};
</script>

标签:文本编辑,vue,image,module,editor,import,quill
From: https://www.cnblogs.com/Amyel/p/17493306.html

相关文章

  • vue学习第15天 CSS ---- 动画animation
    动画动画(animation)是CSS3中具有颠覆性特征之一,可通过设置多个节点来精确控制一个或一组动画。常用来实现复杂的动画效果。相比较过渡,动画可以实现更多变化,更多控制,连续自动播放等效果。动画的优点(与过渡相比更好) 1、动画的基本使用(先定......
  • 【保姆级教程】Vue项目调试技巧
    前言在Vue项目开发过程中,当遇到应用逻辑出现错误,但又无法准确定位的时候,知晓Vue项目调试技巧至关重要,debug是必备技能。同后台项目开发一样,可以在JS实现的应用逻辑中设置断点,并进行单步、进入方法内、跳出方法等调试,从而准确定位问题根源。本文主要讲解针对Vue项目进行调试的3......
  • 前端Vue自定义简单实用中国省市区三级联动选择器
    前端Vue自定义简单实用中国省市区三级联动选择器,请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13118效果图如下:使用方法<!--themeColor:主题颜色ref:设置唯一refpickerValueDefault:默认选择@onCancel:取消事件@onConfirm:确认事件--><cc-city-......
  • 京东微前端应用MicroApp,主应用vite-vue3,子应用vite-vue3+pinia
    micro-app官方地址micro-app官方demo地址这篇文章主要是为了记录,本人在使用中遇到的一些问题,供参考资源找不到->本地使用代理,显示nginx转发子应用使用组件插槽或者pinia,路由懒加载报错问题->小项目几个路由不要懒加载,大项目中懒加载的时候不要使用pinia或者组件中不适用......
  • 前端Vue自定义询问弹框和输入弹框
    前端Vue自定义询问弹框和输入弹框,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13119效果图如下:使用方法<!--提示框--><cc-defineDialogBoxref="DialogBox"></cc-defineDialogBox>//显示询问弹框showDialogBox(){this.$refs['D......
  • 前端Vue自定义服务说明弹窗弹框 自下而上底部弹框
    前端Vue自定义服务说明弹窗弹框自下而上底部弹框,请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13108效果图如下:cc-serviceDialog自定义服务说明弹窗自下而上底部弹窗使用方法<!--服务组件弹窗close:关闭事件class:定义类(显示或隐藏) --><cc......
  • 将 Vue 项目部署到 Nginx 上
    将Vue项目部署到Nginx上安装Nginx下载地址:nginx:download(1)因为我在Windows系统下安装Nginx,所以选择nginx/Windows-1.22.1。下载的资源是一个压缩包,解压后即可使用。(2)打开命令行提示符(cmd),切换到Nginx的根目录,启动Nginx服务器。cd/DD:/software/nginx-1.22.1......
  • vue el-input 输入框 限制小数点后 只能有三位小数
     ​​oninput="if(value.indexOf('.')>0){value=value.slice(0,value.indexOf('.')+4)}"​​  ......
  • vue中使用axios
    引入axios错误用法在main.js中引入,需要注意的是,因为axios是第三方库,不是vue的插件,所以下面的这种写法不支持。importaxiosfrom'axios';Vue.use(axios)正确用法结合vue-axios使用,vue-axios是将axios集成到Vue.js的小包装器,可以像插件一样进行安装,具体用法是:安装......
  • vue通信-provide&inject
    刚完成一个需求,父组件开启一个任务,开启后孙组件显示一个执行按钮,在孙组件中点击执行按钮,再到父组件中执行任务并隐藏按钮;可以使用props和emit实现,因为组件层级较多,所以考虑使用provide&inject实现父组件和孙组件的通信;以下代码记录实现过程:父组件:Parent.vue<template> <div>......