Vue 子组件被不断销毁和重建

2020-07-16 18:06:51 +08:00
 zhiqiang

vue 中,组件 parent 引用了子组件 sub:

<template>
    <div @click="ajax">
    	<sub :xxx="xxx" />
    </div>
<template>

点击后会有一些ajax拉取数据的操作,但和xxx变量无关,这时候可以观察到sub组件被不断重建和销毁(在 sub 的destroyedcreated里写console.log输出)。

但我确保xxx没有发生变动。在parentwatch: { xxx() {console.log('xxx changed'); }} 也看不到输出。

请问可能是什么原因导致这个?

2926 次点击
所在节点    Vue.js
13 条回复
ChanKc
2020-07-16 18:13:40 +08:00
ajax 的一开始触发了一个 v-if 销毁,回调再生成
jklopsdfw
2020-07-16 18:14:33 +08:00
不如在 parent 组件的 destroyed 里也打印一下
ChanKc
2020-07-16 18:16:29 +08:00
#1 换成数组 v-for 也有可能
zhiqiang
2020-07-16 18:24:50 +08:00
@jklopsdfw parent 没有 created 和 destroyed,试过了。
zhiqiang
2020-07-16 18:25:27 +08:00
@ChanKc sub 没有 v-if
ljpCN
2020-07-16 18:34:07 +08:00
建议贴出源码或者提供一个最小 demo
zhiqiang
2020-07-16 18:37:42 +08:00
@ljpCN 抱歉,整个代码比较大,而且这种 bug 看上去不是简单 bug,我也没法搞一个出来。发出来看看大家有没有遇到同样情况,然后给点提示。

一些点:

* sub 内部递归调用了 parent 组件。
* sub 和 parent 都 mixins 了同一个东西。

除了 sub 被不断销毁和重建,其它功能和显示都正常。
zhiqiang
2020-07-16 18:45:39 +08:00
还有一个诡异的情况,如果切换到 Vue 调试窗口( chrome 开发模式),展开到接近 parent 组件,这种情况就会消失。而且之后再也不会出现。

但关掉开发者模式再刷新,现象仍然继续。

感觉像 sub 这个组件被垃圾回收了一样。
XiaoxiaoPu
2020-07-16 18:50:01 +08:00
@zhiqiang sub 的代码需要简单提供下吧。按你提供的信息:「 sub 内部递归调用了 parent 组件」,那 sub 内肯定有类似 v-if v-for 的东西(不然会死循环),“不断重建和销毁的 sub 组件” 可能是更内层的组件。
cuzfinal
2020-07-16 18:50:23 +08:00
给 div 写一个固定的 key
zhiqiang
2020-07-16 18:52:04 +08:00
@XiaoxiaoPu sub 内肯定有 if-else,但我确信销毁重建的的就是 sub 组件本身。
zhiqiang
2020-07-16 18:53:44 +08:00
@cuzfinal 我给 div 和 sub 都加上了 key,不起效果。
BreadKiller
2020-07-17 10:12:46 +08:00
把 sub 内的逻辑精简一下,比如删除 for if else,看看还有没有问题,如果还是有问题估计问题就出在 parent 上了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690669

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX