wangEditor5 富文本编辑器基于 vue3、Nuxt3

这是官方dome: https://www.wangeditor.com/demo/index.html

使用这个插件会遇到的一些问题 已解决

1.使用5.1.23的最新的话:视频尺寸编辑会有问题

2.setHtml 不可以设置值 提示不存在 上传图片 上传视频

3.刷新页面 编辑器数据不存在

这篇文章主要讲一下创建 引入 图片上传 粘贴 视频上传

在项目中安装

yarn安装
    yarn add @wangeditor/editor
    yarn add @wangeditor/editor-for-vue@next
npm 安装
    npm install @wangeditor/editor
    npm install @wangeditor/editor-for-vue@next

这里我是通过创建组件来使用 你们也可以直接在想要的页面直接引入就好

这个是部分代码截图:

 第一步:首先创建一个组件wangeditor.vue

这里讲一下vue3和nuxt引入 我们除了引入不同 其他的都是一样的 我们在wangeditor.vue组件里面引入wangeditor

vue3的引入方法

        import "@wangeditor/editor/dist/css/style.css";

        import { Editor, Toolbar} from '@wangeditor/editor-for-vue'

Nuxt的引入方法: 因为在Nuxt中是分服务端跟客户端的所以这里我们需要判断一下

方法1:       

 if (process.client) {

                const { Editor, Toolbar } = await import("@wangeditor/editor-for-vue");

        }

方法2:在父组件使用

 <ClientOnly>

        <h-wangeditor />

 </ClientOnly>

 然后再子组件就可以用vue3的引入方式了

wangeditor.vue组件代码:

vue3引入:

<template>
  <div class="py-5px">
    <Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" mode="default" />
    <Editor style="height: 500px; overflow-y: hidden" v-model="valueHtml" :defaultConfig="editorConfig" mode="default" @onCreated="handleCreated" />
  </div>
</template>

<script setup>
import { onBeforeUnmount, ref, shallowRef, onMounted } from "vue";
import "@wangeditor/editor/dist/css/style.css"; // 引入 css
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";

const editorRef = shallowRef(); // 编辑器实例,必须用 shallowRef
const valueHtml = ref("<p>hello</p>"); // 内容 HTML
// 模拟 ajax 异步获取内容
onMounted(() => {
  setTimeout(() => {
    valueHtml.value = "<p>模拟 Ajax 异步设置内容</p>";
  }, 1500);
});
const toolbarConfig = {};
const editorConfig = { placeholder: "请输入内容..." };
// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {
  const editor = editorRef.value;
  if (editor == null) return;
  editor.destroy();
});
const handleCreated = (editor) => {
  editorRef.value = editor; // 记录 editor 实例,重要!
};
</script>

Nuxt3引入:

<template>
  <div class="py-5px">
    <Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" mode="default" />
    <Editor style="height: 500px; overflow-y: hidden" v-model="valueHtml" :defaultConfig="editorConfig" mode="default" @onCreated="handleCreated" />
  </div>
</template>

<script setup>
import { onBeforeUnmount, ref, shallowRef, onMounted } from "vue";
import "@wangeditor/editor/dist/css/style.css"; // 引入 css
if (process.client) {
  const { Editor, Toolbar } = await import("@wangeditor/editor-for-vue");
}
const editorRef = shallowRef(); // 编辑器实例,必须用 shallowRef
const valueHtml = ref("<p>hello</p>"); // 内容 HTML
// 模拟 ajax 异步获取内容
onMounted(() => {
  setTimeout(() => {
    valueHtml.value = "<p>模拟 Ajax 异步设置内容</p>";
  }, 1500);
});
const toolbarConfig = {};
const editorConfig = { placeholder: "请输入内容..." };
// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {
  const editor = editorRef.value;
  if (editor == null) return;
  editor.destroy();
});
const handleCreated = (editor) => {
  editorRef.value = editor; // 记录 editor 实例,重要!
};
</script>

以上就能够展示富文本编辑器出来来 自己去想要的页面引入一下就好了

然后就讲一下图片上传粘贴这些怎么配置 :没什么改变就是 加了上传图片跟视频的配置 然后就可以粘贴这些都没问题了

<template>
  <div class="py-5px">
    <Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" mode="default" />
    <Editor style="height: 500px; overflow-y: hidden" v-model="valueHtml" :defaultConfig="editorConfig" mode="default" @onCreated="handleCreated" />
  </div>
</template>

<script setup>
import { onBeforeUnmount, ref, shallowRef, onMounted } from "vue";
import "@wangeditor/editor/dist/css/style.css"; // 引入 css
if (process.client) {
  const { Editor, Toolbar } = await import("@wangeditor/editor-for-vue");
}
const editorRef = shallowRef(); // 编辑器实例,必须用 shallowRef
const valueHtml = ref("<p>hello</p>"); // 内容 HTML
// 模拟 ajax 异步获取内容
onMounted(() => {
  setTimeout(() => {
    valueHtml.value = "<p>模拟 Ajax 异步设置内容</p>";
  }, 1500);
});
const toolbarConfig = {};
const editorConfig = {  MENU_CONF: {}};
/**
 * @上传图片
 */
 editorConfig.MENU_CONF["uploadImage"] = {
  // 上传图片的配置
  server: "这里是上传图片的地址",
  fieldName: "image", //这个是参数名字
  headers: { //配置token 接口需要就配 不需要就不用
    Authorization: "Bearer asdfhaohfvdsnvshf",
  },
  customInsert(res, insertFn) {这个是获取接口返回的数据
    insertFn(res.data.url); // 从 res 中找到 url(也就是接口返回的图片地址),然后插入图片
  },
};

/**
 * @上传视频
 */
 editorConfig.MENU_CONF["uploadVideo"] = {
  server: "这里是上传图片的地址", //上传图片的请求地址
  fieldName: "image", //这个是参数名字
  headers: {//配置token 接口需要就配 不需要就不用
    Authorization: "Bearer asdfhaohfvdsnvshf",
  },
  customInsert(res, insertFn) { 这个是获取接口返回的数据
    insertFn(res.data.url); // 从 res 中找到(也就是接口返回的图片地址),然后插入图片
  },
};
// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {
  const editor = editorRef.value;
  if (editor == null) return;
  editor.destroy();
});
const handleCreated = (editor) => {
  editorRef.value = editor; // 记录 editor 实例,重要!
};
</script>

现在就可以实现基本的富文本需求了 自己创建一个dome试一下 流程走通了 大概了解了在 丢进项目 不然报错一大堆 然后找bug就找一天  如果有什么其他的问题欢迎提问~~~

wangeditor 在nuxt3中 第一次进入回显正常 刷新 或者第二次进去 就会报setHtml不存在 当时花了一周的时间去找这个问题 最后还是没用它这个方法 直接改成dangerouslyInsertHtml这个方法去回显html值

1.视频编辑尺寸不显示 请把版本降级 我是降级到了5.1.12版本

2.setHtml方法不存在 我们使用  

//这里我过滤了一下 因为每次进入编辑器 首位都会自动添加回车 不过滤就会越加越多

const valueHtml = computed({
  get() {
    //这里我过滤了一下 因为每次进入编辑器 首位都会自动添加回车 不过滤就会越加越多
    return props.content.replace(/<p><br><\/p>/g, "");
  },
  set(value) {
    emit("on-html", value);
  },
});

3.刷新页面数据不存在 也是跟2一样