Quill 编辑器的实例很重要,对内容的各种操作、事件监听都需要直接调用实例上的方法,它是一个层级很深、非常复杂的 js 对象(下面都以 quill 称)。
当在 Vue3 项目中使用 quill 时,可能随手就将它放进了 ref 里,默认会被深层代理。这里就会出大问题。
如果直接通过代理的方式访问 quill 上的任何方法时,浏览器可能会报错(找不到 blot 上的 offset),不仅操作不会生效,而且后续会一直报错,出现键盘操作无响应、注册的事件不触发、显示内容与 delta 数据不一致等等各种问题,几乎就是彻底崩溃了。
猜测原因是 Vue Proxy 数据代理机制会对这种第三方的非响应式的对象产生影响。
解决办法就是不对它进行代理:
// 1、不使用 vue ref
let quill = null
onMounted(() => {
quill = new Quill({})
})
// 2、用 markRaw 标记 quill 实例
const quill = ref(null)
onMounted(() => {
quill.value = markRaw(new Quill({}))
})
Vue 文档中有关于 markRaw
的详细介绍,里面专门提到了「有些值不应该是响应式的,例如复杂的第三方类实例或 Vue 组件对象」,可参考:markRaw。