首页 > 其他分享 >vue3页面中,两个相同组件,一个卸载,一个挂载,后展示的组件事件监听不生效?

vue3页面中,两个相同组件,一个卸载,一个挂载,后展示的组件事件监听不生效?

时间:2023-11-30 11:24:07浏览次数:40  
标签:console log vue3 window 卸载 组件 挂载

场景:在实际开发中,遇到了这样一种场景,vue3页面,两个相同组件,在满足某条件下展示第一个组件,满足另一个条件下,隐藏第一个组件,同时展示第二个组件,比如反馈组件,会通过 window.addEventListener 来监听自定义的反馈弹窗展示和隐藏事件。

结果:两个相同组件一个卸载,一个挂载,第一个组监听的反馈弹窗展示和隐藏事件都可以生效,后展示的组件事件监听都不生效.....

示例如下:

<script lang="ts" setup>
import { onBeforeUnmount } from 'vue'

window.addEventListener('feedbackShow', () => {
    console.log('反馈弹窗出现')
})

window.addEventListener('feedbackHide', () => {
    console.log('反馈弹窗消失')
})


onBeforeUnmount(() => {
  window.removeEventListener('feedbackShow')
  window.removeEventListener('feedbackHide')
})

</script>

分析:

通过打印日志,跟踪组件的挂载、卸载时机,发现  同时卸载的组件,onBeforeUnmount 的执行时机会晚于  同时挂载组件  的 setup 时机,从而导致第二次挂载的组件的新监听的事件被第一次组件的事件卸载一次性remove 了,所以导致后一个组件的事件监听不生效。

解决:

同时卸载和挂载两个相同的组件,关于执行时机,遇到了两种场景:

<script lang="ts" setup>
import { onBeforeMount, onMounted, onBeforeUnmount,onUnmounted  } from 'vue'

console.log('反馈setup', props.name)

onBeforeMount(() => {
  console.log('反馈onBeforeMount', props.name)
})

onMounted(() => {
  console.log('反馈onBeforeMount', props.name)
})


onBeforeUnmount(() => {
  console.log('反馈onBeforeUnmount', props.name)
})


onUnmounted(() => {
  console.log('反馈onUnmounted', props.name)
})

</script>

 

卸载的挂件,onBeforeMount 既有在挂载组件的 setup 之前的情况,也有之后的情况,卸载组件的 onUnmounted 既有在挂载组件的 onMounted 之前,也有可能在挂载组件的 onMounted 之后,总而言之,onBeforeMount 和 onUnmounted 都一定在新挂载组件 setup 之后,所以当遇到挂件监听和卸载事件的情况时,事件监听一定要写在 onMounted 钩子里即可保证不被 remove。

 最终:

<script lang="ts" setup>
import { onMounted, onBeforeUnmount } from 'vue'

onMounted(()) => {
    window.addEventListener('feedbackShow', () => {
       console.log('反馈弹窗出现')
    })

    window.addEventListener('feedbackHide', () => {
       console.log('反馈弹窗消失')
    })
})


onBeforeUnmount(() => {
  window.removeEventListener('feedbackShow')
  window.removeEventListener('feedbackHide')
})

</script>

 

标签:console,log,vue3,window,卸载,组件,挂载
From: https://www.cnblogs.com/beileixinqing/p/17866884.html

相关文章

  • 关于vue中的动态组件component和keep-alive
    component标签是vue内置的,作用:组件的占位符<componentis="组件名称"></component>其中is属性的值表示要渲染的组件的名字,也就是components节点下的组件名称当我们动态切换组件名称时,每切换一次,组件就会被销毁一次,若不想让组件被销毁,则需要用到标签keep-alive<keep-al......
  • SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel
    前言:作者查阅了Sentinel官网、51CTO、CSDN、码农家园、博客园等很多技术文章都没有很准确的springmvc集成Sentinel的示例,因此整理了本文,主要介绍SpringMvc集成SentinelSpringMvc集成Sentinel一、Sentinel介绍随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel......
  • Vite4+Typescript+Vue3+Pinia 从零搭建(5) - 路由router
    项目代码同步至码云weiz-vue3-templateVueRouter是Vue.js的官方路由。它与Vue.js核心深度集成,让用Vue.js构建单页应用变得轻而易举。1.安装npmivue-router@42.集成1.新建两页面进行示例在src/view下新建home.vue和login.vue,内容如下:<scriptsetuplang="t......
  • React 受控和非受控组件
    无论你做什么,都要相信自己可以做到,因为你的潜力是无限的。把父组件的状态变成属性传递给子组件,子组件接受这个属性,听命于父组件。这个子组件就是叫做受控组件。在受控与非受控组件有两种理解方案,第一:狭义上的受控与非受控,就是我们在表单中的受控与非受控组件。第二:广义上的受控......
  • vue3+vite 代码混淆插件 | JavaScript obfuscator
    安装插件yarnadd--devrollup-plugin-javascript-obfuscator创建obfuscator.js文件,把下面相应代码放入js文件中importobfuscatorPluginfrom'rollup-plugin-javascript-obfuscator';exportfunctioncodeObfuscatorPlugin(isBuild){if(!isBuild){return[];}......
  • vue3 reactive对象的watch
    代码<scriptsetup>import{ref,reactive,watch}from'vue'constobj=reactive({count:0})constyourKnow0=ref('')constyourKnow1=ref('')letcnt=0watch(obj,(newValue,oldValue)=>{//在嵌套的属性变更时触发......
  • vue2和vue3项目并存时,下载nvm管理nodejs
    1、下载nvm  1)下载一个1.19版本以上的nvm,在执行“npminstall”时报错“npmERR!Unexpectedtoken'.'”。。https://blog.csdn.net/qq_25286361/article/details/1328999372)在nvm/setting.txt中,加入node_mirror:https://npm.taobao.org/mirrors/node/......
  • vue3结构赋值失去响应式引发的问题思考
    前言vue3是基于proxy实现响应式的能力,解决了vue2所遗留下来的一些问题,同时也正由于proxy的特性,也提高了运行时的性能凡事有利有弊,proxy虽然无敌,但是他也有本身的局限,从而产生一些认为的弊端原始值的响应式系统的实现导致必须将他包装为一个对象,通过.value的方式访......
  • Vue3 + Express 实现大文件分片上传、断点续传、秒传
    前言在日常开发中,文件上传是常见的操作之一。文件上传技术使得用户可以方便地将本地文件上传到Web服务器上,这在许多场景下都是必需的,比如网盘上传、头像上传等。但是当需要上传比较大的文件的时候,容易碰到以下问题:上传时间比较久;中间一旦出错就需要重新上传;一般服务端会对......
  • Hadoop三大组件(HDFS,MapReduce,Yarn)
    1、HDFSHDFS是Hadoop分布式文件系统。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。2、MapReduceMapReduce是一个软件框架,基于该框架能够容易地编写应用......