Vue配置TinyMCE富文本编辑器 + 图片(本地)上传到服务器

一、TinyMCE是什么?

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有:UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。

我们可以先大体看一下配置完成后的样子
在这里插入图片描述

注:博主使用的TinyMCE版本是 “tinymce”: “^4.8.2” 如果超过此版本可能会导致一些问题。

首先如果想要在Vue中使用TinyMCE,我们需要准备一些什么?
汉化的中文语言包:zh_CN.js
在这里插入图片描述
下载下来之后 对应的是一个js文件,这个时候我们先不用管它。
这个时候我们就可以使用yarn/npm来下载对应的tinymce包了,因为我们需要配置vue所以我们还需要下载一个对应的@tinymce/tinymce-vue这个包。

npm install tinymce@4.8.2 -S  // tinymce富文本编辑器包
npm install @tinymce/tinymce-vue -S  // 配置Vue tinymce官方提供的

当下在完成之后我们就可引用并使用了
这个时候我们在node_modules找到这个对应的包然后将其拉取到static或者public文件夹下,当然你拉到那个文件夹下都没关系,知道你的配置路径可以找到就ok。

我在这里的话,因为项目是采用vue-cil2来整体构建的所以就拉取到了static文件夹下
在这里插入图片描述
在这里插入图片描述
当复制完成后,我们将开始下载的中文汉化包拉到我们的tinymce中
在这里插入图片描述
接下来我们就上代码。

子组件 editor.vue组件

<template>
  <div class='tinymce'>
    <editor id='tinymce' v-model='sunHtml' @input="inp()" :init='init'></editor>
  </div>
</template>

<script>
import axios from 'axios'  // 因为上传图片地址是本地服务器  所以我们需要引入axios当然你也可以用原生ajax或fetch来发请求
import tinymce from 'tinymce/tinymce' // 引入我们下载的tinymce包
import '../../../static/tinymce/themes/modern/theme'  //引入theme文件,必须要引入的
import Editor from '@tinymce/tinymce-vue'  // 必须要引官方给我们的配置vue包
// 下方import引入都是文本编辑器中的配置项,这个根据个人需求去引入
import '../../../static/tinymce/plugins/image'
import '../../../static/tinymce/plugins/link'
import '../../../static/tinymce/plugins/code'
import '../../../static/tinymce/plugins/table'
import '../../../static/tinymce/plugins/lists'
import '../../../static/tinymce/plugins/contextmenu'
import '../../../static/tinymce/plugins/wordcount'
import '../../../static/tinymce/plugins/colorpicker'
import '../../../static/tinymce/plugins/textcolor'
export default {
  name: 'tinymce',
  // 因为我是在项目中使用的  所以这个时候我是采用了组件传值一系列方法来使用的
  // 当然你可以直接就使用v-model来绑定  (data中直接定义上方的v-model双向绑定值即可)
  props: {
    // 父组件传递过来的值
    tinymceHtml: {
      // 类型我们给其定义为String类型
      type: String,
    },
  },
  watch: {
    // 我们需要定义一个监听器
    tinymceHtml: {
      deep: true,  // 深度监听  可加可不加当你传递的是一个对象时,我们需要将深度监听加上
      handler(newVal, oldVal) {
        // 我在这里直接让v-model的值等于this.tinymceHtml父组件传递过来的值了,
        // 当然你等于newVal也可以 这个时候我们就实现了sunHtml双绑值同步于父组件传递的tinymceHtml值
        this.sunHtml = this.tinymceHtml
      }
    }
  },
  data() {
    return {
      // 定义v-model双向绑定值,然后让其默认等于父组件传递过来的值
      sunHtml: this.tinymceHtml,
      uploadUrl: process.env.UPLOAD_URL, // 自己定义的文件上传到服务器的上传地址
      picUrl: process.env.PIC_URL, // 上传到服务器后读取前缀路径(用于拼接显示使用的)
      // tinymce配置项 着重将下方两个路径换掉就可以了
      init: {
        language_url: '/static/tinymce/zh_CN.js', // 配置中文的路径
        language: 'zh_CN',
        skin_url: '/static/tinymce/skins/lightgray', // 配置项的路径
        height: 300,
        plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu',
        toolbar:
          'bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | undo redo | link unlink image code | removeformat',
        branding: false,
        // 图片读取前缀路径
        images_upload_base_path: this.picUrl,
        // 图片本地上传方法  点击上传后执行的事件
        images_upload_handler: (blobInfo, success, failure) => {
          this.handleImgUpload(blobInfo, success, failure)
        }
      }
    }
  },
  created() {
    // 可写可不写  都行
    this.sunHtml = this.tinymceHtml
  },
  mounted() {
    // 初始化tinymce
    tinymce.init({})
  },
  methods: {
    //子组件向父组件传值事件
    inp() {
      this.$emit('inp', this.sunHtml)
    },
    // 上传本地 图片执行事件
    handleImgUpload(blobInfo, success, failure) {
      let formdata = new FormData()
      // append 方法中的第一个参数就是 我们要上传文件 在后台接收的文件名
      // 这个值要根据后台来定义
      // 第二个参数是我们上传的文件
      formdata.append('file', blobInfo.blob())
      // axios 定义上传方法
      axios({
        method: "post", // post方法
        url: this.uploadUrl, // 请求上传图片服务器的路径
        headers: {
        // 配置headers请求头
          Authorization: localStorage.getItem('logintoken'), // token认证,看后台
          'Content-Type': 'application/x-www-form-urlencoded', // 采用表单上传的方式,看后台如何接受
        },
        data: formdata // 请求数据formdata
      }).then(res => {
        if (res.data.code != 200) {
          // 上传失败执行此方法,将失败信息填入参数中
          failure('HTTP Error: ' + res.msg);
          return
        }
        // 上传成功之后,将对应完整的图片路径拼接在success的参数中
        success(this.picUrl + res.data.fileUrl);
      })
    }
  },
  components: { Editor }
}
</script>
<style></style>

父组件shop.vue组件(因为代码太多了,就不放整体文件了)

// 引入tinymce富文本编辑器组件
import Editor from './editor'
  // 注册组件
  components: {
    Editor
  }
// html引用部分
<editor :tinymceHtml='传递给子组件的值' @inp='子组件传值执行的事件'></editor>

这个时候我们再来看我们的文本编辑器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上传图片到本地服务器的功能也就实现啦。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归来巨星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值