最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Vue 组件通信如何实现侧边栏抽屉通过 Emit 回传遮罩层点击关闭通知
时间:2026-08-10 17:34:49 编辑:袖梨 来源:一聚教程网
侧边栏抽屉通过 emit 通知父组件关闭遮罩层,核心是子组件触发事件、父组件监听并统一控制显隐状态;推荐用 v-model 实现双向绑定,抽屉内遮罩层 @click 触发 update:modelValue 事件,内容区需 @click.stop 防止冒泡,可选监听 Esc 键关闭。
侧边栏抽屉通过 emit 通知父组件关闭遮罩层,核心是子组件触发事件、父组件监听并控制显隐状态。关键在于父子职责分明:抽屉只负责“我被点了关闭”,不直接操作遮罩层;遮罩层的显示/隐藏由父组件统一管理。
父组件:用 v-model 或显式 props + events 控制开关
推荐使用 v-model 语义化双向绑定(本质是 value prop + input 或 update:modelValue 事件),更简洁清晰:
- 父组件传入
:model-value="drawerVisible",监听@update:model-value="val => drawerVisible = val" - 或传统写法:
:visible="drawerVisible"+@close="drawerVisible = false" - 遮罩层(
<div class="mask" v-show="drawerVisible">)与抽屉共用同一响应式变量
抽屉组件:在遮罩层点击时 emit 关闭事件
抽屉内部的遮罩层(通常为全屏半透明 div)应绑定 @click,并触发自定义事件:
- 模板中写:
<div class="drawer-mask" @click="$emit('update:modelValue', false)"></div> - 若用传统方式:
<div class="drawer-mask" @click="$emit('close')"></div> - 注意:确保遮罩层 z-index 高于抽屉内容,且点击区域覆盖完整;避免内容区事件冒泡干扰
补充细节:阻止点击穿透与事件委托
如果抽屉内容区域点击也意外关闭,需阻止事件冒泡:
- 抽屉内容容器加
@click.stop,例如:<div class="drawer-content" @click.stop>... - 遮罩层本身不需要
.stop,它就是关闭触发源 - 不用
@click.self,因为遮罩层通常无子元素,且 self 对全屏 div 意义不大
可选增强:支持 Esc 键关闭
提升体验,抽屉挂载后监听 keydown.escape:
- 在
onMounted中添加:document.addEventListener('keydown', handleEsc) const handleEsc = (e) => e.key === 'Escape' && $emit('update:modelValue', false)- 别忘了
onUnmounted中移除监听,避免内存泄漏
相关文章
- 迅捷 FWR310 无线路由器端口映射设置指南 08-11
- 迅捷 FW150R 无线路由器端口映射设置指南 08-11
- 迅捷 FWD105 无线路由器一体机WDS桥接设置 08-11
- 迅捷 FW325R 无线路由器IP与MAC地址绑定设置 08-11
- 方舟生存进化琥珀获取指南 08-11
- 迅捷 FW150R 无线路由器作为交换机设置 08-11