在开发中有些功能是通用的,而且逻辑大致相同,像这种东西可以封成一个组件,比较常用的就是函数封装,组件封装,组件封装是需要引入到页面使用的,所以通常它会有一些自己的方法,父子组件可以通过一些值来进行关联,这种方式也就是我们所说的组件传值,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. php7怎么安装memcache扩展

    php7安装memcache扩展 1.下载文件,解压缩 memcache windows php7下载地址: https://github.com/nono303/PHP7-memcache-dll ...

  2. 【zookeeper】Zookeeper相关概念、重难点(myid)、语法、使用、工具

    1234567890 1请按照我是想额度插入fvtgb6yhn7ujm8ik,9ol.

  3. 【Shell案例】【tail/head/sed、echo $res ·· cat和管道】2、打印文件的最后5行

    描述经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowcoder.txt中的最后5行示例:假设 nowcoder.txt 内容如下: #include& ...

  4. 你的项目使用Optional了吗?

    1.基本概念 java.util.Optional<T>类本质上就是一个容器,该容器的数值可以是空代表一个值不存在,也可以是非空代表一个值存在. 2.获取对象 2.1 相关方法 2.2 案 ...

  5. 基于人人框架--本地项目部署流程(前后端+IIS上传功能)

    基于人人框架--本地项目部署流程(前后端+IIS上传功能) 一.环境要求 JAVA环境 JDK:1.8 IIS 本地电脑必须要有IIS服务 MySQL 数据库采用MySQL数据库,安装版本为 5.7. ...

  6. Vue 响应式原理模拟以及最小版本的 Vue的模拟

    在模拟最小的vue之前,先复习一下,发布订阅模式和观察者模式 对两种模式有了了解之后,对Vue2.0和Vue3.0的数据响应式核心原理 1.Vue2.0和Vue3.0的数据响应式核心原理 (1).  ...

  7. uniapp安装和使用

    工具安装 开发uni-app需要安装HBuilder X. 下载地址:https://www.dcloud.io/hbuilderx.html. 下载成功后直接解压即可 创建第一个uni-app 点击 ...

  8. UVA 673 Paretheses Balance

    原题Vjudge 题目大意 怼给你一堆括号,判断是否合法 有三条规则 (1)空串合法 (2)如果\(A和B\)都合法,则\(AB\)合法(例如:\(()和[]\)都合法,则\(()[]\)合法) (3 ...

  9. vue3+ts 全局事件总线mitt

    Mitt 在vue3中 $ on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了.然而我们习惯了使用EventBus,对于这种情况 ...

  10. wsl2 kali修改语言

    直接执行sudo dpkg-reconfigure locales 会提示 dpkg-query: package 'locales' is not installed and no informat ...