首页 > 其他分享 >【Vue】运行npm run dev出现98%vue-quill-editor 富文本编辑器错误解决

【Vue】运行npm run dev出现98%vue-quill-editor 富文本编辑器错误解决

时间:2024-01-08 15:36:14浏览次数:28  
标签:npm 文本编辑 Vue 字体大小 header 字体 上传 quill 图片


感谢:SpiritualTuto

1、下载Vue-Quill-Editor

npm install vue-quill-editor --save

2、如果还不行,下载quill(Vue-Quill-Editor需要依赖)

npm install quill --save

3、全局引入

import 'quill/dist/quill.core.css'
     import 'quill/dist/quill.snow.css'
     import 'quill/dist/quill.bubble.css'
     import { quillEditor } from 'vue-quill-editor
     //单独页面注册一下
     exp def{
         components: {quillEditor},
     }
<quill-editor
      ref="newEditor"
      v-model="content"
      class="qediter"
      :style="`height: ${height}px`"
      :options="editorOption"
      @change="onEditorBlur($event)"
    />

4、** 选项配置(如果为空的就默认展示所有选项)
 

editorOption: {
        placeholder: '请在这里输入',
        modules: {
          toolbar: [
            ['bold', 'italic', 'underline', 'strike'], //加粗,斜体,下划线,删除线
            ['blockquote', 'code-block'], //引用,代码块
            [{ header: 1 }, { header: 2 }], // 标题,键值对的形式;1、2表示字体大小
            [{ list: 'ordered' }, { list: 'bullet' }], //列表
            [{ indent: '-1' }, { indent: '+1' }], // 缩进
            [{ direction: 'rtl' }], // 文本方向
            [{ size: ['small', false, 'large', 'huge'] }], // 字体大小
            [{ header: [1, 2, 3, 4, 5, 6, false] }], //几级标题
            [{ color: [] }, { background: [] }], // 字体颜色,字体背景颜色
            [{ align: [] }], //对齐方式
            ['clean'], //清除字体样式
            ['image', 'video'] //上传图片、上传视频
          ]
        }
      },

此时此刻 你就可以实现最基础的富文本编辑器啦~

但是富文本编辑器上传图片的格式为 base64位的 , 后端无法处理

于是我们要调取后端的接口获取地址, 并且要把图片反显到编辑器上

body部分

<template>
  <div class="container">
    <quill-editor
      ref="newEditor"
      v-model="content"
      class="qediter"
      :style="`height: ${height}px`"
      :options="editorOption"
      @change="onEditorBlur($event)"
    />
    <!-- 隐藏upload 上传图片 -->
    <el-upload
      ref="uploadImg"
      class="upload-img"
      //这里写入你的接口地址
      action="#########"
      :before-upload="picBeforeupload"
      :on-error="picError"
      :on-success="success"
      accept="image/png, image/jpeg, image/jpg, image/gif"
      :show-file-list="false"
    >
      <slot name="trigger">
        <div id="editorUploadImage" />
      </slot>
    </el-upload>
  </div>
</template>

JS部分

props: {
    value: {
      type: String,
      default: ''
    },
    option: {
      type: Object,
      default: () => ({})
    },
    height: {
      type: Number,
      default: 500
    }
  },
  data() {
    return {
      content: '',
      editorOption: {
        placeholder: '请在这里输入',
        modules: {
          toolbar: [
            ['bold', 'italic', 'underline', 'strike'], //加粗,斜体,下划线,删除线
            ['blockquote', 'code-block'], //引用,代码块
            [{ header: 1 }, { header: 2 }], // 标题,键值对的形式;1、2表示字体大小
            [{ list: 'ordered' }, { list: 'bullet' }], //列表
            [{ indent: '-1' }, { indent: '+1' }], // 缩进
            [{ direction: 'rtl' }], // 文本方向
            [{ size: ['small', false, 'large', 'huge'] }], // 字体大小
            [{ header: [1, 2, 3, 4, 5, 6, false] }], //几级标题
            [{ color: [] }, { background: [] }], // 字体颜色,字体背景颜色
            [{ align: [] }], //对齐方式
            ['clean'], //清除字体样式
            ['image', 'video'] //上传图片、上传视频
          ]
        }
      },
      addImgRange: null
    }
  },
  watch: {
    value: {
      handler(newValue, preValue) {
        if (newValue !== preValue && newValue !== this.content) {
          this.content = newValue
        }
      },
      immediate: true
    }
  },
  created() {
    Object.assign(this.editorOption, this.option)
  },
  mounted() {
    this.init()
      },
  methods: {
    //成功回调
    success(res){
      const url = Api.imgUrl +res.data
       this.addImg(url)
    },
    init() {
      // 重写图片添加图片
      const imgHandler = state => {
        if (state) {
          document.getElementById('editorUploadImage').click()
        }
      }
      this.$refs.newEditor.quill.getModule('toolbar').addHandler('image', imgHandler)
    },

    onEditorBlur() {
      this.$emit('input', this.content)
    },
    // 图片大小检查
    picBeforeupload(file) {
      const isLt4M = file.size / 1024 / 1024 < 4
      if (!isLt4M) {
        this.$message.error('上传图片大小不能超过 4MB!')
      }
      return isLt4M
    },
    // 上传图片失败
    picError() {
      this.$message({
        message: '图片添加失败,请重试',
        type: 'error'
      })
    },
    // 添加图片
    addImg(imgUrl) {
      this.addImgRange = this.$refs.newEditor.quill.getSelection() // 检索用户的选择范围, 如果编辑没有焦点,可能会返回一个null
      this.$refs.newEditor.quill.insertEmbed(
      this.addImgRange != null ? this.addImgRange.index : 0,
      'image',
       imgUrl,
      )
    }
  }

