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 二分法(数组array)
Apr 24 Javascript
js 实现日期灵活格式化的小例子
Jul 14 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
Jan 13 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
javascript replace()第二个参数为函数时的参数用法
Dec 26 Javascript
jQuery实现动态文字搜索功能
Jan 05 Javascript
基于Bootstrap表单验证功能
Nov 17 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
Feb 26 Javascript
vue实现在线翻译功能
Sep 27 Javascript
node静态服务器实现静态读取文件或文件夹
Dec 03 Javascript
js的Object.assign用法示例分析
Mar 05 Javascript
解决vue 退出动画无效的问题
Aug 09 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代码重构工具推荐
2014/10/14 PHP
PHP常用处理静态操作类
2015/04/03 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
Python 列表list使用介绍
2014/11/30 Python
Python中的异常处理学习笔记
2015/01/28 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
pyshp创建shp点文件的方法
2018/12/31 Python
Python 使用多属性来进行排序
2019/09/01 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
文字自荐书范文
2014/02/10 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
幼儿教师求职信
2014/05/24 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers
用php如何解决大文件分片上传问题
2021/07/07 PHP