跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

Vue2 和 Vue3 集成 WangEditor 富文本编辑器及自定义上传实战

在 Vue2 和 Vue3 项目中集成 WangEditor 富文本编辑器,通过安装对应版本依赖包完成组件引入与生命周期管理。重点演示了如何自定义图片与视频上传逻辑,包括使用 customUpload 方法对接后端接口,以及利用官方配置项设置上传参数如文件大小限制、跨域处理等。最终实现图文混排编辑功能,满足博客或论坛场景需求。

二进制发布于 2025/1/21更新于 2026/7/2237 浏览
Vue2 和 Vue3 集成 WangEditor 富文本编辑器及自定义上传实战

Vue2 与 Vue3 集成 WangEditor 富文本编辑器及自定义上传实战

富文本编辑器在论坛、博客等场景中非常常见,能显著提升图文展示效果。WangEditor 是一款轻量级且功能丰富的开源编辑器。本文将演示如何在 Vue2 和 Vue3 项目中完成集成,并重点实现图片与视频的自定义上传逻辑。

1. 安装依赖

根据你的项目版本选择对应的依赖包。注意 Vue3 需要使用 @next 版本的适配器。

# Vue2 环境
yarn add @wangeditor/editor
yarn add @wangeditor/editor-for-vue
# 或 npm install @wangeditor/editor --save && npm install @wangeditor/editor-for-vue --save

# Vue3 环境
yarn add @wangeditor/editor
yarn add @wangeditor/editor-for-vue@next
# 或 npm install @wangeditor/editor --save && npm install @wangeditor/editor-for-vue@next --save

2. 组件基础配置

Vue2 实现方式

在 Vue2 中,我们需要手动管理编辑器实例的生命周期。这里要注意,编辑器实例最好使用 Object.seal 进行密封,防止意外修改。

Script 部分:

<script>
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import '@wangeditor/editor/dist/css/style.css'
// 假设这是你的后端上传接口
import { uploadFileAPI } from '@/api/commonApi'

export default {
  components: { Editor, Toolbar },
  data() {
    return {
      editor: null,
      form: { content: '' },
      editorConfig: { placeholder: '请输入内容...' },
      mode: 'default' 
    }
  },
  : {
    () {
      . = .(editor)
      .(, editor)
    },
    () {
      .(, editor.)
    },
    () {
      .(, editor)
    },
    () {
      .()
    },
    () {
      .()
    },
    () {
      .()
    },
    () {
      
      event.()
      ()
    }
  }
}
</script>
// or 'simple'
methods
onCreated
editor
this
editor
Object
seal
console
log
'编辑器已创建'
onChange
editor
console
log
'内容变更'
children
onDestroyed
editor
console
log
'编辑器销毁'
onFocus
editor
console
log
'获得焦点'
onBlur
editor
console
log
'失去焦点'
customAlert
info, type
window
alert
`自定义提示\n${type}:\n${info}`
customPaste
editor, event, callback
// 处理粘贴事件,例如阻止默认行为或插入特定内容
preventDefault
callback
false

Template 部分:

<template>
  <div>
    <Toolbar 
      style="border-bottom: 1px solid #ccc" 
      :editor="editor" 
      :defaultConfig="toolbarConfig" 
      :mode="mode" 
    />
    <Editor 
      style="height: calc(100vh - 120px); overflow-y: hidden;" 
      v-model="form.content" 
      :defaultConfig="editorConfig" 
      :mode="mode" 
      @onCreated="onCreated"
      @onChange="onChange"
      @onFocus="onFocus"
      @onBlur="onBlur"
      @onDestroyed="onDestroyed"
      @customAlert="customAlert"
      @customPaste="customPaste"
    />
  </div>
</template>

Vue3 实现方式

Vue3 推荐使用 Composition API。这里有个关键点:编辑器实例必须用 shallowRef,否则会导致性能问题或响应式丢失。

<script setup>
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import '@wangeditor/editor/dist/css/style.css'
import { uploadFileAPI } from '@/api/commonApi'
import { onBeforeUnmount, ref, shallowRef, reactive } from 'vue'

const form = reactive({ content: '' })
const mode = 'default'

// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef()
const toolbarConfig = {}
const editorConfig = { 
  placeholder: '请输入内容...', 
  MENU_CONF: {} 
}

// 组件销毁时,记得销毁编辑器实例,避免内存泄漏
onBeforeUnmount(() => {
  const editor = editorRef.value
  if (editor) editor.destroy()
})

// 回调函数
const handleCreated = (editor) => {
  console.log('created', editor)
  editorRef.value = editor
}

const handleChange = (editor) => {
  console.log('change:', editor.getHtml())
}

const handleDestroyed = (editor) => {
  console.log('destroyed', editor)
}