标签:npm,文本编辑,Vue,字体大小,header,字体,上传,quill,图片
From: https://blog.51cto.com/u_15654527/9145482

相关文章

  • 如何将自动安装的vue2.9.x转换为vue3.0
    一:概述在刚开始学习node.js时,我们都会先去官网下载然后去安装,结果通过安装的node.js直接在命令行中,下载npm和vue,下载的默认版本是vue2.9.6,如果想使用vue3.0就需要重新的安装。vue3支持UI界面开发,可以说是比较舒服的。二:安装的具体说明<1>首先卸载原来安装的vue2.9.6版本npmuninsta......
  • vue5
    本文围绕一个小型项目展开。exportinterfaceStudent{id:string,name:string,grade:number,score:number,}//src/views/Father.vue<template><!--emitEvent-Child是kebab命名,官方推荐这种命名方法,因为事件监听器在DOM模板中会被自动转成全......
  • uni-app+vue3+ts项目搭建完整流程
    项目代码同步更新至码云uni-vue3-ts-template开发前准备利用uni-app开发,有两种方法:通过HBuilderX创建(需安装HBuilderX编辑器)通过命令行创建(需安装NodeJS环境),推荐使用vscode编辑器这里我们使用第2种方法,这两种方法官方都有详细介绍点击查看官方文档vscode安......
  • 扩展 jQurey.i18n.properties 的能力来向 vue-i18n 靠齐
    jQuery.i18n.properties是jQuery老项目的国际化框架,其实国际化方案本质上都大同小异,都是需要用翻译函数包裹词条,然后根据词条文件来进行翻译就是使用上与其他框架不太一样而已但由于我们已经基于vue框架实现了一个国际化自动处理脚本,脚本会自动用全局函数包裹词条,自动提取......
  • 如何使用vue的watch
    在Vue.js中,watch是一个对象,你可以使用它来观察和响应Vue实例上的数据变化。当被观察的数据发生变化时,对应的回调函数将会被执行。以下是如何使用watch的基本示例:javascriptnewVue({el:'#app',data:{message:'HelloVue!'},watch:{message:function(ne......
  • vuex实际操作
    Vuex是专为Vue.js应用程序开发的状态管理模式,采用集中式存储管理应用的所有组件的状态,解决多组件数据通信12。Vuex的使用方法如下:安装:直接使用npm安装或到页面引入vuex.js文件。单一状态树:Vuex使用单一状态树,即用一个对象就包含了全部的状态数据。操作状态:通过修改状态,使得多个组件......
  • 在app.vue created中使用screenfull一进入就自动触发全屏,无需手动点击
    要在Vue的 created 钩子中自动触发全屏模式,您可以使用 screenfull.request() 方法。但是,需要注意的是,用户通常期望有某种形式的交互(如点击事件)才会触发全屏模式。强制应用在页面加载时自动进入全屏模式可能会对用户体验产生负面影响。以下是一个简单的示例,展示了如何在Vue......
  • ant design vue 图片预览组件自定义样式
    这篇文章主要为大家介绍了ant design vue 图片预览组件自定义样式方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪−目录版本:场景:需求:版本:antdesignvue3.2.4场景:使用Image图片组件预览功能需求:自定义预览遮罩层及预览图片的样式;不得影响到其......
  • vue2 修改 this.form = response.data数据,form2也会影响?
    vue2    this.form=response.data    this.oldForm=response.data为啥this.form数据变化会影响this.oldForm里的数据在Vue2中,当你在组件中看到一个数据属性(例如 this.form 和 this.oldForm)的值发生变化时,这通常是因为Vue的响应式系统在背后工作。当你......
  • Vuex与Vuex-Class的底层原理简单实现
    vuex-class是在class-component中使用vuex的辅助工具。学习任何技术栈的使用,最透彻的掌握方法就是去简单实现一下,下面先简单实现一下vuex,然后基于我们自己实现的vuex再去实现一个vuex-class,彻底搞定vuex-class的使用。首先回忆一下vuex的使用(配置)方法,首先我们需要在某个位置执行Vue......