阿全uniapp
阿全uniapp
  • 发布:2024-04-19 13:20
  • 更新:2024-04-20 10:47
  • 阅读:113

【报Bug】子组件生命周期事件不正常触发。

分类:uni-app

产品分类: uniapp/H5

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 11

HBuilderX类型: 正式

HBuilderX版本号: 4.08

浏览器平台: Chrome

浏览器版本: 123.0.6312.123

项目创建方式: HBuilderX

操作步骤:

测试步骤(每次页面后建议回到首页刷新再开始):
请按键按钮编号依次点击(数字为按钮编号)
注意观察点击3按钮时,会不会触发事件。
1->2->4->3 = 不会触发事件
1->2->5->3 = 不会触发事件
1->2->6->3 = 会触发事件(但是这个是会先卸载组件再创建一次组件,所以这个也不是很好。)
1->3 = 正常触发事件(但是这个是没有跳转到普通页面。这样也不行。)

预期结果:

能正常触发事件

实际结果:

不会正常触发事件

bug描述:

应该是全端都有问题。主要是组件的事件触发问题。具体请看测试DEMO。这个问题比较难以讲明白。所以直接运行DEMO就明白了。

2024-04-19 13:20 负责人:无 分享
已邀请:
爱豆豆

爱豆豆 - 办法总比困难多

所以你的问题是
1->2->4->3和1->2->5->3的时候主页的子组件并没有触发销毁相关的生命周期 对吧?
页面关闭时 主动销毁子组件 你试试下面的方式 是不是你想要的效果

  • 阿全uniapp (作者)

    感谢提供思路。这也是一个解决方案。不过最好是能自动触发事件。目前暂时选这样处理吧。

    2024-04-19 14:08

BeardYound

BeardYound

组件又没有显示和隐藏事件,只要最开始加载的事件,可以父级子级创建一个显示和隐藏方法,然后父级显示隐藏切换不同组件使用ref调用子组件的方法

  • 阿全uniapp (作者)

    兄弟,你可能没看明白,@爱豆豆 的图片是一个PAGE页,这个页面是有页面事件的。而且你说的是啥意思,我也没太明白。我的问题是组件的事件触发有问题。而不是页面事件有问题。因为我的子组件中有大量的销毁事件,也就是说,在这个PAGE中,调用了很多子组子,而有些子组件需要在销毁时作一些处理。而我遇到的是没有触发这些销毁事件。明白了吗

    2024-04-20 10:42

  • 阿全uniapp (作者)

    回复 爱豆豆: 应该不行,一定要是销毁事件才可以,因为子组件中,还有其它更多子组件,都是监听的销毁事件,不可能每一个都去这样调用,太不合理,也太麻烦,而且正常情况下,这样处理,就会多次执行销毁的动作。

    2024-04-20 11:04

  • 爱豆豆

    回复 阿全uniapp: 还是用if吧 最简单

    2024-04-20 11:05

  • 阿全uniapp (作者)

    我之前想的也是最后实再没办法才像你说的这样去做,但是你上面那个方案就很好,我只需要在PAGE中,稍微改一点就实现了。

    2024-04-20 11:06

  • 爱豆豆

    回复 阿全uniapp: 对的 通过ref控制的话 也能实现 但是不太适合你需求了

    2024-04-20 11:07

  • 阿全uniapp (作者)

    回复 爱豆豆: 嗯。是的。因为我的子组子还有很多,有些还是renderjs组件。这个页面比较复杂。renderjs层也有这个事件的监听。而且还是公用组件。所以,没办法一个一个的去处理。太麻烦。这本身应该算是一个BUG。而且正常情况是可以销毁的。

    2024-04-20 11:17

  • BeardYound

    回复 阿全uniapp: 组件销毁使用destroyed事件反正组件data同级

    2024-04-20 16:14

l***@3975.com

l***@3975.com

组件 mounted(){
this.$root.$on('hook:onShow', this.handleShow);
this.$once('hook:beforeDestroy', () => {
this.$root.$off('hook:onShow', this.handleShow);
});
this.handleShow换成要执行的代码逻辑试试
}

  • 阿全uniapp (作者)

    首先感谢回答,你这个方法应该行不通beforeDestroy事件你是在哪里调用的?我是要在组件中调用。而不是PAGE上。但问题是组件中不会触发这个事件。

    2024-04-20 10:51

  • 阿全uniapp (作者)

    我使用爱豆豆提供的方案解决的,直接在卸载页面时,将子组件使用v-if控制,这样就触发了。

    2024-04-20 10:53

要回复问题请先登录注册