const handleFocus = (editor) => {
  console.log('focus', editor)
}

const handleBlur = (editor) => {
  console.log('blur', editor)
}

const customAlert = (info, type) => {
  alert(`【自定义提示】${type} - ${info}`)
}

const customPaste = (editor, event, callback) => {
  console.log('ClipboardEvent', event)
  editor.insertText('xxx')
  callback(true) // 返回 true 继续默认粘贴行为
}
</script>

模板结构与 Vue2 类似,只需将 editor 替换为 editorRef 即可。

3. 自定义图片上传功能

默认的上传功能可能无法满足业务需求(如需要鉴权、存储路径定制)。我们可以通过配置 MENU_CONF 来实现。

首先确保安装了相关插件(虽然新版通常内置,但旧版可能需要):

npm i @wangeditor/plugin-mention --save

在配置文件中添加自定义上传逻辑:

// 自定义图片上传配置
editorConfig.MENU_CONF['uploadImage'] = {
  async customUpload(file, insertFn) {
    try {
      // 实际场景请对接你的后端接口
      let res = await uploadFileAPI({ file })
      // 参数依次为:url, alt, href
      insertFn(res.data.filePath, 'image', res.data.filePath)
    } catch (error) {
      console.error(error)
    }
  }
}

除了完全自定义,官方也提供了一些便捷配置项,适合快速接入标准接口:

editorConfig.MENU_CONF['uploadImage'] = {
  server: '/api/upload',           // 服务端地址
  base64LimitSize: 5 * 1024,       // 小于 5kb 转为 base64
  fieldName: 'your-custom-name',   // 表单字段名
  maxFileSize: 1 * 1024 * 1024,    // 最大 1M
  maxNumberOfFiles: 10,            // 最多 10 个
  allowedFileTypes: ['image/*'],   // 文件类型限制
  meta: { token: 'xxx' },          // 附加参数
  headers: { Accept: 'text/x-json' },
  withCredentials: true,           // 是否携带 cookie
  timeout: 5 * 1000                // 超时时间
}

4. 自定义视频上传功能

视频上传原理与图片一致,只需将配置 Key 改为 uploadVideo。注意 insertFn 的参数顺序不同,通常需要传入视频 URL 和封面图 URL。

editorConfig.MENU_CONF['uploadVideo'] = {
  async customUpload(file, insertFn) {
    try {
      let res = await uploadFileAPI({ file })
      // 参数依次为:videoUrl, posterUrl
      insertFn(res.data.filePath, res.data.posterPath)
    } catch (error) {
      console.error(error)
    }
  }
}

至此,我们就完成了在 Vue2 和 Vue3 中集成 WangEditor 并实现自定义媒体上传的全过程。根据实际后端接口调整 uploadFileAPI 的逻辑即可上线使用。

目录

  1. Vue2 与 Vue3 集成 WangEditor 富文本编辑器及自定义上传实战
  2. 1. 安装依赖
  3. Vue2 环境
  4. 或 npm install @wangeditor/editor --save && npm install @wangeditor/editor-for-vue --save
  5. Vue3 环境
  6. 或 npm install @wangeditor/editor --save && npm install @wangeditor/editor-for-vue@next --save
  7. 2. 组件基础配置
  8. Vue2 实现方式
  9. Vue3 实现方式
  10. 3. 自定义图片上传功能
  11. 4. 自定义视频上传功能
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • VSCode GitHub Copilot 安装与使用指南
  • VS Code Copilot Chat 扩展调试指南:解决运行异常
  • 在 IntelliJ IDEA 中使用飞算 AI 的实操记录
  • Docker Compose 实战:一键部署 Web、数据库与缓存微服务环境
  • COMSOL 仿真在超声层析成像中的声场优化与二值逻辑反投影算法验证
  • hls4ml:FPGA机器学习快速上手指南
  • Python 学习路线图:从入门到项目实战
  • WorkBuddy 接入 QQ 机器人配置指南
  • 子串与滑动窗口算法典型题解 Python 实现
  • MySQL 8.0.37 离线部署指南:CentOS 7.9 本地下载与安装配置
  • 哈希表核心原理:冲突处理与 C++ 实战实现
  • Python 基于朴素贝叶斯的中文评价情感分析
  • C++26 并发编程:std::future 超时机制详解与 5 大应用场景
  • AIGC 落地现状与几个值得关注的趋势
  • C++ 继承机制详解:从基础到多继承模型
  • KingbaseES ksql 事务管理与 ACID 特性详解
  • 基于 Leaflet-Trackplayer 的 WebGIS 高速轨迹可视化实战
  • 微软 Copilot Cowork 解析:基于 Kotlin 构建 AI Agent
  • 手机与电脑部署 Phi3、Llama3 大模型指南
  • 8 款 Gitee 开源效率工具推荐

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online