当前位置: 首页 > news >正文

Vue基础:父子组件访问的方式

有时候我们需要父组件直接访问子组件(通过$children或$refs),子组件直接访问父组件($parent)。

$children(父访问子)

 this.$children是一个对象数组类型,它包括所有子组件对象。通过该对象数组可以读或写子组件中的数据、调用子组件的方法。弊端是有多个子组件时通过对象数组下标访问子组件,无法适应子组件的数量发生变化的情况。

<body>
	<div id="app">
		<cpn></cpn>
		<!-- 使用单标签此处出问题,在CLI里面不存在该问题 -->
		<!-- <cpn /> -->
		<button type="button" @click="btnClick">按钮</button>
	</div>
	<template id="cpn">
		<div>
			我是子组件---{{name}}
		</div>
	</template>
	<script src="vue/vue.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		const app=new Vue({
			el:'#app',
			data:{
				message:'wangdou'
			},
			methods:{
				btnClick(){
					this.$children[0].name='linda'
				}
			},
			components:{
				cpn:{
					template:'#cpn',
					data(){
							return {
								name:'我是子组件中的变量'
							}
					},
					methods:{
						showMessage(){
							console.log('showMessage')
						}
					}
				}
			}
		})
	</script>
</body>

 $refs(父访问子)

$refs为对象。其中key为子组件ref的属性值、value为子组件对象。通过该$refs对象可以读或写子组件中的数据、调用子组件的方法。

1.在子组件标签中添加 ref属性

2.在父组件中通过this.$refs.key访问子组件。

 

 

<body>
	<div id="app">
		<cpn></cpn>
		<cpn ref="com"></cpn>
		<cpn></cpn>
		<!-- 使用单标签此处出问题,在CLI里面不存在该问题 -->
		<!-- <cpn /> -->
		<button type="button" @click="btnClick">按钮</button>
	</div>
	<template id="cpn">
		<div>
			我是子组件---{{name}}
		</div>
	</template>
	<script src="vue/vue.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		const app=new Vue({
			el:'#app',
			data:{
				message:'wangdou'
			},
			methods:{
				btnClick(){
					this.$refs.com.name='abc'					
				}
			},
			components:{
				cpn:{
					template:'#cpn',
					data(){
							return {
								name:'我是子组件中的变量'
							}
					},
					methods:{
						showMessage(){
							console.log('showMessage')
						}
					}
				}
			}
		})
	</script>
</body>

 $parent(子访问父)

在子组件中通过this.$parent访问父级对象。它也可以更改父对象中的数据,调用父对象中的方法。还有this.$root访问Vue实例。

例如我写的表单验证:当从子组件中要验证父组件中的属性是否符合规则时

 

 submitForm(formName) {
      // console.log('this.name', this.$parent.$refs['ruleForm'])
      let flag = true
      this.$parent.$refs['ruleForm'].validate((valid) => {
        flag = valid
      })
      if (!flag) {
        this.open3()
        return flag
      }
      // console.log(flag)
      // return
      this.$refs['ruleForm1'].validate((valid) => {
        if (valid) {
          // alert('submit!')
          console.log(this.ruleForm1)
        } else {
          // alert('请填写正确的表单格式')
          console.log('error submit!!')
          flag = valid
          // return false
        }
      })
      this.$refs['ruleForm'].validate((valid) => {
        flag = valid
        if (valid) {
          console.log(this.ruleForm)
        } else {
          console.log('error submit!!')
          return false
        }
      })
      return flag
    },
<body>
	<div id="app">
		<cpn></cpn>
		{{message}}
	</div>
	<template id="cpn">
		<div>
			我是子组件
			<button type="button" @click="btnClick">按钮</button>
		</div>
	</template>
	<script src="vue/vue.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		const app=new Vue({
			el:'#app',
			data:{
				message:'linda'
			},
			components:{
				cpn:{
					template:'#cpn',
					data(){
							return {
								name:'hello'
							}
					},
					methods:{
						btnClick(){
							this.$parent.message='world'
						}
					}
				}
			}
		})
	</script>
</body>

 

相关文章:

  • 如果你想技术转管理,先来试试管好一个项目
  • mysql 排它锁,共享锁
  • 煤炭行业生命周期分析,煤炭行业周期性特征
  • [SpringBoot系列]NoSQL数据层解决方案
  • 【通信原理】确知信号的性质分析与研究
  • Linux网络:网络层IP协议 链路层MAC协议
  • 猿创征文 |【SpringBoot2】快速上手SpringBoot
  • Linux的scp命令远程传输文件
  • antv x6让拖拽控件工具箱悬浮在画布上,工具箱区域鼠标按下不生成节点
  • matlab怎么训练神经网络,matlab神经网络训练方法
  • 「面经分享」小米java岗二面面经,已拿offer
  • 手把手教你给女朋友编写一个公众号定时推送(java版本)
  • 数据结构与算法--动态规划
  • 标准IO移动光标
  • 咕咕驴2022新版AI短视频一键换脸小程序源码/带流量主
  • 【node学习】协程
  • Angular4 模板式表单用法以及验证
  • axios 和 cookie 的那些事
  • C++11: atomic 头文件
  • classpath对获取配置文件的影响
  • Docker 笔记(2):Dockerfile
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Lucene解析 - 基本概念
  • python3 使用 asyncio 代替线程
  • 今年的LC3大会没了?
  • 前端_面试
  • 入口文件开始,分析Vue源码实现
  • 软件开发学习的5大技巧,你知道吗?
  • 深入 Nginx 之配置篇
  • 时间复杂度与空间复杂度分析
  • 用Visual Studio开发以太坊智能合约
  • 阿里云移动端播放器高级功能介绍
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​学习一下,什么是预包装食品?​
  • #etcd#安装时出错
  • #单片机(TB6600驱动42步进电机)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (06)金属布线——为半导体注入生命的连接
  • (2.2w字)前端单元测试之Jest详解篇
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (ZT)出版业改革:该死的死,该生的生
  • (南京观海微电子)——I3C协议介绍
  • (一)基于IDEA的JAVA基础12
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原)本想说脏话,奈何已放下
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)linux 命令大全
  • (转)平衡树
  • (状压dp)uva 10817 Headmaster's Headache
  • .project文件
  • @Autowired多个相同类型bean装配问题
  • @RunWith注解作用
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @基于大模型的旅游路线推荐方案