当前位置: 首页 > news >正文

Vue3+el-menu 递归 emit失效

背景:添加快捷菜单功能,用到了递归组件。在最后一层添加按钮,点击时触发emit,在父组件中监听自定义事件。但自定义事件未执行。

代码:

// 父组件
<el-menu><quick-menu-item v-for="routes in menuList" :key="routes.id" :item="routes" @clickBtn="getItem" />
</el-menu>const getItem = item => {console.log('getItem', item)
}// 子组件 QuickMenuItem.vue
<template><el-sub-menu v-if="props.item?.children?.length" :index="props.item.id"><template #title> {{ props.item.name }}</template><quick-menu-itemv-for="child in props.item?.children":key="child.id" :item="child" /></el-sub-menu><el-menu-item v-else>{{ props.item.name }}<el-button link @click="clickBtn(props.item)">点击</el-button></el-menu-item>
</template>const emit = defineEmits(['clickBtn'])
const clickBtn = item => {emit('clickBtn', item)
}

首先,如上述代码,直接emit,getItem() 方法并未执行。

其次,借鉴了 vue2 递归组件中,加 v-on="$listeners",可实现功能。vue3 $listeners 被移除,合并到$attrs身上。做了如下尝试:

<quick-menu-item 
    v-for="child in props.item?.children" 
    :key="child.id" 
    :item="child" 
    v-bind="$attrs" 
/>

然而很遗憾,同样未执行getItem() 方法。

最后,直到看到有个回答说直接写,直接写?

<quick-menu-item v-for="child in props.item?.children":key="child.id":item="child" @clickBtn="clickBtn"
/>

 结果,getItem() 方法 成功执行。事情解决。

思考:如果有多个事件需要触发,有没有更好的方式?而非直接添加多个事件方式?

The end.


http://www.mrgr.cn/news/37786.html

相关文章:

  • C语言内存模型的五个核心区域
  • 【C++算法】栈
  • 【含文档】基于Springboot+微信小程序 的高校心理咨询系统(含源码+数据库+lw)
  • 灰度重心法求取图像重心
  • C/C++语言基础--C++运算符重载以及其重载限制
  • 设计模式 之 —— MVC模式
  • uniapp 通过标签生成海报
  • 如何在C++中使用Poppler库读取PDF文件(二)
  • 计算机知识科普问答--21(101-105)
  • ubuntu20.04系统安装zookeeper简单教程
  • 为什么这款智能在线派单软件成为行业首选?
  • rust的nutyp验证和validator验证数据的方法
  • Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架。它是 Spring 项目家族的一员,用于构建安全的 Java 应用程序。
  • 32 C 语言指针的长度与运算(指针加减整数、指针自增自减、同类型指针相减、指针的比较运算)
  • 【C++】 vector 迭代器失效问题
  • 复习linux网络编程
  • qt xml解析与处理
  • 使用asio 接收ps流代码并显示
  • WiFi无线连接管理安卓设备工具:WiFiADB
  • 高考技术——pandas使用