[Vue warn]: nextTick 中出错:“NotFoundError: 无法在‘Node’上执行‘insertBefore’
我偶尔会在我的 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>
有人可以确认我的结论是否合理/正确吗?此外,我该如何修改代码以解决此问题,为什么会抛出此错误?
我在使用
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
包,现在您可以将多个元素直接添加到根元素。
以下内容来自 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?
他的怀疑是正确的。我的仪表板组件中有一个重复的键,这导致了错误。
我在Vue Slick Slider上也有类似的问题:在我的情况下,解决方案是替换
v-if
指令,该指令用
v-show
指令。一开始,我还删除了正在生成幻灯片的循环中的
,但最终我能够再次使用键。