vue 富文本实现原理
Vue 富文本实现原理
Vue 中实现富文本编辑通常基于现成的库(如 Quill、TinyMCE)或原生 contenteditable 属性。以下是核心实现原理和技术要点:
基于 contenteditable 的原生实现
通过 HTML 的 contenteditable 属性使元素可编辑:
<div contenteditable="true" v-html="content"></div>
数据绑定通过 v-html 指令实现,需监听 input 或 blur 事件同步内容到 Vue 数据模型。
使用第三方富文本库
以 Quill 为例的集成流程:

- 安装依赖:
npm install quill - 初始化编辑器并绑定 Vue 数据:
import Quill from 'quill';
export default { data() { return { content: '' }; }, mounted() { const quill = new Quill('#editor', { modules: { toolbar: true }, theme: 'snow' }); quill.on('text-change', () => { this.content = quill.root.innerHTML; }); } };
#### 数据与视图同步
双向绑定通过以下方式实现:
- 第三方库的事件监听(如 Quill 的 `text-change`)
- 手动监听原生 `contenteditable` 的 `input` 事件
- 使用 `v-model` 自定义指令封装(需处理 HTML 转义)
#### 安全性处理
防止 XSS 攻击的常见措施:
- 使用 DOMPurify 过滤输入内容:
```javascript
import DOMPurify from 'dompurify';
this.cleanContent = DOMPurify.sanitize(rawContent);
- 避免直接使用
v-html渲染未过滤内容
扩展功能实现
常见富文本功能的技术方案:

- 图片上传:拦截粘贴/拖拽事件,转换为 Base64 或上传到服务器
- 自定义样式:通过 CSS 类或行内样式修改选区内容
- 协同编辑:使用 OT(Operational Transformation)算法同步修改
性能优化
处理大文档的建议:
- 虚拟滚动(只渲染可视区域内容)
- 防抖处理频繁的内容变更事件
- 分离存储原始内容和渲染用 HTML
响应式设计
适配不同设备的方案:
- 动态调整工具栏布局
- 移动端使用原生输入法兼容模式
- 媒体查询控制编辑器尺寸
示例:自定义 Vue 富文本组件
基础实现代码结构:
<template>
<div class="editor-wrapper">
<div ref="editor" contenteditable @input="updateContent"></div>
</div>
</template>
<script>
export default {
props: ['value'],
methods: {
updateContent(e) {
this.$emit('input', e.target.innerHTML);
}
},
watch: {
value(newVal) {
if (newVal !== this.$refs.editor.innerHTML) {
this.$refs.editor.innerHTML = newVal;
}
}
}
};
</script>
主流方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| contenteditable | 轻量、无需依赖 | 兼容性问题多、功能有限 |
| Quill | 模块化设计、API 丰富 | 定制样式较复杂 |
| TinyMCE | 企业级功能、官方插件 | 体积较大、商业版收费 |
| ProseMirror | 协同编辑支持、强扩展性 | 学习曲线陡峭 |






