我在写一个弹窗组件,父组件通过 ref 拿到子组件实例,子组件又通过 props 拿到了父组件的引用,页面切换后发现内存占用一直不降,是不是循环引用导致的?试过在 beforeUnmount 里手动置空,但好像没用。
<template>
<ChildModal ref="modal" :parent="this" />
</template>
<script>
export default {
methods: {
open() {
this.$refs.modal.show();
}
}
}
</script>
this相当于把整个父组件实例塞给子组件,互相持有引用,GC 根本收不掉。正确的做法是别传
this,父子通信用 emit,子组件要调父组件方法就暴露特定函数:子组件:
如果必须让父组件调子组件方法,用
defineExpose暴露具体方法,别暴露整个实例。页面切换时 Vue 会自动清理组件,但互相持有引用就GG。