Procházet zdrojové kódy

fix: watcher 调用 setHtml 包 try-catch,避免半销毁 Slate 状态抛错影响 Vue 组件

setHtml 内部会做 t.clear() + wd.insertFragment(),在 Slate 节点
proxy 已被 revoke(切 tab 后 / keep-alive 复用 / 异步数据回填时序)
的状态下会抛 'Cannot perform 'get' on a proxy that has been revoked'。
异常沿着 watcher 回调冒到 Vue,如果 Vue 把它当 render error,
整个 activity-add 页面就进 error 状态,工具栏也跟着坏。

try-catch 兜住,即使 setHtml 失败,组件仍可用,详情回填失败可以
走'保存后由父组件保存'路径。
Developer před 4 týdny
rodič
revize
251f2f774d
2 změnil soubory, kde provedl 3 přidání a 1 odebrání
  1. binární
      dist.zip
  2. 3 1
      src/components/editor/index.vue

binární
dist.zip


+ 3 - 1
src/components/editor/index.vue

@@ -27,8 +27,10 @@ export default {
     watch: {
         content(newVal) {
             // 外部 prop 变化(异步加载详情)才回填,避免输入过程中光标跳动与循环触发
+            // setHtml 在内部 Slate state 半销毁状态下会抛 "proxy has been revoked",
+            // 用 try-catch 兜住,不让 watcher 异常把整个 Vue 组件标为 error 状态
             if (this.editor && newVal !== this.editor.getHtml()) {
-                this.editor.setHtml(newVal || '')
+                try { this.editor.setHtml(newVal || '') } catch (e) { /* swallow */ }
             }
         }
     },