<template> <div style="border: 1px solid #ccc"> <Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" /> <Editor style="height: 500px; overflow-y: hidden" v-model="valueHtml" :defaultConfig="editorConfig" :mode="mode" @onCreated="handleCreated" @onChange="handleChange" /> </div> </template> <script setup> import "@wangeditor/editor/dist/css/style.css"; // 引入 css import { onBeforeUnmount, ref, shallowRef, onMounted } from "vue"; import { getToken } from "@/utils/auth"; import { Editor, Toolbar } from "@wangeditor/editor-for-vue"; const emit = defineEmits(); const props = defineProps({ modelValue: [String], }); // 编辑器实例,必须用 shallowRef const editorRef = shallowRef(); // 内容 HTML const valueHtml = ref(""); const mode = ref("default"); // 模拟 ajax 异步获取内容 onMounted(() => { setTimeout(() => { // valueHtml.value = "<p>模拟 Ajax 异步设置内容</p>"; }, 1500); }); const toolbarConfig = ref({}); const baseUrl = import.meta.env.VITE_APP_ENV == "development" ? "/dev-api" : import.meta.env.VITE_APP_BASE_API; const uploadImgUrl = ref(baseUrl + "/file/upload"); // 上传的图片服务器地址 const editorConfig = ref({ placeholder: "请输入内容...", MENU_CONF: { uploadImage: { server: uploadImgUrl, fieldName: "file", headers: { Authorization: "Bearer " + getToken(), }, customInsert(res, insertFn) { // JS 语法 // res 即服务端的返回结果 // 从 res 中找到 url alt href ,然后插入图片 insertFn(res.data.url, res.data.originalName, res.data.url); }, }, uploadVideo: { server: uploadImgUrl, fieldName: "file", allowedFileTypes: [], headers: { Authorization: "Bearer " + getToken(), }, customInsert(res, insertFn) { // JS 语法 // res 即服务端的返回结果 // 从 res 中找到 url poster ,然后插入视频 console.log("res", res); insertFn(res.data.url, res.data.url); }, }, }, }); // 组件销毁时,也及时销毁编辑器 onBeforeUnmount(() => { const editor = editorRef.value; if (editor == null) return; editor.destroy(); }); // 编辑器回调函数 const handleCreated = (editor) => { editorRef.value = editor; // 记录 editor 实例,重要! }; //输入改变 const handleChange = (editor) => { emit("update:modelValue", editor.getHtml()); }; watch( () => props.modelValue, (val) => { console.log("val", val); valueHtml.value = val; }, { immediate: true, deep: true, } ); </script>