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交换排序 冒泡排序算法(Javascript版)
Oct 04 Javascript
JavaScript中Boolean对象的属性解析
Oct 21 Javascript
javascript RegExp 使用说明
May 21 Javascript
bootstrap读书笔记之CSS组件(上)
Oct 17 Javascript
addEventListener()与removeEventListener()解析
Apr 20 Javascript
Scala解析Json字符串的实例详解
Oct 11 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
Feb 16 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
Aug 24 Javascript
vue+element+Java实现批量删除功能
Apr 08 Javascript
Vue 列表上下过渡效果的实例代码
Jun 25 Javascript
JavaScript实现HTML导航栏下拉菜单
Nov 25 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
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
python中对list去重的多种方法
2014/09/18 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
Python对列表的操作知识点详解
2019/08/20 Python
python线程里哪种模块比较适合
2020/08/02 Python
Django权限控制的使用
2021/01/07 Python
运动会入场词200字
2014/02/15 职场文书
大学社团计划书
2014/05/01 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
求职自我评价范文100字
2014/09/23 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript