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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(1)
Dec 23 Javascript
基于jquery的不规则矩形的排列实现代码
Apr 16 Javascript
jquery 面包屑导航 具体实现
Jun 05 Javascript
jQuery晃动层特效实现方法
Mar 09 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
Oct 24 Javascript
Vue中计算属性computed的示例解读
Jul 26 Javascript
vue 2.0 购物车小球抛物线的示例代码
Feb 01 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
jQuery轮播图功能制作方法详解
Dec 03 jQuery
原生JavaScript实现滑动拖动验证的示例代码
Dec 06 Javascript
vue+elementUI实现简单日历功能
Sep 24 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
Nov 13 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
基于PHP文件操作的详细诠释
2013/06/21 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
PHP模板解析类实例
2015/07/09 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
js比较日期大小的方法
2015/05/12 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
js实现点赞效果
2020/03/16 Javascript
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
django序列化serializers过程解析
2019/12/14 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
PHP开发的一般流程
2013/08/13 面试题
交通事故委托书范本精选
2014/10/04 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
家长会感言
2015/08/01 职场文书
听课评课活动心得体会
2016/01/15 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记
java中如何截取字符串最后一位
2022/07/07 Java/Android