首页 > 其他分享 >富文本编辑器:Vue整合wangEditor

富文本编辑器:Vue整合wangEditor

时间:2023-12-13 10:58:14浏览次数:28  
标签:文本编辑 Vue wangEditor xhr 编辑器 editor 图片 上传 result

最近在做项目时,客户有个发布新闻动态的功能,具体页面内容让客户自己编写,所以要选择富文本编辑器,这样用户体验好一点。网上有很多的富文本编辑器, 因为项目的功能并不是很复杂,所以选择了wangEditor,界面简洁,使用起来也挺方便的;

实现思路

1.安装wangEditor
2.封装成组件
3.父组件中直接调用

官方文档:https://www.kancloud.cn/wangfupeng/wangeditor3/332599

一、wangEditor安装

这里使用npm命令安装;

npm install wangeditor 

二、组件封装

2.1、创建组件

这里我们创建一个名为editor.vue的文件,并导入文件;

import E from "wangeditor"

2.2、初始化wangeditor

(1)我们创建一个初始化方法
(2)编写初始化代码
(3)在mounted()中调用

    <!---html代码-->
    <div id="e" >
    </div>

js代码

    initE() {
      this.editor = new E('#e')
      //这里各位小伙伴可以查询官网,根据自己的需求进行菜单栏调整
      this. editor.customConfig.menus = [
        'head',  // 标题
        'bold',  // 粗体
        'fontSize',  // 字号
        'fontName',  // 字体
        'italic',  // 斜体
        'underline',  // 下划线
        'strikeThrough',  // 删除线
        'foreColor',  // 文字颜色
        'backColor',  // 背景颜色
        'link',  // 插入链接
        'list',  // 列表
        'justify',  // 对齐方式
        'quote',  // 引用
        'emoticon',  // 表情
        'image',  // 插入图片
        'table',  // 表格
        'code',  // 插入代码
        'undo',  // 撤销
        'redo'  // 重复
      ]
      this.editor.create()
    },
    mounted(){
      this.initE()
    }

2.3、配置图片上传

 this.editor.customConfig.uploadFileName = 'file'
      this.editor.customConfig.uploadImgServer = `url`  // 你的服务器上传地址
      this.editor.customConfig.uploadImgHooks = {
        before: function (xhr, editor, files) {
          // 图片上传之前触发
          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件

          // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
          // return {
          //     prevent: true,
          //     msg: '放弃上传'
          // }
        },
        success: function (xhr, editor, result) {
          // 图片上传并返回结果,图片插入成功之后触发
          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
        },
        fail: function (xhr, editor, result) {
          // 图片上传并返回结果,但图片插入错误时触发
          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
        },
        error: function (xhr, editor) {
          // 图片上传出错时触发
          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
        },
        timeout: function (xhr, editor) {
          // 图片上传超时时触发
          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
        },

        // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
        // (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
        customInsert: function (insertImg, result, editor) {
          // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
          // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果

          // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
          console.log(result.url)
          var url = result.url
          insertImg(url)

          // result 必须是一个 JSON 格式字符串!!!否则报错
        }
      }

