VUE之组件(父子与非父子通信)

组件组织

日常开发里,我们可以按照功能将一个网页拆分成很多个部分,每个部分就是一个组件。

在这里插入图片描述

父子组件通信

假设第二层组件想和第一层组件进行通信,分析其传值过程
1、(第一层向第二层传值):父组件通过props传值到子组件,如此便实现父子组件向下通信
2、(第二层向第一层传值):子组件通过触发自定义事件$emit向父组件传值,如此便实现了父子组件向上通信

在这里插入图片描述

跨级组件通信

假设第三层组件想和第一层组件进行通信
1、(第一层组件向第三层组件传值)---禁止第一层直接传值到第三层,需要逐层传递,即1→2→3,此时便
可以实现跨级组件向下通信
2、(第三层组件向第一层组件传值)---通过触发自定义事件将数据传递至第二层,然后第二层通过事件触
发传递至第一层,如此逐层传递,便可以实现跨级组件向上通信

在这里插入图片描述

兄弟组件通信

假设第三层组件想和同层的另一个组件进行通信。
如果还是逐层传递至第二层,再由第二层传递至第三层,此时代码量十分累赘复杂,这也不符合Vue的定义(Vue是一个
轻量级的视图层框架)

在这里插入图片描述

兄弟|非父子组件通信

通过使用事件中心,允许组件自由交流,这个集中式的事件中间件就是 Bus总线。

首先定义两个兄弟组件,如下所示
在这里插入图片描述

创建步骤

第一步(注册全局bus总线):创建一个Vue实例,将其赋值给Vue.prototype.bus
在这里插入图片描述
第二步:通过中央事件线程 b u s , 分 发 事 件 属 性 bus,分发事件属性 busemit
在这里插入图片描述
第三步:结合生命周期钩子监听和接收分发的事件,监听事件属性$on。

在这里插入图片描述
结合生命周期钩子监听和接收分发的事件,监听事件属性$on。
接下来修改数据

第四步:取消|清除监听事件,取消监听属性$off
日常开发里,为了避免不要的BUG,建议在使用bus时,加上清除监听操作,代码如下
在这里插入图片描述

如果需要监听多个组件,只需要更改 bus 的 eventName

在这里插入图片描述

跨级组件通信

使用$attrs和$listeners实现祖孙组件之间的数据传递,也就是多重嵌套组件之间的数据传递

祖父级:用于动态数据的绑定与事件的定义
父级:通过设置v-bind=" a t t r s " 和 v − o n = " attrs" 和v-on=" attrs"von="listeners"来充当中间人
孙子级:通过 a t t r s 和 attrs和 attrslisteners来获取数据和事件

跨级组件通信自下而上

$emit逐层上传

在这里插入图片描述
通过$listeners接收事件
在这里插入图片描述

VUE之组件(插槽slot与可复用组件)

插槽slot

首先创建个基础组件,然后在页面调用显示,如下所示
在这里插入图片描述

父组件传递写法

父组件通过属性形式向子组件传值,即父传子借助props属性向下传值
在这里插入图片描述

缺点

上述代码虽然可以解决问题,但缺点也很明显
在这里插入图片描述

插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性;插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制

插槽

插槽分类有很多种,本节将一一介绍
(1)单个插槽/默认插槽
(2)具名插槽
(3)作用域插槽
(4)解构插槽
出现缘由:
最初在 标签中的任何内容都被视为备用内容。
备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容。

单个插槽(备胎插槽)

宿主元素不为空时,显示宿主元素里内容,不显示备用内容

在这里插入图片描述
宿主元素为空时,显示备用内容
在这里插入图片描述

具名插槽slot

在子组件中定义了三个slot标签,其中有两个分别添加了name属性header和footer。即通过给slot添加name属性,
来指定当前slot的名字

在这里插入图片描述
第二步,多个插槽可以有不同的名字。具名插槽将匹配内容片段中有对应 slot 特性的元素
在这里插入图片描述

作用域插槽slot

作用域插槽为Vue2.1.0版本新增,是一种特殊类型的插槽,用作一个 (能被传递数据的) 可重用模板,来代替已经渲
染好的元素。
父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。
不过,我们可以在父组件中使用 slot-scope 特性从子组件获取数据。前提是需要在子组件中使用 :data=data 先传递 d
ata 的数据。

传递数据:在子组件中使用 :data=data 先传递 data 的数据
在这里插入图片描述
获取数据:在父组件中使用 slot-scope 特性从子组件获取数据
在这里插入图片描述

注意

(1)在父级中,具有特殊特性 slot-scope 的 元素必须存在,表示它是作用域插槽的模板(在 2.5.0+,slot-scope 能被用在任意元素或组件中而不再局限于 )。
(2)slot-scope 的值将被用作一个临时变量名,此变量接收从子组件传递过来的 prop 对象
(3)在子组件中,只需将数据传递到插槽,就像你将 prop 传递给组件一样,接下来父组件中使用 slot-scope 特性从子组件获取数据

解构插槽slot

v-slot 的值实际上可以是任何能够作为函数定义中的参数的 JS表达式。所以在支持的环境下 (单文件组件或现代浏览器),
你也可以使用 ES2015 解构来传入具体的插槽 prop,如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值