Vue3基础(26)___defineProps、defineEmits、defineExpose组件通信

news2025/1/16 3:44:45

defineProps、defineEmits、defineExpose组件通信

在使用这个之前,我们需要知道setup的语法糖写法,因为上面的三个api需要在这个语法糖中才能使用:

<script setup>
	console.log('LiuQing')
</script>

里面的代码会被编译成组件 setup() 函数的内容。
这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行。

官方解释:

<script setup> 
是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。
相比于普通的 <script> 语法,它具有更多优势:
1、更少的样板内容,更简洁的代码。
2、能够使用纯 TypeScript 声明 props 和自定义事件。
3、更好的运行时性能 (其模板会被编译成同一作用域内的渲染函数,避免了渲染上下文代理对象)4、更好的 IDE 类型推导性能 (减少了语言服务器从代码中抽取类型的工作)

顶层的绑定会被暴露给模板:

<template>
  name: {{ name }} <br />
  age: {{ age }}
</template>

<script setup>
	import { ref } from 'vue'
	const name = ref('LiuQing')
	const age = ref(18)
</script>

页面:
在这里插入图片描述
不需要主动暴露return。

使用组件:

<template>
  name: {{ name }} <br />
  age: {{ age }}
  <Children2/>
</template>

<script setup>
import Children2 from './components/Parent/Children2.vue'
import { ref } from 'vue'
const name = ref('LiuQing')
const age = ref(18)
</script>

子组件:

<template>我是子组件哦</template>

页面:
在这里插入图片描述

defineProps、defineEmits、defineExpose这三个api我们可以直接使用并不需要在vue中单独暴露出来

defineProps

<template>
  我是子组件哦
  <p>子组件得到的name:{{ props.name }}</p>
  <p>子组件得到的age:{{ props.age }}</p>
</template>
<script setup>
import { defineProps, defineEmits, defineExpose } from 'vue'
const props = defineProps({
  name: {
    type: String,
    default: "六卿",
  },
  age: {
    type: Number,
    default: 279
  }
})
</script>

其实我们使用的时候完全可以不导入。
目前页面:
在这里插入图片描述
因为我们目前还没有给子组件传入name、age,所以使用的默认值。
在父组件传入name、age:

<template>
  name: {{ name }} <br />
  age: {{ age }}
  <Children2 :name="name" :age="age" />
</template>

<script setup>
import Children2 from './components/Parent/Children2.vue'
import { ref } from 'vue'
const name = ref('LiuQing')
const age = ref(18)
</script>

写法完全和v2一致,使用v-bind或者:即可达到效果。
当前页面:
在这里插入图片描述
已经收到了传入的值。

defineEmits

defineProps为了解决子组件接受父组件传入的值,那defineEmits就是子组件给父组件传值,当然这个传值是以回调函数的形式传送。
使用的前提是需要父组件传入回调函数,子组件使用defineEmits接受,触发事件。

<template>
  name: {{ name }} <br />
  age: {{ age }}
  <Children2 :name="name" :age="age" @changeName="changeName" />
</template>

<script setup>
import Children2 from './components/Parent/Children2.vue'
import { ref } from 'vue'
const name = ref('LiuQing')
const age = ref(18)
const changeName = (newName) => {
  name.value = newName
}
</script>

子组件使用:

<template>
  我是子组件哦
  <p>子组件得到的name:{{ props.name }}</p>
  <p>子组件得到的age:{{ props.age }}</p>
  <button @click="changeName('六卿')">改变name为六卿</button>
</template>
<script setup>
import { defineProps, defineEmits, defineExpose } from 'vue'
const props = defineProps({
  name: {
    type: String,
    default: "六卿",
  },
  age: {
    type: Number,
    default: 279
  }
})

const emits = defineEmits(['changeName'])
const changeName = (name) => {
  console.log("改变name")
  emits('changeName', name)
}
</script>

页面:
在这里插入图片描述
点击后页面:
在这里插入图片描述

defineExpose

用于父组件要使用子组件中的方法或者属性的时候,子组件暴露给父组件,父组件配合ref使用:

子组件:

<template>
  我是子组件哦
  <p>子组件得到的name:{{ props.name }}</p>
  <p>子组件得到的age:{{ props.age }}</p>
  <button @click="changeName('六卿')">改变name为六卿</button>
  ------------------------------------------<br />
  count :{{ count }}
