小妙招——dispatchEvent自定义事件

dispatchEvent大家可能接触过,同步派发一个事件,在异步事件之后进行执行。

此处以一个代码片段为例,简单说明一下使用。

javascript 复制代码
<button id="btn">按下按钮</button>
let myBtn = document.querySelector('#btn');
myBtn & myBtn.addEventListener('click', function(){
    document.dispatchEvent(new CustomEvent('clickAfter', {
        detail: {
            more: 'more-info',
            anyKey: 'any key info'
        }
    }))
})
document.addEventListener('clickAfter', (event) => {
    console.log('event', event)
})

点击之后的截图如下

之前在做一个功能(Vue3)的时候,产品忽然想要加一个点击上报。但是因为功能比较复杂,当时拆了好几个组件进行嵌套,关系如下,组件有些数据传递是爷孙之间互传。

即实现组件A和组件C之间的通信

方法一:多次emit()

通过emit一层层传递,A先emit()到B,再emit()到C。

组件A- componentA

javascript 复制代码
<template>
<button @click="onClickAfter">按下点击</button>
</template>
<script lang="ts" setup>
const emit = defineEmits(['onClickAfter'])
const onClickAfter = () => {
 emit('onClickAfter', 12, {p1:12, p2:'click'})
}
</script>

组件B-componentB

javascript 复制代码
<template>
<ComponentA @on-click-after="continueTransfer"></ComponentA>
</template>
<script lang="ts" setup>
const emit = defineEmits(['onToNext'])
const continueTransfer = (firstParams, other) => {
 emit('onToNext', firstParams, other)
}
</script>

组件C-componentC

javascript 复制代码
<template>
<ComponentB @on-to-next="finalReport"></ComponentB>
</template>
<script lang="ts" setup>
const finalReport = (firstParams, other) => {
 console.log('report', firstParams, other)
}
</script>

方法二:dispatchEvent

在A中进行一个dispatchEvent,自定一个事件(new CustomEvent),然后在C中进行监听刚刚自定义的事件即可 组件A- componentA

javascript 复制代码
<template>
<button @click="onClickAfter">按下点击</button>
</template>
<script lang="ts" setup>
const onClickAfter = () => {
    document.dispatchEvent(new CustomEvent('clickAfter', {
        detail: {
            activiyId: 12,
            params: {p1:12, p2:'click'}
        }
    }))
}
</script>

组件C- componentC

javascript 复制代码
<script lang="ts" setup>
onMounted(()=>{
    document.addEventListener('clickAfter', (event) => {
        console.log('event', event)
    })
})
</script>

如果是一个简单的事件,其实完全可以直接使用dispatchEvent,避免了一层层父子通信的麻烦~~~

🔗参考链接

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄5 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95275 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大5 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师5 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端