vue3语法糖+ts组件传值
在开发中有些功能是通用的,而且逻辑大致相同,像这种东西可以封成一个组件,比较常用的就是函数封装,组件封装,组件封装是需要引入到页面使用的,所以通常它会有一些自己的方法,父子组件可以通过一些值来进行关联,这种方式也就是我们所说的组件传值,vue3+ts的组件传值其实就是组件传值加上了数据类型约束,并没有什么区别。
这里主要介绍vue3的setup语法糖组件传值,以删除功能为例子,父子组件主要用到defineProps和defineEmits来实现组件传值。
父传子
这里通过import 自定义组件名 from 子组件路径 来引入组件,在页面中使用<组件名></组件名>即可
父组件
// 父组件引入子组件 通过自定义名称传入父组件的值
<DeleteGoods :father="userStatus" ></DeleteGoods>
<script setup lang="ts">
import { ref } from "vue"
import DeleteGoods from '@/components/A_组件传值/A组件.vue' // 引入子组件
// 父组件的值
const userStatus = ref('user')
</script>
子组件
<div class="deleteName">子组件A</div>
<script setup lang="ts">
import { ref,defineProps} from "vue"
// 通过defineProps接收父组件的值
const fatherElement = defineProps({
// 接收传值 此处的father就是父组件的自定义名称
father:{
type:String, // 数据类型
default:"未传值" // 未传值时的默认值
}
})
console.log(fatherElement.father) // 打印父组件的值:user
</script>
子传父
子组件
<div class="deleteName" @click="deleteGoods">子组件A</div>
<script setup lang="ts">
import { ref,defineEmits} from "vue"
// 子传父通过数组的形式传值,定义子传父的事件defineEmits([自定义名称])
const emit = defineEmits(['deleteOutcome'])
// 子组件值
const backStatus = ref<string>('back')
// 删除
const deleteGoods = () => {
// 通过emit来定义自定义名称和值,deleteOutcome为名称,{backStatus:backStatus.value}为值
emit('deleteOutcome',{backStatus:backStatus.value}) // 回传 deleteOutcome为自定义名称
}
}
</script>
父组件
// 父组件引入子组件,通过@子组件的自定义名称关联子组件,valChange为自定义函数,子组件在触发回传deleteOutcome事件的时候,valChange函数会自动调用
<DeleteGoods @deleteOutcome="valChange"></DeleteGoods>
<script setup lang="ts">
import { ref } from "vue"
import DeleteGoods from '@/components/A_组件传值/A组件.vue' // 引入子组件
// 子组件回传的数据类型接口
interface IBackStatus {
backStatus : string
}
// 子组件事件 自带val(自定义)回调参数,在参数这里规定数据类型
const valChange = (val : IBackStatus ) => {
console.log(val); // 获取子组件的值 打印 user2
}
</script>
多个值的组件传值
上面演示了父子组件的单个传值,多个传值也是一样的,在组件上增加自定义名称或自定义事件即可。
父组件传值其实只需要定义好值和接收触发子组件回传事件即可,其余的什么也不用做,更多的是在子组件内完成的,子组件需要接收父组件的传值和回传子组件的值,如下:
父组件
/*
:father="userStatus" // 父传子
:moreA="moreA" // 父传子
@moreB="moreB" // 子传父
@deleteOutcome="valChange" // 子传父
*/
<DeleteGoods
:father="userStatus"
:moreA="moreA"
@moreB="moreB"
@deleteOutcome="valChange"
>
</DeleteGoods>
// 子组件事件
interface IBackStatus {
backStatus : string
}
const valChange = (val : IBackStatus) => {
console.log(val); // 获取子组件的值
userStatus.value = val.backStatus // 更改父组件的值
}
// 子组件事件2
interface IBoreB {
moreB : number
}
const moreB = (val : IBoreB) => {
console.log(val); // 子组件的值
moreA.value = val.moreB // 更改父组件的值
}
子组件
// 接收父组件的值
const fatherElement = defineProps({
// 接收传值 此处的father就是父组件的自定义名称
father:{
type:String, // 数据类型
default:"未传值" // 未传值时的默认值
},
moreA:{
type:Number, // 数据类型
default:"未传值" // 未传值时的默认值
}
})
// 回传子组件的值
const emit = defineEmits(['deleteOutcome','moreB'])
const backStatus = ref<string>('back')
const deleteGoods = () => {
emit('deleteOutcome',{backStatus:backStatus.value}) // 回传
emit('moreB',{moreB:200}) // 回传
}
}
需要注意地方
- 父传子的数据是单向绑的,而且是同步的,父组件的值更改,子组件的值也会同时更改,子组件不能更改父组件传来的值,因为它是只读的。
- 子组件不能直接操纵父组件的值,只能通过子传父,触发子传父的自定义事件,在这个事件里更改父组件的值。
- 子组件回传后,父组件这里接收的自定义事件会自动触发。
- ts中,数据回传时需要注意数据类型,父子组件的数据类型不一致会报错。
关于兄弟组件传值,请看另一篇:vue3 语法糖setup 兄弟组件传值
案例源码:https://gitee.com/wang_fan_w/ts-seminar
如果觉得这篇文章对你有帮助,欢迎点亮一下star
vue3语法糖+ts组件传值的更多相关文章
- v-model语法糖在组件中的使用
原文地址 v-model 主要是用于表单上数据的双向绑定 一:基本 1:主要用于 input,select,textarea,component 2:修饰符: .lazy- 取代input监听chan ...
- vue3 学习笔记(九)——script setup 语法糖用了才知道有多爽
刚开始使用 script setup 语法糖的时候,编辑器会提示这是一个实验属性,要使用的话,需要固定 vue 版本. 在 6 月底,该提案被正式定稿,在 v3.1.3 的版本上,继续使用但仍会有实验 ...
- vue组件化之模板优化及注册组件语法糖
vue组件化之模板优化及注册组件语法糖 vue组件化 模板 优化 在 https://www.cnblogs.com/singledogpro/p/12054895.html 这里我们对vue.js ...
- 盘点Vue2和Vue3的10种组件通信方式(值得收藏)
Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异:本文将通过选项式API 组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式.其中将要实现的通信 ...
- VUE v-model 语法糖
v-model 语法糖 描述:弹出利用v-model语法糖 父组件 子组件
- 基于SqlSugar的开发框架循序渐进介绍(11)-- 使用TypeScript和Vue3的Setup语法糖编写页面和组件的总结
随着Vue3和TypeScript的大浪潮不断袭来,越来越多的Vue项目采用了TypeScript的语法来编写代码,而Vue3的JS中的Setup语法糖也越来越广泛的使用,给我们这些以前用弱类型的JS ...
- vue2使用组件进行父子互相传值的sync语法糖方法和原生方法
原生方法:(事件名可以不在props通道里) 子类通过props通道绑定父类里data里的jjjjjj(@:fefefeff='jjjjjjjjjjjjj') 父组件通过监听fefeff事件来把子类传 ...
- Vue3中setup语法糖学习
目录 1,前言 2,基本语法 2,响应式 3,组件使用 3.1,动态组件 3.2,递归组件 4,自定义指令 5,props 5.1,TypeScript支持 6,emit 6.1,TypeScript ...
- 【Vue3.0】关于 script setup 语法糖的用法
script setup - 简介 先来看一看官网关于 <script setup> 的介绍: 要彻底的了解 setup 语法糖,你必须先明确 setup() 这个 组合式API 官网中对 ...
- Vue3语法快速入门以及写一个倒计时组件
Vue3写一个倒计时组件 vue3 beta版本发布已有一段时间了,文档也大概看了一下,不过对于学一门技术,最好的方法还是实战,于是找了一个比较简单的组件用vue3来实现,参考的是vant的count ...
随机推荐
- 微服务系列之服务注册发现 Consul
1.为什么需要服务注册与发现 微服务架构中,服务于服务之间内部通信必不可少,比如A服务调用B服务,起初我们的做法是,A服务从配置文件中拿到B服务的IP.端口地址,进行访问,本身是没什么问题的,但是 ...
- 3. qtdesinger的使用方法
专栏地址 ʅ(‾◡◝)ʃ windows 上使用 qtdesigner 找到那个路径直接打开就行了 linux 上使用 qtdesigner 打开 qtcreator 软件 1. 启动软件,新建项目 ...
- lightdm开机无法自启问题
简述 由于我学习了 systemctl disable 服务 这条命令,然后开始皮,把 lightdm 自启动关了,然后开不开了 解决办法:重置 lightdm 服务配置 sudo dpkg-reco ...
- 腾讯云数据库SaaS致力于构建数据库分布式云,为更多更广的用户提供服务
大数据时代,数据库 SaaS 是企业实现降本增效和业务创新的重要抓手.在腾讯全球数字生态大会数据库 SaaS 专场上,腾讯云发布了多项数据库 SaaS 产品能力升级,并重点分享了其在上云.日常运维.数 ...
- MySQL的select for update用法
MySQL中的select for update大家应该都有所接触,但什么时候该去使用,以及有哪些需要注意的地方会有很多不清楚的地方,我把我如何使用和查询到的文档在此记录. 作用 select本身是一 ...
- Day37:正则表达式详解
正则表达式 1.1 概述 正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性. 比如我们在网站上输入用户账号,要求我们输入的账号信息要符合账号的格式,而校验我们输入的账号格式是否正确 ...
- python模块的含义
目录 模块简介 模块的本质 python模块的历史 python模块的表现形式 模块的分类 导入模块的两种句式 强调 import句式 import流程推导 练习 from...import...句式 ...
- 什么是Rabbitmq消息队列? (安装Rabbitmq,通过Rabbitmq实现RPC全面了解,从入门到精通)
目录 Rabbitmq 一: 消息队列介绍 1.介绍 2.MQ解决了什么问题 1.应用的解耦 2.流量削峰 3.消息分发(发布订阅: 观察者模式) 4.异步消息(celery就是对消息队列的封装) 3 ...
- python之路51 聚合查询 分组查询
图书管理系统 1.表设计 先考虑普通字段再考虑外键字段 数据库迁移.测试数据录入 2.首页展示 3.书籍展示 4.书籍添加 5.书籍编辑 后端如何获取用户想要编辑的数据.前端如何展示出待编辑的数据 6 ...
- P8855 [POI2002]商务旅行
简要题意 给出一个 \(N\) 个节点的树和一个长度为 \(M\) 的序列 \(S\).你需要从 \(1\) 出发,依次经过 \(S\) 中的所有点,求至少需要经过的边数. \(1 \le N \le ...