vue3 中使用 TinyMCE 富文本编辑器

1. TinyMCE 官方网站地址(可能需要魔法上网才能访问)

我们直接找到 TinyMCE 关于 vue 的下载地址,其他框架的下载也在这里

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4199789a41e34801835e1bb6ae45d648.png

2. 向下找,找到关于vue3下载的地方

下载命令

npm install --save "@tinymce/tinymce-vue@^5"

例子代码,把代码直接复制到你的项目中去就能打开

<script setup>
import Editor from '@tinymce/tinymce-vue'
</script>

<template>
  <main id="sample">
    <img alt="Vue logo" class="logo" src="./assets/logo.svg" width="125" height="125" />
    <Editor
      api-key="no-api-key"
      :init="{
        plugins: 'lists link image table code help wordcount'
      }"
    />
  </main>
</template>

<style scoped>
.logo {
  display: block;
  margin: 0 auto 2rem;
}

@media (min-width: 1024px) {
  #sample {
    display: flex;
    flex-direction: column;
    place-items: center;
    width: 1000px;
  }
}
</style>

在这里插入图片描述

3. 但是你会发现一个问题

富文本编辑器是只读状态,并有一段提示语,告诉你要使用API-key才能使用完整功能
在这里插入图片描述
他这个提示里面有一个地址链接,点击进去看
找到如何获取一个API-key,然后点击进行登录获取免费的API-key

在这里插入图片描述
点击这个永久免费的版本
在这里插入图片描述
然后会让你进行登录,两个快捷登录选项,一个是goole账号登录,一个是github账号登录,我这边选择的是github登录

登录进去之后,找到vue.js的语法版本,找到下面的代码,直接复制下来,粘贴到你的代码中就可以使用了

在这里插入图片描述
这样就可以使用了
在这里插入图片描述

4. 汉化

这个版本的 TinyMCE 汉化很简单,只需要在上面初始化的版本中加上这句 language: 'zh_CN' 就可以了

在这里插入图片描述
在这里插入图片描述

5. 上传本地图片

TinyMCE如果不设置的话,只能上传有地址的图片,或者将图片直接拖拽进富文本编辑器,或者直接截图复制进富文本编辑器中都行

但是如果你想要选择相册中的图片上传的话,你就加上下面这段就可以了

file_picker_callback: (cb, value, meta) => {
    const input = document.createElement('input');
    input.setAttribute('type', 'file');
    input.setAttribute('accept', 'image/*');
    input.addEventListener('change', (e) => {
      const file = e.target.files[0];
      const reader = new FileReader();
      reader.addEventListener('load', () => {
        const id = 'blobid' + new Date().getTime();
        const blobCache = tinymce.activeEditor.editorUpload.blobCache;
        const base64 = reader.result.split(',')[1];
        const blobInfo = blobCache.create(id, file, base64);
        blobCache.add(blobInfo);
        cb(blobInfo.blobUri(), { title: file.name });
      });
      reader.readAsDataURL(file);
    });
    input.click();
  },

在这里插入图片描述

注意注意注意::
如果这段代码复制进去之后你发现没有 tinymce 这个变量
你需要定义一个ref对象,获取 Editor 的示例
然后将 tinymce.activeEditor.editorUpload.blobCache 修改为 editorRef.value.getEditor().editorUpload.blobCache
这样就可以了

<Editor v-model="content" ref="editorRef" api-key="*********" :init="TinyMCEInitConfig" />

file_picker_callback: (cb, value, meta) => {
    const input = document.createElement('input')
    input.setAttribute('type', 'file')
    input.setAttribute('accept', 'image/*')
    input.addEventListener('change', (e) => {
      const file = e.target.files[0]
      const reader = new FileReader()
      reader.addEventListener('load', () => {
        const id = 'blobid' + new Date().getTime()
        const blobCache = editorRef.value.getEditor().editorUpload.blobCache
        const base64 = reader.result.split(',')[1]
        const blobInfo = blobCache.create(id, file, base64)
        blobCache.add(blobInfo)
        cb(blobInfo.blobUri(), { title: file.name })
      })
      reader.readAsDataURL(file)
    })
    input.click()
  }

上传本地图片到oss链接,而不是base64形式
上面的上传形式是将图片变成base64的形式,现在将上传形式转化成上传到oss链接

handleUpload 是你自己定义的上传阿里云oss的动作函数

file_picker_callback: async (cb, value, meta) => {
  const input = document.createElement('input')
  input.setAttribute('type', 'file')
  input.setAttribute('accept', 'image/*')
  input.addEventListener('change', async (e) => {
    const file = e.target.files[0]
    const res = await handleUpload({ file })
    cb(res.fileURL, { title: file.name })
  })
  input.click()
},

监听粘贴动作,将粘贴的图片也上传到Oss,而不是base64形式

setup: function (editor) {
  // 监听粘贴事件,如果粘贴的是图片,自定义粘贴动作,将图片上传到Oss再将地址返回
  // 作用:避免粘贴进来的是base64文件格式
  editor.on('paste', async function (e) {
    // 获取粘贴板中的内容
    var clipboardData = e.clipboardData || window.clipboardData
    var items = clipboardData.items
    // 遍历粘贴板中的项目
    for (var i = 0; i < items.length; i++) {
      var item = items[i]
      if (item.kind === 'file' && item.type.indexOf('image') !== -1) {
        // 阻止默认事件的进行,这一步很重要
  	    e.preventDefault()
        // 如果粘贴的是图片文件,则上传到 OSS
        var file = item.getAsFile()
        // 这里将file格式再转化一次,上面的file不知道为啥不能用
        const fileOption = new File([file], file.name, { type: file.type })
        // 上传文件到 OSS
        // 上传到 OSS 的逻辑
        const result = await handleUpload({ file: fileOption })
        result?.fileURL && editorRef.value.getEditor().insertContent('<img src="' + result.fileURL + '">')
      }
    }
  })
},

这样我们就完成了一个简单的富文本编辑器的初始化

总结一下

  1. 找到官网,找到下载vue版本的地址上
  2. 执行下载命令,将官网上的实例代码复制粘贴上去
  3. 注册账号,获取免费的API-key
  4. 汉化
  5. 优化组件行为动作,比如上传图片

补充

如果你遇到了这个问题,且编辑器无法输入时,点击提示给出的链接,把你的域名给加进去,就可以使用了
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值