该代码需放置在this.editor = new E(‘#e’) 和 this.editor.create()之间;

2.4、接收wangeditor接收值

 this.editor.customConfig.onchange = (html) => {
        this.info_ = html // 绑定当前逐渐地值
        this.$emit('change', this.info_) // 将内容同步到父组件中
  }

2.5、接收父组件传递过来的值

这里我们可以使用props属性指定字段来接收值,并使用model指定字段和事件

    model: {
      prop: 'desc',
      event:'change'
    },
    props:{
      desc:{
        type:String,
        default:""
      },
      //业务中我们经常会有添加操作和编辑操作,添加操作时,我们需清除上一操作留下的缓存
      isClear:{
        type:Boolean,
        default:false
      }
    },

2.6、将父组件传递过来的值传入wangeditor

这里我们需要使用watch来监听值的变化,并进行赋值操作

watch:{
    //判断用户是否清除编辑器缓存
      isClear(val){
     //   console.log(val)
        if (val){
          this.editor.txt.clear()
        }
      },
      //接收父组件传递过来的值
      desc(value) {
        //console.log("desc",value)
        //判断父组件传递过来的值跟当前编辑器内容是否一样
        if (value != this.editor.txt.html()) {
          this.editor.txt.html(this.desc)
        }
      }
     },

2.7、子组件代码汇总

<template>
  <div class="editor">
    <div id="e" >
    </div>
  </div>
</template>

<script>
  import Vue from 'vue'
  import E from "wangeditor"
  export default {
    name: 'editor',
    data(){
      return{
        content:"",
        editor: null,
        info_:null
      }
    },
    model: {
      prop: 'desc',
      event:'change'
    },
    watch:{
      isClear(val){
       // console.log(val)
        if (val){
          this.editor.txt.clear()
         // this.info_=null
        }
      },
      desc(value) {
        //console.log("desc",value)
        if (value != this.editor.txt.html()) {
          this.editor.txt.html(this.desc)
        }
      }
    },
    props:{
      desc:{
        type:String,
        default:""
      },
 //业务中我们经常会有添加操作和编辑操作,添加操作时,我们需清除上一操作留下的缓存
      isClear:{
        type:Boolean,
        default:false
      }
    },

    methods:{
      initE(){
         this.editor = new E('#e')
        this.editor.customConfig.onchangeTimeout = 1000 // 单位 ms
        this.editor.customConfig.uploadFileName = 'file'
        this.editor.customConfig.uploadImgServer = `url`  // 你的服务器地址
        this.editor.customConfig.uploadImgHooks = {
          before: function (xhr, editor, files) {
            // 图片上传之前触发
            // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件

            // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
            // return {
            //     prevent: true,
            //     msg: '放弃上传'
            // }
          },
          success: function (xhr, editor, result) {
            // 图片上传并返回结果,图片插入成功之后触发
            // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
          },
          fail: function (xhr, editor, result) {
            // 图片上传并返回结果,但图片插入错误时触发
            // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
          },
          error: function (xhr, editor) {
            // 图片上传出错时触发
            // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
          },
          timeout: function (xhr, editor) {
            // 图片上传超时时触发
            // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
          },

          // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
          // (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
          customInsert: function (insertImg, result, editor) {
            // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
            // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果

            // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
            console.log(result.url)
            var url = result.url
            insertImg(url)

            // result 必须是一个 JSON 格式字符串!!!否则报错
          }
        }
        this.editor.customConfig.onchange = (html) => {
          this.info_ = html // 绑定当前逐渐地值
          this.$emit('change', this.info_) // 将内容同步到父组件中
        }
        this. editor.customConfig.menus = [
          'head',  // 标题
          'bold',  // 粗体
          'fontSize',  // 字号
          'fontName',  // 字体
          'italic',  // 斜体
          'underline',  // 下划线
          'strikeThrough',  // 删除线
          'foreColor',  // 文字颜色
          'backColor',  // 背景颜色
          'link',  // 插入链接
          'list',  // 列表
          'justify',  // 对齐方式
          'quote',  // 引用
          'emoticon',  // 表情
          'image',  // 插入图片
          'table',  // 表格
          'code',  // 插入代码
          'undo',  // 撤销
          'redo'  // 重复
        ]
        this.editor.create()
       // this.editor.txt.html(this.desc)
      //  this.editor.txt.html(this.desc)
        }
    },
    mounted () {
      this.initE();
    }
  }
</script>

<style scoped>

</style>

三、父组件中进行调用

3.1、创建父组件,这里我们创建文件add-or-update.vue文件

(1)导入子组件
(2)在comonents中创建组件
(3)使用组件

import editor from './editor'
components: {
      EDITOR: editor,
    }
<EDITOR v-model="content" :isClear="isClear" ></EDITOR>

3.2、代码汇总

<template>
   <EDITOR v-model="content" :isClear="isClear" ></EDITOR>
</template>
<script>
  import editor from './editor'
  export default {
    components: {
      EDITOR: editor
    },
    data () {

      return {
        content:"",
        isClear: false//清除富文本编辑器内容
        }
      }
    },
    methods: {
    }
  }
