Vue中 $attrs、$listeners使用和理解
前言
提示:Vue中 常见的组件通信方式可分为三类:
- 父子通信
通常父子传值都是 通过prpos,子组件通过events接收
通过父链/子链 通信($parent/$chldren);
ref也可以访问实例
provide/inject
$attrs/$listeners
- 兄弟通信
Bus;
Vuex
- 跨级通信
Bus;
Vuex;
provide/inject
$attrs/$listeners
一、前言
示例:多组件嵌套需要传递参数,通常使用vuex,但是如果只是传递数据,使用vuex不太合理,因为vuex实现的是两个组件两个值同步改变
故而Vue提供了另一种方法 使用v-bind=“$attrs”,将父组件不被认为props特性的属性传入子组件中,通常配合listeners选项一起使用,两个出现使组件之间跨组件通信不依赖vuex和bus变得简洁业务清晰
A组件跟b组件的通信:(父子组件)
如上图,abc分别是嵌套的,按照常规传参方式
- a->b通过props方式向子组件传递b->a通过在b组件中使用$emit,a组件v-on接收
- 通过全局设置vuex方式,通过computed计算属性和commit mutaion方式时间数据获取更新,达到父子通信目的
- Vue Event Bus 使用 Vue实例 实现事件监听发布,实现组件传值
一般数据不需要全局的情况父子传值 用第一种就可以解决
a组件与c组件通信(跨级组件嵌套关系)
- 使用b组件中转,a组件传递给b组件,b组件props接受再传递到c组件上,从下到上也是一次c组件emit传递,b也得emit传递,达到组件通信的效果
- 通过Vuex全局
- 使用Vue Event Bus实现监听和发布
- ps:如果只是祖先向子孙传递 不需要子孙返回 provide/inject 也可以解决
第一种方法会让代码显得冗余且不易于维护b组件只是中间站
第二种Vuex还是大材小用,只是组件数据传递,不是数据共享
第三种 如果不能很好的事件监听和发布管理 会导致数据流的混乱,不易于维护 ps:暂时没用过
第四种 只能达到向内传值 孙组件返不回去
知识点
个人理解就是 inheritAttrs 默认是true,他继承了父组件所有的属性(除了props特定的绑定) 如果不希望继承,可以改成false 但是class跟style不会受影响
attrs继承了父组件所有的属性 除了prop传递的属性,一般用在子组件的子元素
包含了负作用域所有的监听,可以配合v-on=“$listeners” 将所有事件监听器都指向组件特定子元素
实例
A组件(App.vue)
<template><div id="app"><!-- 此处监听了两个事件,可以在B组件或者C组件中直接触发 --><child1 :pchild1="child1" :pchild2="child2" :pchild3="child3" @method1="onMethod1" @method2="onMethod2"></child1></div>
</template><script>
import Child1 from "./Child1.vue";
export default {data() {return {child1:'1',child2: 2,child3:{name:'child3'}};},components: { Child1 },methods: {onMethod1(msg1) {console.log(`${msg1} running`);},onMethod2(msg2) {console.log(`${msg2} running`);},},
};
</script>
B组件(Child1.vue)
<template><div class="child-1"><h2>in child1</h2><p>props: {{ pchild1 }}</p><p>$attrs: {{ $attrs }}</p><hr/><!-- 通过 v-bind 绑定$attrs属性,C组件可以直接获取到A组件中传递下来的props(除了B组件中props声明的) --><!-- C组件中能直接触发test的原因在于 B组件调用C组件时 使用 v-on 绑定了$listeners 属性 --><child2 v-bind="$attrs" v-on="$listeners"></child2></div>
</template><script>
import Child2 from "./Child2.vue";
export default {data() {return {child1:'child1' };},components: { Child2 },props: {pchild1:{type:String}}, inheritAttrs: false,mounted() {this.$emit("method1",this.child1);},
};
</script>
C 组件 (Child2.vue)
<template><div class="child-2"><h2>in child2:</h2><p>props: {{ pChild2 }}</p><p>$attrs: {{ $attrs }}</p><p>pchild3Name: {{ $attrs.pchild3.name }}</p><hr/></div>
</template><script>
export default {data() {return {child2:'child2'};},props: {pChild2:{type:String,}},inheritAttrs: false,mounted() {this.$emit("method2",this.child2);},
};
</script>
效果
课后小故事
假设 A组件为 祖先 它入圣后给儿子(B组件
)留了三件宝物 佛怒唐莲,暴雨梨花针 虚无吞炎 并告诫子孙(C组件
)宝物不可外借他人,且必须滴血认亲 这三件宝物都可唤祖,在儿子入圣的时候担心万一到时候爷爷不认识孙子咋办,于是留下了自己的血attrs
,告诉他有了这个你就可以继承家产了,并且告诉他你不但可以继承家产你还可以醍醐灌顶速成入圣 listeners
,故而孙组件可以调用组件的方法并且获取祖先数据
借鉴引用:Vue中 attrs、attrs、attrs、listeners 详解及使用
Vue中 $attrs、$listeners使用和理解相关推荐
- [vue] 说说你对slot的理解有多少?slot使用场景有哪些?
[vue] 说说你对slot的理解有多少?slot使用场景有哪些? 通过插槽可以让用户可以拓展组件,去更好地复用组件和对其做定制化处理如果父组件在使用到一个复用组件的时候,获取这个组件在不同地方有少量 ...
- [vue] 说说你对vue组件的设计原则的理解
[vue] 说说你对vue组件的设计原则的理解 第一: 容错处理, 这个要做好, 极端场景要考虑到, 不能我传错了一个参数你就原地爆炸 第二: 缺省值(默认值)要有, 一般把应用较多的设为缺省值 第三 ...
- [vue] 说说你对keep-alive的理解是什么?
[vue] 说说你对keep-alive的理解是什么? keep-alive是Vue提供的一个抽象组件,用来对组件进行缓存,从而节省性能,由于是一个抽象组件,所以在页面渲染完毕后不会被渲染成一个DOM ...
- [vue] 说说你对proxy的理解
[vue] 说说你对proxy的理解 vue的数据劫持有两个缺点: 1.无法监听通过索引修改数组的值的变化 2.无法监听object也就是对象的值的变化 所以vue2.x中才会有$set属性的存在pr ...
- Vue关于$on和$emit的理解
Vue关于$on和$emit的理解 我们再项目中经常会遇到这么些情况,兄弟组件之间的传值. 比如说一个组件内的按钮触发了兄弟组件的<audio>标签,从而播放背景音乐.另一个组件触发了暂停 ...
- 理解vue中$watch使用
侦听组件实例上的响应式 property 或函数计算结果的变化.回调函数得到的参数为新值和旧值. 我们只能将顶层的 data.prop 或 computed property 名作为字符串传递.对于更 ...
- mockjs vue ajax,mockjs在vue中的使用
mockjs在vue中的使用 mockjs在vue中的使用 前后端分工协作是一个非常高效的做法,但是有时前后端分离不彻底会很痛苦.前后端应该是异步进行的,进度互不影响,但是在没有mock的时候,前端却 ...
- vue为p标签_通过vue.js几个基本操作,理解一下什么是插槽「606」
更多的文章,请关注我的头条号,我是落笔承冰. 一.先创建一个test1.html文件,还是得在head里链接vue的库. 二.创建一个父组件一个全局子组件. 三.给子组件添加模板吧,然后在父组件里显示 ...
- vue echarts div变化_数据可视化之echarts在Vue中的使用
数据可视化的本质是将数据通过各种视觉通道映射成图形,可以使得用户更快.更准确的理解数据. 一.为什么选择echarts: 简单上手容易 满足绝大部分的开发需要 在可视化库中有较好的体验和口碑 二.在V ...
最新文章
- Strutsw2与Spring整合流程-简述
- java intent 传递集合对象_Intent之对象传递(Parcelable传递对象和对象集合)
- opencv 阈值分割_CVPR2019实例分割Mask Scoring RCNN
- 常用知识总结——信号量
- SpringSecurity自定义登陆页面和跳转页面
- golang 示例测试example_go语言从例子开始之Example37.Go 状态协程
- Zabbix网络设备常用的SNMP OID
- python可迭代对象 迭代器生成器_第八章 Python可迭代对象、迭代器和生成器-阿里云开发者社区...
- 挂机平台android,红手指手游挂机平台
- OPPO发布首款折叠旗舰Find N, 产品+服务高端化布局并行
- Excel:带有相关单元格引用的Python xlwings复制粘贴公式
- 软件测试是什么工作状态,软件测试,现在主要的工作内容是干什么?
- HEVC学习-帧内预测-initAdiPattern函数
- 用树莓派都可以DIY“波士顿机器狗”!
- 《OpenDRIVE1.6规格文档》2
- 粒子群算法查找函数最小值
- 2021年氯化工艺复审考试及氯化工艺作业模拟考试
- 西安电子科技大学光学工程/电子信息(专业课代码851)考研经验分享
- linux查看磁带机端口,linux、unix下使用磁带机的常用命令
- python 从大到小循环_跟老齐学Python之关于循环的小伎俩
热门文章
- 正式转投C/C++门下
- 『开心乐园』[幽默笑话][精] 爆笑:把女友升级为老婆时发生的BUG!!!(转载)
- 真心喜欢一个人是种怎样的体验?
- CentOS 7下简单搭建个人博客——wordpress
- 快乐与您同在,让每个人都开心快乐每一天
- 性能优化之MySQL(Structured Query Languag)
- 这里才是原汁原味的老北京,有时间一定要去逛逛!
- 最新【独家沙龙内容整理】机器女友?—百度微软讯飞等顶级专家谈人机对话黑科技及未来 ——by中科院孢子创客空间
- Java程序员幽默爆笑锦集
- FZU 2230 2230 翻翻棋(思维水题)