vue父子组件间引用之$parent、$children


Posted in Javascript onMay 20, 2020

vue中提到【父子组件】,则一定会想到我们常用的父子组件通信:props+$on()$emit() ,如图:

vue父子组件间引用之$parent、$children

也就是说,虽然在一般情况下,子组件是不能引用父组件或者Vue实例的数据,但是对于在开发中出现的“数据需要在组件中来回传递”,我们最简单的解决办法就是通过props(和v-on)将数据从父组件传到子组件,再用$emit将数据从子组件传到父组件,以此循环引用。

但是在另一些场景下,我们可能想要比如(在父组件中)拿到子组件对象,然后直接操作其中数据,去实现一些功能,比如方法的调用。

vue父子组件间引用之$parent、$children

有时候我们需要父组件直接访问子组件、子组件直接访问父组件,或者子组件访问根组件:

  • 父组件访问子组件:使用$children$refs reference
  • 子组件访问父组件:使用$parent

父子组件的访问方式之:$children

children很特别,查阅资料可以发现:this.$children是一个数组类型,它包含了所有子组件对象:

<body>
		<div id="app">
			<mxc></mxc>
			<mxc></mxc>
			<mxc></mxc>
			<button @click="btnClick">颤抖吧</button>
		</div>
		<template id="mxc">
			<div>我是子组件啊</div>
		</template>
		
		<script>
			const app=new Vue({
				el:'#app',
				data:{
					message:'你好'
				},
				methods:{
					btnClick(){
						console.log(this.$children)
					}
				},
				components:{
					mxc:{
						template:'#mxc',
						methods:{
							showMessage(){
								console.log('mxcnb')
							}
						}
					}
				}
			})
		</script>
	</body>

点击(父组件)按钮之后:

vue父子组件间引用之$parent、$children

我们还可以通过循环拿到所有子组件数据:

<body>
		<div id="app">
			<mxc></mxc>
			<mxc></mxc>
			<mxc></mxc>
			<button @click="btnClick">颤抖吧</button>
		</div>
		<template id="mxc">
			<div>我是子组件啊</div>
		</template>
		
		<script>
			const app=new Vue({
				el:'#app',
				data:{
					message:'你好'
				},
				methods:{
					btnClick(){
						console.log(this.$children)
						for(let c of this.$children){
							console.log(c.name)
						}
					}
				},
				components:{
					mxc:{
						template:'#mxc',
						data(){
							return{
								name:'我是子组件的name'
							}
						},
						methods:{
							showMessage(){
								console.log('mxcnb')
							}
						}
					}
				}
			})
		</script>
	</body>

点击(父组件)按钮之后:

vue父子组件间引用之$parent、$children

因为是数组,所以我们可以通过比如:this.$children[2]来拿到第三个子组件的数据。
但是这么做有一个问题:比如开发时突然在这三个子组件中又插入了一个子组件(可能相同,也可能不同),这时候【2】就不再是我们需要的了。。。

所以我们可以用vue-DOM之光$refs

<body>
		<div id="app">
			<mxc></mxc>
			<mxc></mxc>
			<mxc ref="aaa"></mxc>
			<button @click="btnClick">颤抖吧</button>
		</div>
		<template id="mxc">
			<div>我是子组件啊</div>
		</template>
		
		<script>
			const app=new Vue({
				el:'#app',
				data:{
					message:'你好'
				},
				methods:{
					btnClick(){
						console.log(this.$refs)
						console.log(this.$refs.aaa)
					}
				},
				components:{
					mxc:{
						template:'#mxc',
						data(){
							return{
								name:'我是子组件的name'
							}
						},
						methods:{
							showMessage(){
								console.log('mxcnb')
							}
						}
					}
				}
			})
		</script>
	</body>

点击(父组件)按钮之后:

vue父子组件间引用之$parent、$children

