开发者问题收集

[Vue warn]: nextTick 中出错:“NotFoundError: 无法在‘Node’上执行‘insertBefore’

2018-08-02
19257

我偶尔会在我的 Vue Web 应用中收到以下错误消息,但当它发生时,它会完全停止我的应用。

错误消息 1:

[Vue warn]: Error in nextTick: "NotFoundError: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node."

错误消息 2:

DOMException: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.

错误消息 1 的堆栈跟踪:

在此处输入图片说明

错误消息 2 的堆栈跟踪:

在此处输入图片说明

根据堆栈跟踪,我已确定是仪表板组件中的 setListingFromCoords() 方法导致了该问题。问题也不在于 vuex“getListingsFromCoords”操作,因为“data”已正确通过 console.logged 记录了正确的信息。此外,data.results 也已正确填充。 根据堆栈跟踪,问题出在 this.listings = data.results

以下是我的 setListingFromCoords() 方法,该方法位于仪表板组件中:

setListingFromCoords() {
    return new Promise((resolve, reject) => {
        this.$store.dispatch(
            "getListingsFromCoords"
        ).then((data) => {
            console.log(data); // "data" is returned correctly here
            this.listings = data.results; // CODE BREAKS HERE
            this.previous = data.previous;
            this.hasPrevious = data.hasPrevious;
            this.next = data.next;
            this.hasNext = data.hasNext;
            resolve();
        }).catch((err) => {
            reject(err);
        });
    });
},

在我的仪表板组件的模板部分中,我有一个以下卡片组件,该组件根据上述 setListingFromCoords 方法返回的列表数量进行了 v-for 处理。这是唯一依赖 listings 的组件,这让我相信这部分以某种方式导致 Vue 抛出错误。

<card
    v-for="(listing, index) in listings"
    v-bind:index="index"
    v-bind:key="listing._id">
</card>

有人可以确认我的结论是否合理/正确吗?此外,我该如何修改代码以解决此问题,为什么会抛出此错误?

3个回答

我在使用 vue-router 时遇到了类似的问题,结果是我将 <router-view /> 包装在 vue-fragment 中。

编辑

此问题出现在 vue-fragment v1.5.2 中,请将软件包降级至 v1.5.1。

并且正如 @jai-kumaresh 提到的,删除 package.json 中的 ^ "vue-fragment": "^1.5.1" ,以便 npm 仅安装完全相同的版本。

编辑 十月2021

Vue 3 ,则不再需要 vue-fragment 包,现在您可以将多个元素直接添加到根元素。

Ammar Oker
2020-10-08

以下内容来自 VueJS 核心团队成员 @LinusBorg:

The error message itself is a DOM exception where Vue tried to insert an element before another one, but that element doesn’t exist anymore in the DOM.

Combined with the information you provided I would assume that Vue tries to insert an element before another one in the DOM that was previously created by the v-for - in other words, Vue is trying to patch the existing list of elements with what it thinks are changes necessary to reflect the change in the list, and fails,

I can’t see anything directly causing this error, my only suspicion would be that maybe you have a duplicate listing._id?

他的怀疑是正确的。我的仪表板组件中有一个重复的键,这导致了错误。

ptk
2018-08-02

我在Vue Slick Slider上也有类似的问题:在我的情况下,解决方案是替换 v-if 指令,该指令用 v-show 指令。一开始,我还删除了正在生成幻灯片的循环中的 ,但最终我能够再次使用键。

Giorgio Tempesta
2020-01-16