</template>
<script setup>
import { defineProps, defineEmits, defineExpose, ref } from 'vue'
const props = defineProps({
  name: {
    type: String,
    default: "六卿",
  },
  age: {
    type: Number,
    default: 279
  }
})
const emits = defineEmits(['changeName'])
const changeName = (name) => {
  console.log("改变name")
  emits('changeName', name)
}
const count = ref(100)
const changeCount = () => {
  count.value = --count.value
}
defineExpose({
  count,
  changeCount
})
</script>

父组件:

<template>
  <button @click="changeCount">父组件按钮__改变count的值</button>
  name: {{ name }} <br />
  age: {{ age }}
  <Children2 ref="child" :name="name" :age="age" @changeName="changeName" />
</template>

<script setup>
import Children2 from './components/Parent/Children2.vue'
import { ref } from 'vue'
const name = ref('LiuQing')
const age = ref(18)
const changeName = (newName) => {
  name.value = newName
}
const child = ref(null)
const changeCount = () => {
  console.log(child.value.count, 'child.value.count')
  console.log(child.value.changeCount, 'child.value.changeCount')
  child.value.changeCount()
}
</script>

页面:
在这里插入图片描述

子组件暴露,父组件ref接受。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m分别通过GA遗传优化算法对企业不同产品订单生产进行时间优化

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 首先介绍MATLAB部分的遗传算法的优化算法介绍&#xff1a; 遗传算法的原理 遗传算法GA把问题的解表示成“染色体”&#xff0c;在算法中也即是以二进制编码的串。并且&#xff0c;在执行…

WhatsApp营销引流-SendWS拓客系统功能后台介绍(五):WhatsApp素材管理

WhatsApp营销引流 很多新创的品牌想在海外推广自家产品&#xff0c;由于自己的品牌影响力不及其他老牌大牌&#xff0c;想在海外打开名气首先可以选择利用WhatsApp来进行营销引流&#xff0c;这是最简单最直接的方法&#xff0c;只需要低成本即可实现高回报。 据统计WhatsApp…

Python面向对象

目录 1.初识对象 2. 类的成员方法 3. 类和对象 4. 构造方法 5. 其它内置方法 6. 封装 7. 继承 7.1 继承的基础语法 7.2 复写和调用父类成员 8. 多态 1.初识对象 1. 生活中或是程序中&#xff0c;我们都可以使用设计表格、生产表格、填写表格的形式组织数据。 2. 进…

【2011】408联考操作系统真题整理

2011年 23 题目 满足短作业优先且不会发生饥饿现象的调度算法&#xff1a;高响应比优先 解析 24 题目 用户态执行的是命令解释程序 解析 法一&#xff1a;正向选择 DOS对应联机命令接口 法二&#xff1a;逆向排除 非用户态 -> 内核态 25 题目 在支持多线程的…

vs2019搭建与配置Qt,并实现影像显示

vs2019搭建与配置Qt&#xff0c;并实现影像显示 1.关于qt在vs2019的配置 主要参考了这个博客 其中有一个我在配置过程中出现的问题&#xff0c;在此记录一下 Qt Visual Studio Tools 在vs2019一直无法加载&#xff0c;一直在initializing,且提示"未能正确加载qtvstools…

数据库的基本操作(4)

先总结一下上一章的内容。 1.修改 update 表名 set 列名 值... where 条件&#xff1b; 2.删除 delete from 表名 where 条件&#xff1b; 3.mysql的约束 约束&#xff1a;数据库对数据本身有一些要求和限制。 NOT NULL 数据不能为空。 UNIQUE 数据唯一&#xff08;针…

【目标检测】目标检测的评价指标(七个)

目录&#xff1a;目标检测的评价指标一、正样本与负样本二、真正(TP)、假正(FP)、真负(TN)、假负(FN)&#xff08;1&#xff09;正确的正向预测&#xff08;True Positive&#xff0c;TP&#xff09;&#xff1a;正样本被正确检测的数量&#xff08;2&#xff09;错误的正向预测…

国际海运详解:国际海运的发货方式有哪些?区别是什么?

在跨境物流运输中&#xff0c;海运是一个种常用的运输方式&#xff0c;下面来重点介绍国际海运的几种发货方式和区别&#xff1a; 一、电放提单 是电报放货的缩写。提单信息以电子报纸或电子信息的形式发送给目的港船公司&#xff0c;收货人可以更换加盖电子印章的提单和电子保…

LeetCode-775-全局倒置与局部倒置

