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 相关文章推荐
HTML中Select不用Disabled实现ReadOnly的效果
Apr 07 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
js解析json读取List中的实体对象示例
Mar 11 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
javascript实现页面滚屏效果
Jan 17 Javascript
微信小程序实现购物页面左右联动
Feb 15 Javascript
vue项目中使用scss的方法步骤
May 16 Javascript
bootstrap Table实现合并相同行
Jul 19 Javascript
js获取 gif 的帧数的代码实例
Sep 10 Javascript
微信小程序实现蒙版弹出窗功能
Sep 17 Javascript
Vue环境搭建+VSCode+Win10的详细教程
Aug 19 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 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
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
Dom与浏览器兼容性说明
2010/10/25 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
Python之re操作方法(详解)
2017/06/14 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
python实现浪漫的烟花秀
2019/01/30 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
Python如何解除一个装饰器
2020/08/07 Python
公司离职证明范本
2014/10/17 职场文书
搞笑老公保证书
2015/02/26 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
企业宣传语大全
2015/07/13 职场文书
初一语文教学反思
2016/03/03 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android