在开发中有些功能是通用的,而且逻辑大致相同,像这种东西可以封成一个组件,比较常用的就是函数封装,组件封装,组件封装是需要引入到页面使用的,所以通常它会有一些自己的方法,父子组件可以通过一些值来进行关联,这种方式也就是我们所说的组件传值,vue3+ts的组件传值其实就是组件传值加上了数据类型约束,并没有什么区别。

这里主要介绍vue3setup语法糖组件传值,以删除功能为例子,父子组件主要用到definePropsdefineEmits来实现组件传值。

父传子

这里通过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组件传值的更多相关文章

  1. v-model语法糖在组件中的使用

    原文地址 v-model 主要是用于表单上数据的双向绑定 一:基本 1:主要用于 input,select,textarea,component 2:修饰符: .lazy- 取代input监听chan ...

  2. vue3 学习笔记(九)——script setup 语法糖用了才知道有多爽

    刚开始使用 script setup 语法糖的时候,编辑器会提示这是一个实验属性,要使用的话,需要固定 vue 版本. 在 6 月底,该提案被正式定稿,在 v3.1.3 的版本上,继续使用但仍会有实验 ...

  3. vue组件化之模板优化及注册组件语法糖

    vue组件化之模板优化及注册组件语法糖 vue组件化 模板 优化  在 https://www.cnblogs.com/singledogpro/p/12054895.html 这里我们对vue.js ...

  4. 盘点Vue2和Vue3的10种组件通信方式(值得收藏)

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异:本文将通过选项式API 组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式.其中将要实现的通信 ...

  5. VUE v-model 语法糖

    v-model 语法糖 描述:弹出利用v-model语法糖 父组件 子组件

  6. 基于SqlSugar的开发框架循序渐进介绍(11)-- 使用TypeScript和Vue3的Setup语法糖编写页面和组件的总结

    随着Vue3和TypeScript的大浪潮不断袭来,越来越多的Vue项目采用了TypeScript的语法来编写代码,而Vue3的JS中的Setup语法糖也越来越广泛的使用,给我们这些以前用弱类型的JS ...

  7. vue2使用组件进行父子互相传值的sync语法糖方法和原生方法

    原生方法:(事件名可以不在props通道里) 子类通过props通道绑定父类里data里的jjjjjj(@:fefefeff='jjjjjjjjjjjjj') 父组件通过监听fefeff事件来把子类传 ...

  8. Vue3中setup语法糖学习

    目录 1,前言 2,基本语法 2,响应式 3,组件使用 3.1,动态组件 3.2,递归组件 4,自定义指令 5,props 5.1,TypeScript支持 6,emit 6.1,TypeScript ...

  9. 【Vue3.0】关于 script setup 语法糖的用法

    script setup - 简介 先来看一看官网关于 <script setup> 的介绍: 要彻底的了解 setup 语法糖,你必须先明确 setup() 这个 组合式API 官网中对 ...

  10. Vue3语法快速入门以及写一个倒计时组件

    Vue3写一个倒计时组件 vue3 beta版本发布已有一段时间了,文档也大概看了一下,不过对于学一门技术,最好的方法还是实战,于是找了一个比较简单的组件用vue3来实现,参考的是vant的count ...

随机推荐

  1. php 导出图片为pdf

    require_once ROOTPATH . 'tcpdf/vendor/autoload.php';$html='';if($html){ mpdf($html); }else{ echo &qu ...

  2. DRF认证流程及源码分析

    认证 前言 用户验证用户是否合法登陆. 部分内容在DRF视图的使用及源码流程分析讲解,建议先看讲解视图的这篇文章. 使用流程 认证使用的方法流程如下: 自定义认证类,继承BaseAuthenticat ...

  3. .NET 6 基于IDistributedCache实现Redis与MemoryCache的缓存帮助类

    本文通过IDistributedCache的接口方法,实现Redis与MemoryCache统一帮助类.只需要在配置文件中简单的配置一下,就可以实现Redis与MemoryCache的切换. 目录 I ...

  4. Linux 常用命令(持续更新)

    Linux常用命令介绍(备查) *所有的命名都可以用 命令 --help/man 命令 查看使用说明 1.pwd 显示当前路径 2.dir 和 ls用法一样 都是列出当前路径下的文件(不包括隐藏文件) ...

  5. python虚拟环境和venv的使用

    目录 1.环境与虚拟环境 2.查看帮助 3.--system-site-package 命令 4.创建虚拟环境 5.激活/关闭虚拟环境 6.保存和复制虚拟环境 7.改变虚拟环境所指向的真实python ...

  6. Linux 下使用Docker 安装 LNMP环境 超详细

    首先在阿里云购买了一台服务器 选择了华南-深圳地区 操作系统选用了 CentOS8.0 64位 1. 初始化账号密码 登陆xshell,开始装Docker 一.安装docker 1.Docker 要求 ...

  7. 网络工具netstat与ss

    建议使用ss命令,2001年的时候netstat 1.42版本之后就没更新了,之后取代的工具是ss.netstat命令在很多场景下比较慢.ss可以显示跟netstat类似的信息,但是速度却比netst ...

  8. Jmeter 之连接数据库

    1.下载mysql-connector-java-5.1.7-bin.jar 2.下载后将该jar包放于bin目录下,如:D:\Program Files\apache-jmeter-5.2\bin ...

  9. MyBatis是如何初始化的?

    摘要:我们知道MyBatis和数据库的交互有两种方式有Java API和Mapper接口两种,所以MyBatis的初始化必然也有两种:那么MyBatis是如何初始化的呢? 本文分享自华为云社区< ...

  10. 【转载】SQL SERVER 通过对汉字、字母和数字的Unicode码区间的判断来识别字符串

    A~Z :65~90 a~z :97~122 0-9 : 48-57   –汉字unicode编码范围:[0x4e00,0x9fa5](或十进制[19968,40869])   SELECT * FR ...