1、数学方法 根据题意&#xff0c;显然全局倒置的值大于等于局部倒置的值。因此我们不必求出具体的全局倒置的值和局部倒置的值&#xff0c;我们只需要证明全局倒置的值大于局部倒置的值即可。 因此我们可以从后往前进行查询&#xff0c;只要我们能够证明区间[i1,n−1][i1,n-…

小啊呜产品读书笔记001:《邱岳的产品手记-02》开篇词010203讲

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-02》 开篇词&01&02&03讲一、今日阅读计划二、泛读&知识摘录1、开篇词 产品经理的世界没有对错2、01讲 验证码是个好设计吗&#xff1f;3、02讲 产品经理工具指南4、03讲 产品案例分析Trigraphy的设计哲学三…

VS2019编码修改为UTF-8的方法

1.修改windows系统配置 设置 时区和语言 语言 》 管理语言设置 2. 修改VS2019 在扩展里安装Force UTF-8(No BOM) 和 Fix File Encoding 插件 解决控制台中文乱码问题 1.按下winr&#xff0c;输出regedit&#xff0c;打开注册表编辑器 2.在注册表编辑器中打开路径HKE…

VBA调用宏的方式总结大全

文章目录背景方式一 : Excel菜单执行宏方式二 : 按钮绑定宏1. 插入按钮2. 绑定宏方式三 : 窗体绑定宏1. 插入窗体2. 拖入按钮3. 绑定按钮点击事件触发宏(写代码)方式四 : 事件绑定宏背景 很多小伙伴在拿到模型之后, 看着满屏的代码, 却不知道如何下手使用这些代码. 这篇文章就…

【DOTS学习笔记】面向数据设计DOD

目录前言程序设计方法ODD->DODCache的3C与3R面向数据设计需要思考的问题AOSSOADOTS面向数据设计原则前言 本文是Metaverse大衍神君的《DOTS之路》系列课程的学习笔记 程序设计方法 Instructional Programming 指令化编程 脱离指令打孔输入后&#xff0c;伴随着机器汇编语言…

操作系统4小时速成:进程同步,临界资源,互斥,信号量的作用,死锁产生的四个条件,安全状态,银行家算法

操作系统4小时速成&#xff1a;进程同步&#xff0c;临界资源&#xff0c;互斥&#xff0c;信号量的作用&#xff0c;死锁产生的四个条件&#xff0c;安全状态&#xff0c;银行家算法 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&am…

vhost dpdk 共享内存

struct kvm_memory_slot http://tinylab.org/kvm-intro-part1 https://www.cnblogs.com/LoyenWang/p/13943005.html &#xff08;免费订阅,永久学习&#xff09;学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂 更多DPDK相关学习资料有…

Mybatis-Plus——分页+模糊查询

建表&#xff1a; create table pms_brand (brand_id bigint not null auto_increment comment 品牌id,name char(50) comment 品牌名,logo varchar(2000) comment 品牌logo地址,descript longtext comment 介绍,sh…

使用ReentrantLock中的条件变量让多个线程顺序执行

一. 前言 近日壹哥的一个学生在参加某公司校招面试时&#xff0c;遇到一个多个线程顺序执行的面试题&#xff0c;特意记录下来和大家分享一下&#xff0c;这个题目的具体要求是这样的&#xff1a; 假设有3个线程 a,b,c&#xff0c;要求三个线程一起进入到就绪态&#xff0c;执…

【LeetCode】775. 全局倒置与局部倒置

题目描述 给你一个长度为 n 的整数数组 nums &#xff0c;表示由范围 [0, n - 1] 内所有整数组成的一个排列。 全局倒置 的数目等于满足下述条件不同下标对 (i, j) 的数目&#xff1a; 0 < i < j < n nums[i] > nums[j] 局部倒置 的数目等于满足下述条件的下标 i 的…

01-Linux

1 初识Linux 在前面的课程中&#xff0c;我们无论是开发、测试。部署、存储都在Windwos操作系统的环境中&#xff0c;从今天开始我们一起学习下Linux,Linux系统和Windows系统最大的区别就是图形化界面操作和用途上有所差异&#xff0c;除了这两点&#xff0c;两者有异曲同工之…

跑通官方的yolov7-tiny实验记录(yolov7-tiny可作为yolov5s的对比实验网络)

目录1. 一些可用的参考链接2. 开始训练yolov72.1 --weights2.2 --cfg2.3 --data2.4 --hyp2.5 --epochs2.6 --batch-size2.7 --workers2.8 --name1. 一些可用的参考链接 官方YOLOv7 项目地址&#xff1a;https://github.com/WongKinYiu/yolov7如果想设置早停机制&#xff0c;可…