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 相关文章推荐
AJAX架构之Dojo篇
Apr 10 Javascript
使用javascript为网页增加夜间模式
Jan 26 Javascript
详谈JavaScript内存泄漏
Nov 14 Javascript
javascript实现博客园页面右下角返回顶部按钮
Feb 22 Javascript
七夕情人节丘比特射箭小游戏
Aug 20 Javascript
jQuery手机拨号界面特效代码分享
Aug 27 Javascript
详解javascript遍历方式
Nov 11 Javascript
js querySelector() 使用方法
Dec 21 Javascript
Js利用console计算代码运行时间的方法示例
Sep 24 Javascript
小程序视频列表中视频的播放与停止的示例代码
Jul 20 Javascript
浅谈React碰到v-if
Nov 04 Javascript
vue-router beforeEach跳转路由验证用户登录状态
Dec 26 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
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
JavaScript实现多态和继承的封装操作示例
2018/08/20 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
python中from module import * 的一个坑
2014/07/20 Python
Python反射的用法实例分析
2018/02/11 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
Python返回数组/List长度的实例
2018/06/23 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
python 类之间的参数传递方式
2019/12/20 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
廉洁使者实施方案
2014/03/29 职场文书
机房搬迁方案
2014/05/01 职场文书
诚信承诺书模板
2014/05/26 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2014年法务工作总结
2014/12/11 职场文书
公司催款律师函
2015/05/27 职场文书
革命电影观后感
2015/06/18 职场文书
总结几个非常实用的Python库
2021/06/26 Python
Oracle用户管理及赋权
2022/04/24 Oracle