</script>

富文本编辑器完成,快去撸起你代码~

标签:文本编辑,Vue,wangEditor,xhr,编辑器,editor,图片,上传,result
From: https://www.cnblogs.com/panwudi/p/17898565.html

相关文章

  • 项目开发之vue中如何刷新子组件,重置组件,重新加载子组件
    项目场景:在父组件循环数据列表中,列表中有事件点击打开某个子组件;父组件中要更新子组件的值问题描述在父组件循环数据列表中,点击打开某个子组件,A数据打开子组件后,B数据再打开子组件,此时子组件中会有缓存A数据。原因分析:子组件没有刷新,还是停留在上一个数据缓存解决方案:给组件添......
  • 探索 Vim:一个强大的文本编辑器
    引言:Vim(ViIMproved)是一款备受推崇的文本编辑器,拥有强大的功能和高度可定制性,提供丰富的编辑和编程体验。本文将探讨Vim的基本概念、使用技巧以及为用户带来的独特优势。简介和发展1.Vim的简介和历史Vim(ViImproved)是一个备受欢迎的文本编辑器,它是Vi编辑器的改进版本,具......
  • 基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI
    前言定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布、定时更新某一个业务状态、定时删除一些冗余数据等等。今天给大家推荐一个基于.NETCore+Quartz.NET +Vue+IView开箱即用的定时任务UI(不依赖数据库,只需在界面做简单配置):Quartz.NetUI。Quartz.......
  • vue3自定义组件全局注入
    /***自定义组件全局注入*@paramappvue实例*/import{defineAsyncComponent}from"vue";exportdefaultfunction(app){//收集@/components所有.vue组件constcomponents=import.meta.glob('@/components/*/*.vue');for(let[key,value......
  • vue文件下载调取浏览器下载进程
    fetch+streamSaver前端在使用axios发送网络请求时,如文件下载,无法实时获取当前已经下载的文件流,只有当后端返回全部流时,才能在浏览器右下角显示已经完成的进度。但是当文件很大时,就会出现长时间的等待,而且不显示下载进度。此时可以通过fetch来发送网络请求实时获取已经下载的......
  • 在Vue中使用HappyPack
    在Vue中使用HappyPack1、介绍HappyPack由于有大量文件需要解析和处理,构建是文件读写和计算密集型的操作,特别是当文件数量变多后,Webpack构建慢的问题会显得严重。运行在Node.js之上的Webpack是单线程模型的,也就是说Webpack需要处理的任务需要一件件挨着做,不能多个事情一......
  • vue实现打印功能
    1.安装插件npminstallvue-print-nb--save2. main.js中全局引入importPrintfrom'vue-print-nb'Vue.use(Print);3.页面中使用<el-dialog:visible.sync="openCodeCard"width="40%"class="offset-dialog"append-to-body:sho......
  • three.js 3d模型使用|vue项目使用three.js
    three.js3D模型使用安装安装three.jsnpminstallthree安装轨道控件插件npminstallthree-orbit-controls安装加载.obj和.mtl文件的插件npminstall--savethree-obj-mtl-loader安装渲染器插件npminstall--savethree-css2drender导入import*asThreefrom......
  • vue3 对子组件使用 v-model,关于绑定对象的问题
    这里有最基本的使用,vue3官网组件v-model我来讲讲注意事项,如果你v-model的是个reactive创建的对象,那么将不起作用,必须得是ref创建的对象要知道,v-model:<inputv-model="searchText"/><!--等价于--><input:value="searchText"@input="searchText=$event.ta......
  • websocket使用方法|vue实时推送
    WebSocket实时推送创建一个WebSocket对象:准备变量mounted(){//初始化consturi=window.location.href;//获取网页urlconstprotocol=uri.split("/")[0];//https:确定当前传输协议constdomain=uri.split("/")[2];//Iip:portconstwsPr......