Vue组件通信$attrs、$listeners实现原理解析


Posted in Javascript onSeptember 03, 2020

前言

vue通信手段有很多种,props/emit、vuex、event bus、provide/inject 等。还有一种通信方式,那就是$attrs和$listeners,之前早就听说这两个api,趁着有空来补补。这种方式挺优雅,使用起来也不赖。下面例子都会通过父、子、孙子,三者的关系来说明使用方式。

Vue组件通信$attrs、$listeners实现原理解析

$attrs

官方解释:

包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class和style除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class和style除外),并且可以通过v-bind="$attrs"传入内部组件——在创建高级别的组件时非常有用。

我的理解:

接收除了props声明外的所有绑定属性(class、style除外)

图解:

Vue组件通信$attrs、$listeners实现原理解析

由于child.vue 在 props 中声明了 name 属性,$attrs 中只有age、gender两个属性,输出结果为:

{age: "20",gender: "man"}

Vue组件通信$attrs、$listeners实现原理解析

另外可以在 grandson.vue 上通过 v-bind="$attrs", 可以将属性继续向下传递,让 grandson.vue 也能访问到父组件的属性,这在传递多个属性时会显得很便捷,而不用一条条的进行绑定。

如果想要添加其他属性,可继续绑定属性。但要注意的是,继续绑定的属性和 $attrs 中的属性有重复时,继续绑定的属性优先级会更高。

$listeners

官方解释:

包含了父作用域中的 (不含.native修饰器的)v-on事件监听器。它可以通过v-on="$listeners"传入内部组件——在创建更高层次的组件时非常有用。

我的理解:

接收除了带有.native事件修饰符的所有事件监听器

图解:

Vue组件通信$attrs、$listeners实现原理解析

parent.vue中对 child.vue 绑定了两个事件,带有.native的 click 事件和一个自定义事件,所以在 child.vue 中,输出$listeners的结果为:

{ customEvent: fn }

Vue组件通信$attrs、$listeners实现原理解析

同 attrs 属性一样,可以通过 v-on="$listeners",将事件监听器继续向下传递,让 grandson.vue 访问到事件,且可以使用 $emit 触发 parent.vue 的函数。

如果想要添加其他事件监听器,可继续绑定事件。但要注意的是,继续绑定的事件和 $listeners 中的事件有重复时,不会被覆盖。当 grandson.vue 触发 customEvent 时,child.vue 和 parent.vue 的事件都会被触发,触发顺序类似于冒泡,先到 child.vue 再到 parent.vue。

使用场景:

组件传值时使用: 爷爷在父亲组件传递值,父亲组件会通过$attrs获取到不在父亲props里面的所有属性,父亲组件通过在孙子组件上绑定$attrs 和 $listeners 使孙组件获取爷爷传递的值并且可以调用在爷爷那里定义的方法;

对一些UI库进行二次封装时使用:比如element-ui,里面的组件不能满足自己的使用场景的时候,会二次封装,但是又想保留他自己的属性和方法,那么这个时候时候$attrs和$listners是个完美的解决方案。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
构造函数+原型模式构造js自定义对象(最通用)
May 12 Javascript
纯js实现重发验证码按钮倒数功能
Apr 21 Javascript
实现placeholder效果的方案汇总
Jun 11 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
Jan 26 Javascript
下一代Bootstrap的5个特点 超酷炫!
Jun 17 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
BootStrap Table 获取同行不同列元素的方法
Dec 19 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
prototype.js简单实现ajax功能示例
Oct 18 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
Mar 24 Javascript
javascript中join方法实例讲解
Feb 21 Javascript
JS实现移动端在线签协议功能
Aug 22 Javascript
Vue父组件监听子组件生命周期
Sep 03 #Javascript
JavaScript 几种循环方式以及模块化的总结
Sep 03 #Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 #Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
Sep 02 #Javascript
Vue 组件的挂载与父子组件的传值实例
Sep 02 #Javascript
vue中的.$mount('#app')手动挂载操作
Sep 02 #Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 #Javascript
You might like
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
jQuery获取同级元素的简单代码
2016/07/09 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
vue项目中使用Svg的方法
2018/10/24 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
Python自定义简单图轴简单实例
2018/01/08 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
python数据归一化及三种方法详解
2019/08/06 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
Python3 集合set入门基础
2020/02/10 Python
Python turtle库的画笔控制说明
2020/06/28 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
自主招生自荐信指南
2014/02/04 职场文书
新年团拜会主持词
2014/04/02 职场文书
《菜园里》教学反思
2014/04/17 职场文书
个人自荐材料
2014/05/23 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
坎儿井导游词
2015/02/09 职场文书
前台岗位职责范本
2015/04/16 职场文书
趣味运动会简讯
2015/07/20 职场文书
django上传文件的三种方式
2021/04/29 Python
总结一些Java常用的加密算法
2021/06/11 Java/Android