为什么叫“DOM之光”呢?因为它和原生JS中的document.querySelector('xxx')功能一样,它可以在vue中获取元素/匹配组件

子访问父:$parent

<body>
		<div id="app">
			<mxc></mxc>
		</div>
		<template id="mxc">
			<div>我是子组件啊</div>
			<button @click="btnClick">更加颤抖的child</button>
		</template>
		
		<script>
			const app=new Vue({
				el:'#app',
				data:{
					message:'你好'
				},
				components:{
					mxc:{
						template:'#mxc',
						methods:{
							btnClick(){
								console.log(this.$parent)
							}
						}
					}
				}
			})
		</script>
	</body>

如法炮制:

vue父子组件间引用之$parent、$children

图中el属性在有些浏览器(或添加了vue插件)会显示未Vue?
因为当前子组件的父组件就是vue实例啊!

(但是在实际中$parent用的非常少——考虑到耦合度的原因)

子组件访问根组件:$root

<body>
		<div id="app">
			<mxc></mxc>
		</div>
		<template id="mxc">
			<div>
				<div>我是mxc组件</div>
				<cdn></cdn>
			</div>
		</template>
		<template id="mxca">
			<div>
				<div>我是子子组件啊</div>
				<button @click="btnClick">巨颤祖child</button>
			</div>
		</template>
		
		<script>
			const app=new Vue({
				el:'#app',
				data:{
					message:'你好'
				},
				components:{
					mxc:{
						template:'#mxc',
						data(){
							return{
								name:'我是中间子组件的name'
							}
						},
						components:{
							cdn:{
								template:'#mxca',
								methods:{
									btnClick(){
										console.log(this.$parent.name)
										console.log(this.$root.message)
									}
								}
							}
						}
					}
				}
			})
		</script>
	</body>

vue父子组件间引用之$parent、$children

总结

到此这篇关于vue父子组件间引用:$parent、$children的文章就介绍到这了,更多相关vue父子组件间引用:$parent、$children内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
利用jQuery操作对象数组的实现代码
Apr 27 Javascript
使用js获取地址栏中传递的值
Jul 02 Javascript
JS下拉缓冲菜单示例代码
Aug 30 Javascript
基于jQuery实现仿淘宝套餐选择插件
Mar 04 Javascript
Vue实例简单方法介绍
Jan 20 Javascript
详解ECMAScript6入门--Class对象
Apr 27 Javascript
JavaScript Canvas实现验证码
Aug 02 Javascript
js中数组常用方法总结(推荐)
Apr 09 Javascript
vue列表单项展开收缩功能之this.$refs的详解
May 05 Javascript
javascript面向对象创建对象的方式小结
Jul 29 Javascript
vue使用高德地图根据坐标定位点的实现代码
Aug 22 Javascript
react antd实现动态增减表单
Jun 03 Javascript
jQuery HTML获取内容和属性操作实例分析
May 20 #jQuery
微信小程序国际化探索实现(附源码地址)
May 20 #Javascript
jQuery HTML设置内容和属性操作实例分析
May 20 #jQuery
jquery html添加元素/删除元素操作实例详解
May 20 #jQuery
jQuery HTML css()方法与css类实例详解
May 20 #jQuery
15分钟上手vue3.0(小结)
May 20 #Javascript
jQuery 隐藏/显示效果函数用法实例分析
May 20 #jQuery
You might like
笑谈配置,使用Smarty技术
2007/01/04 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
Javascript 读书笔记索引贴
2010/01/11 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
2010/04/02 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
vue开发简单上传图片功能
2020/06/30 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
pytorch SENet实现案例
2020/06/24 Python
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
新媒传信软件测试面试题
2013/02/24 面试题
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
经营理念标语
2014/06/21 职场文书
高中社区服务活动报告
2015/02/05 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
Python3的进程和线程你了解吗
2022/03/16 Python
python实现手机推送 代码也就10行左右
2022/04/12 Python
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL