Vue3+CodeMirror6踩坑:Trying to update state with a transaction that doesn't start from the previous state.

今天项目中使用Vue3和CM6形成低代码编辑器,即使使用了dispatch范式也反复报副作用错误。后面反复鼓捣才知道是vue3的Proxy对象包装的问题。

    // ....
    const view: Ref<EditorView | null> = ref(null);
    view.value = new EditorView({
      state,
      parent: editorRef.value,
    });
    // BUG WARNING!!
    /**
     * VUE3 的Proxy对象在传入复杂的类中时会导致对象不一致的错误!
     */
    const rawView = toRaw(view.value);
    // const rawView = view.value;

    toggleComment(rawView); // 传入ref包裹的对象,即使.value也会报错

如果CM6的Api需要传入整个EditorView对象,就需要toRaw解除proxy的包装。

平常没有注意到这个问题,是因为vue框架自动处理掉了,但是对接一些没有对vue进行特殊兼容的外部依赖时,要习惯解除包装。

posted @ 2025-09-18 13:43  5M7_Api  阅读(42)  评论(0)    收藏  举报