开发者问题收集

升级到 vue 3.x 时出现未捕获的类型错误:无法读取未定义的属性(读取“deep”)

2022-01-23
15942

升级 vue 到 3.x 后,控制台报错:

Uncaught TypeError: Cannot read properties of undefined (reading 'deep')
    at withDirectives (commons1.js:10679:17)
    at Proxy.render (eval at compileToFunction (commons1.js:40198:21), <anonymous>:36:7)
    at renderComponentRoot (commons1.js:7874:44)
    at ReactiveEffect.componentUpdateFn [as fn] (commons1.js:11968:57)
    at ReactiveEffect.run (commons1.js:5819:29)
    at setupRenderEffect (commons1.js:12094:9)
    at mountComponent (commons1.js:11877:9)
    at processComponent (commons1.js:11835:17)
    at patch (commons1.js:11436:21)
    at render (commons1.js:12579:13)

不知道怎么回事,应该是兼容问题,不知道哪里出错了,从输出的 js 中找不到出错的行(从这个错误中找不到源代码中哪里出错了),代码如下:

/**
 * Adds directives to a VNode.
 */
function withDirectives(vnode, directives) {
    const internalInstance = currentRenderingInstance;
    if (internalInstance === null) {
        ( true) && warn(`withDirectives can only be used inside render functions.`);
        return vnode;
    }
    const instance = internalInstance.proxy;
    const bindings = vnode.dirs || (vnode.dirs = []);
    for (let i = 0; i < directives.length; i++) {
        let [dir, value, arg, modifiers = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ] = directives[i];
        if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dir)) {
            dir = {
                mounted: dir,
                updated: dir
            };
        }
        // here throw the error message
        if (dir.deep) {
            traverse(value);
        }
        bindings.push({
            dir,
            instance,
            value,
            oldValue: void 0,
            arg,
            modifiers
        });
    }
    return vnode;
}

运行到 dir.deep 行时,报错,请问该怎么解决?我试着用 Google 搜索,好像没人遇到同样的问题。

3个回答

我今天遇到了这个问题,我发现问题出在我试图使用一个未注册的指令。

如果你在错误发生之前的调用处放置一个断点,在你的情况下 at Proxy.render (eval at compileToFunction (commons1.js:40198:21), <anonymous>:36:7) 你会发现类似 const _directive_focus = _resolveDirective("focus"); 的东西,然后你就知道你缺少什么指令了

José Varela
2022-02-06

输入错误时错误消息会误导您!

对我来说,这是 v-model 中的拼写错误

<input type="text" class="form-control" v-moel="newUser.name">

在我将拼写错误 v-moel 修复为 v-model 后,问题得到了解决。

我另一次遇到此错误是因为再次输入错误:

<div v-esle class="alert alert-warning">
    ...
</div>

因此,结论是,在检查其他任何内容之前, 确保您没有输入错误

eylay
2022-05-21

我在 Vue3 上遇到了同样的错误。您必须在挂载之前向应用程序添加指令。

creatApp(X).directive('Y',{...}).mount('#Z')
Farshid Ghiasimanesh
2022-08-03