Vue 实现的递归组件如何向外传递事件和数据

一.递归组件向外传递数据直接用$emit是无法实现的。因为是递归的原因。

2.解决方法:

1方法1::用provide,inject方法实现。这种实现方法是实现爷爷组件和孙子组件通信的常用方法之一。但是逻辑上,爷爷组件和孙子组件之间是有耦合关系。如果组件封装需要尽量实现解耦,这种方式是有缺点的。

 

2.方法2:用eventBus实现:这种方法用在兄弟组件之间通信很常见。当然也可以用在爷爷组件和孙子组件之间的传递数据。

用这种方法实际上是用一个中介来传递数据,可以实现递归组件和使用它的组件之间的解耦。

来创建出我们的eventBus,我们把它命名为bus.js:

import Vue from 'vue';  
export default new Vue(); 

在递归组件和使用它的组件同时引入:

import Bus from 'common/js/bus.js';  

在递归组件里面触发事件:

methods: {  
   addCart(event) {  
   Bus.$emit('getTarget', event.target);   
   }  
}  

在使用递归组件的父组件里面监听事件:

created() {  
        Bus.$on('getTarget', target => {  
            console.log(target);  
        });  
}  

方法3:使用vuex方法,这种方法不加说明,肯定是可以实现的。缺点是:如果小项目,只是个别组件需要多级传递数据,引入vuex方法显然有点多余。

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Ant Design Vue 2.0 提供了一个递归组件 `a-tree`,可以用来实现递归菜单。 首先,需要在组件中引入 `a-tree` 组件: ```vue <template> <a-tree :tree-data="treeData"> <template v-slot="{data}"> <span>{{ data.title }}</span> </template> </a-tree> </template> <script> import { ATree } from 'ant-design-vue' export default { name: 'RecursiveMenu', components: { ATree }, data() { return { treeData: [ { title: 'Menu 1', key: '1', children: [ { title: 'Submenu 1-1', key: '1-1', children: [ { title: 'Sub-submenu 1-1-1', key: '1-1-1' }, { title: 'Sub-submenu 1-1-2', key: '1-1-2' } ] }, { title: 'Submenu 1-2', key: '1-2' } ] }, { title: 'Menu 2', key: '2', children: [ { title: 'Submenu 2-1', key: '2-1' }, { title: 'Submenu 2-2', key: '2-2' } ] } ] } } } </script> ``` 在 `treeData` 中定义了一个递归菜单的数据结构,其中每个菜单项都有一个 `title` 和一个 `key`,以及可能有 `children`,用于定义子菜单。在模板中,使用 `a-tree` 组件来渲染递归菜单,并使用插槽来定义每个菜单项的渲染方式。 在 `a-tree` 组件中,使用 `tree-data` 属性来传递菜单数据。在插槽中,使用 `data` 对象来获取当前菜单项的数据,其中包含菜单项的 `title`、`key`、`children` 等信息。 通过这种方式,就可以实现一个简单的递归菜单。需要注意的是,`a-tree` 组件本身提供了许多属性和事件,可以用来控制菜单的交互方式,例如菜单的展开、收起、选中等。具体使用方式可以参考 Ant Design Vue 2.0 官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值