VUE学习笔记:11.组件化之:父子组件的访问方式

1.父子组件的访问

在这里插入图片描述

2.父组件访问子组件对象

(1)$children方式

  • 父组件中可以使用$children来获取所有子组件的对象,返回的是一个数组。
  • 通过子组件对象可以获取到子组件的数据,方法等所有东西。
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="app1">
	<!--使用组件-->
	<mycpnc></mycpnc>
	<mycpnc></mycpnc>
	<mycpnc></mycpnc>
	<button type="button" @click="btnclick">按钮</button>
</div>

<!--使用template标签抽离组件模板-->
<template id="script_template">
	<div>
		<h3>我是子组件</h3>
	</div>
</template>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    let app = new Vue({
        el: '#app1', // 讲这个vue实例与id为app1的标签关联起来
        data: {message:0},
		methods:{
			btnclick: function(){
				console.log(this.$children) // 通过$children获取所有的子组件对象,父组件的模板中使用了多少子组件就会返回多少个对象
				console.log(this.$children[0].dmessage) // 获取第一个子组件中的数据dmessage
				this.$children[0].dmethod() //使用第一个子组件中的方法dmethod
			}
		},
		//使用语法糖方式注册局部组件
		components: {
			'mycpnc':{
				template: '#script_template',
				data:function(){
					return {
						dmessage:'我是子组件中的数据' //定义子组件中的数据
					}
				},
				methods:{
					//定义子组件中的方法
					dmethod:function(){
						console.log('我是子组件中的方法')
					}
				}
			}
		}
    })
</script>
</body>
</html>

效果如下:
在这里插入图片描述
但是实际开发中我们一般不会使用$children来获取子组件,因为它返回的是一个数组,需要使用下标来获取具体的子组件对象。当我们的模板中引用新的子组件时,数组就改变了,这会导致代码难以维护。

(2)$refs方式

  • 在父组件中使用子组件时,在子组件标签上添加ref="xxx"属性。
  • 在父组件中使用$refs来获取子组件对象,返回的是一个对象。key为子组件标签中的ref值,value为子组件对象。
  • 如果子组件标签中没有ref标签,使用$refs则不能获取到该子组件对象。
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="app1">
	<!--使用组件-->
	<mycpnc ref="aaa"></mycpnc>
	<mycpnc ref="bbb"></mycpnc>
	<mycpnc></mycpnc>
	<button type="button" @click="btnclick">按钮</button>
</div>

<!--使用template标签抽离组件模板-->
<template id="script_template">
	<div>
		<h3>我是子组件</h3>
	</div>
</template>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    let app = new Vue({
        el: '#app1', // 讲这个vue实例与id为app1的标签关联起来
        data: {message:0},
		methods:{
			btnclick: function(){
				console.log(this.$refs) // 通过$refs来获取子组件,返回一个对象。key为子组件标签中的ref属性值,value则为对应子组件本身
				console.log(this.$refs.aaa.dmessage) // 获取aaa子组件中的数据dmessage
				this.$refs.aaa.dmethod() //使用aaa子组件中的方法dmethod
			}
		},
		//使用语法糖方式注册局部组件
		components: {
			'mycpnc':{
				template: '#script_template',
				data:function(){
					return {
						dmessage:'我是子组件中的数据' //定义子组件中的数据
					}
				},
				methods:{
					//定义子组件中的方法
					dmethod:function(){
						console.log('我是子组件中的方法')
					}
				}
			}
		}
    })
</script>
</body>
</html>

运行结果如下:
在这里插入图片描述
在实际开发中我们基本上都是使用这种方式来获取子组件,因为这种方式更加易于维护,即使父组件中使用的其他子组件发生变化,也不会有影响。

3.子组件访问父组件对象

  • 在子组件中可以使用$parent来获取它的上一级组件对象,返回的是一个组件对象。
  • 在子组件中可以使用$root来获取它的根组件对象,注意返回的是最外层的组件对象(如果定义中vue实例中,那么返回的就是vue实例对象)
  • 可以通过返回的父组件对象获取父组件中的数据,方法等内容。
  • 尽量不要使用$parent方法来获取父组件中的数据或者方法。因为这会大大增加组件之间的耦合性,降低组件的复用性。我们在开发组件时是希望组件尽量能在任何地方复用的,当我们把某个子组件注册到多个不同的组件中时,那么子组件中使用$parent来获取的数据或者方法可能在某个父组件中不存在,从而导致代码报错。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值