vue富文本组件需显式声明emits: ['update:modelvalue']并监听@input/@blur+@keyup事件触发emit,配合v-model实现受控绑定,确保父组件可靠接收html内容且防xss、空内容。

Vue 组件中处理富文本内容变化的事件派发,核心是结合 contenteditable 元素与 emits 显式声明更新事件,确保父组件能可靠接收最新 HTML 内容。关键不在“能不能发”,而在“怎么发得清晰、可控、可维护”。
明确声明 update:modelValue 事件
富文本组件通常作为受控组件使用,需支持 v-model 双向绑定。这要求子组件必须在 emits 中声明 update:modelValue,否则该事件会被视为“未声明事件”,触发 Vue 3 的透传机制——可能意外绑定到根元素上,造成重复触发或监听失效。
- 用数组形式声明最常用:
emits: ['update:modelValue'] - 若需校验参数(比如只允许字符串),可用对象形式:
emits: { 'update:modelValue': (value) => typeof value === 'string' } - 搭配
defineEmits(组合式 API)更类型安全:const emit = defineEmits(['update:modelValue'])
监听 contenteditable 的输入并触发 emit
不能依赖 @change(它对 contenteditable 不生效),应监听 @input 或更稳妥的 @blur + @keyup 组合,避免频繁触发影响性能。

