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

第三十六:6.6. 【$refs、$parent】

  1. 概述:

    • $refs用于 :父→子。

    • $parent用于:子→父。

    • // 向外部提供数据

      defineExpose({house})

  2. 原理如下:

    属性说明
    $refs值为对象,包含所有被ref属性标识的DOM元素或组件实例。
    $parent值为对象,当前组件的父组件实例对象。

Father.vue:   里面的 $refs 是 父 通信 给 子

<template>
	<div class="father">
		<h3>父组件</h3>
		<h4>房产:{{ house }}</h4>
		<button @click="changeToy">修改Child1的玩具</button>
		<button @click="changeComputer">修改Child2的电脑</button>
		<button @click="getAllChild($refs)">让所有孩子的书变多</button>
		<Child1 ref="c1"/>
		<Child2 ref="c2"/>
	</div>
</template>

<script setup lang="ts" name="Father">
	import Child1 from './Child1.vue'
	import Child2 from './Child2.vue'
	import { ref,reactive } from "vue";
	let c1 = ref()
	let c2 = ref()

	// 注意点:当访问obj.c的时候,底层会自动读取value属性,因为c是在obj这个响应式对象中的
	/* let obj = reactive({
		a:1,
		b:2,
		c:ref(3)
	})
	let x = ref(4)

	console.log(obj.a)
	console.log(obj.b)
	console.log(obj.c)
	console.log(x) */
	

	// 数据
	let house = ref(4)
	// 方法
	function changeToy(){
		c1.value.toy = '小猪佩奇'
	}
	function changeComputer(){
		c2.value.computer = '华为'
	}
	function getAllChild(refs:{[key:string]:any}){
		console.log(refs)
		for (let key in refs){
			refs[key].book += 3
		}
	}
	// 向外部提供数据
	defineExpose({house})  // 这里是向外部 child1.vue 外部提供数据
</script>

<style scoped>
	.father {
		background-color: rgb(165, 164, 164);
		padding: 20px;
		border-radius: 10px;
	}

	.father button {
		margin-bottom: 10px;
		margin-left: 10px;
	}
</style>

child1.vue  $parent  是子向父 进行通讯

<template>
  <div class="child1">
    <h3>子组件1</h3>
		<h4>玩具:{{ toy }}</h4>
		<h4>书籍:{{ book }} 本</h4>
		<button @click="minusHouse($parent)">干掉父亲的一套房产</button>
  </div>
</template>

<script setup lang="ts" name="Child1">
	import { ref } from "vue";
	// 数据
	let toy = ref('奥特曼')
	let book = ref(3)

	// 方法
	function minusHouse(parent:any){
		parent.house -= 1  // 注意:这里是去修改 Father.vue 里面的数据
	}

	// 把数据交给外部
	defineExpose({toy,book})

</script>

<style scoped>
	.child1{
		margin-top: 20px;
		background-color: skyblue;
		padding: 20px;
		border-radius: 10px;
    box-shadow: 0 0 10px black;
	}
</style>

child2.vue:  也是父 向 子 进行通讯

<template>
  <div class="child2">
    <h3>子组件2</h3>
		<h4>电脑:{{ computer }}</h4>
		<h4>书籍:{{ book }} 本</h4>
  </div>
</template>

<script setup lang="ts" name="Child2">
		import { ref } from "vue";
		// 数据
		let computer = ref('联想')
		let book = ref(6)
		// 把数据交给外部
		defineExpose({computer,book})
</script>

<style scoped>
	.child2{
		margin-top: 20px;
		background-color: orange;
		padding: 20px;
		border-radius: 10px;
    box-shadow: 0 0 10px black;
	}
</style>


http://www.kler.cn/a/572122.html

相关文章:

  • 如何配置虚拟机IP?
  • .net8 使用 license 证书授权案例解析
  • SP导入模型设置
  • 机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】
  • Ubuntu 20.04下ROS项目编译缺少nav_msgs头文件问题
  • Mapmost SDK for WebGL 全新升级——解锁 3DGS 新能力!
  • 【赵渝强老师】监控Redis
  • 搭建laravle 数字产品销售平台 php
  • WPF+WebView 基础
  • 修改hosts文件,修改安全属性,建立自己的DNS
  • leetcode106.相交链表
  • Pytorch构建LeNet进行MNIST识别 #自用
  • es 安装ik分词器
  • Spring Bean 作用域设置为prototype在并发场景下是否是线程安全的
  • 【第14节】C++设计模式(行为模式)-Strategy (策略)模式
  • http 状态码秒记速查(附速记口诀)
  • 【redis】redis持久化
  • 京东Hive SQL面试题实战:APP路径分析场景解析与幽默生存指南
  • 爬虫:一文掌握 Celery 分布式爬虫,及对应实战案例
  • 【应急响应工具教程】一款自动化分析网络安全应急响应工具--FindAll