一、父传子的TS写法(defineProps)

父组件

<template><DefinePropsRuntime title="我是标题" :list="list"/>
</template><script lang='ts'>import DefinePropsRuntime from "./defineProps-runtime.vue"const list = [{ id: 1, content: '1' },{ id: 2, content: '2' }]
</script>

子组件

<template><h1>我是子组件</h1><p>{{title}}</p><ul><li v-for="it in list" :key="it.is">{{ it.content }}</li></ul>
</template><script lang='ts'>defineProps<{title?: string, //加了?:就是可传可不传list: {id: number, content: string}[], // 这里就是获取一个{id: number, content: string}类型的数组}>()
</script>

也可以用interface定义{id: number, content: string}

<template><h1>我是子组件</h1><p>{{title}}</p><ul><li v-for="it in list" :key="it.is">{{ it.content }}</li></ul>
</template><script lang='ts'>interface list {id: number,content: string}defineProps<{title?: string, //加了?:就是可传可不传list: list[], // 这里就是获取一个list类型的数组}>()
</script>

有没有发现上面用TS写的不可以写默认值,怎么解决呢

用withDefaults:第一个参数是defineProps, 第二个参数是一个对象 对象里面的属性是父组件传值的属性,直接给属性赋值

<template><h1>我是子组件</h1><p>{{title}}</p><ul><li v-for="it in list" :key="it.is">{{ it.content }}</li></ul>
</template><script lang='ts'>interface list {id: number,content: string}const props = withDefaults(defineProps<{title?: string, //加了?:就是可传可不传list: list[], // 这里就是获取一个list类型的数组}>(), {title: "默认值"})
</script>

二、自定义事件TS写法(defineEmits)

父组件

<template><p>{{ count }}</p><InfoTs@parentClick="parentClick"@parentChange="parentChange"/>
</template><script lang='ts'>import { ref } from "vue"import InfoTs from "./info-ts.vue"const parentClick = () => {count.value += data;}const parentChange = () => {alert("子组件触发了父组件的parentChange")}const count = ref(1)
</script>​

子组件

<template><button @click="handleClick">触发handleClick事件,并传递2给父组件</button><div>点击触发handleChange事件 <input type="checkbox" name="" id="" @change="handleChange"></div>
</template><script setup lang="ts">const emit = defineEmits<{(e: 'parentClick', data: number): void,(e: 'parentChange'): void}>();const handleClick = () => {emits('parentClick', 2)}const handleChange = () => {emits('handleChange')}
</script>

总结说明:

const emit = defineEmits<{(e: 'parentClick', data: number): void,(e: 'parentChange'): void
}>();

因为defineEmits()返回的是一个函数, 所以我们定义泛型的时候也是定义成函数类型

参数一: e的值是事件名

参数二: data传递的参数,可以给data定义类型

返回值为空就写:void

三、显示的暴露(defineExpose)(不推荐使用   因为这个要操作DOM)

概述:<script setup>的组件下,通过模板属性ref或则$parent链获取到的组件实例,并不会暴露任何在<script setup>中声明的绑定(变量,函数)

为了在<script setup>组件中明确要暴露出去的属性,那么就需要使用defineExpose这个宏命令。

子组件

<template><h1>setup</h1>{{ count }}
</template><script setup lang="ts">import { ref } from "vue"const count = ref(2);const handle = () => {const.log("这个是子组件的方法")}defineExpose({count, // 暴露count属性出去handle,})
</script>​

父组件

<template><InfoSetup ref="InfoRef" />
</template><script setup lang="ts">import { ref, onMounted } from "vue"import InfoSetup from "./info-setup"const InfoRef = ref<{count: number, handle: () => void} | null>(null);onMounted(() => {console.log(InfoRef.value?.count); // 2   //这里必须放? 因为不确定有没有countInfoRef.value?.handle()})
</script>

上面还能更简洁:

子组件

<template><h1>setup</h1>{{ count }}
</template>// 多加这个
<script lang="ts">export default {}
</script><script setup lang="ts">import { ref } from "vue"const count = ref(2);const handle = () => {const.log("这个是子组件的方法")}
</script>​

四、useSlots(获取插槽组件的信息)、useAttrs(获取插槽组件属性)

父组件

<template><Info class="test" data-a="paopao" :data="1"><template #header> // 具名插槽  #是v-slot简写<p>父组件使用了具名插槽</p></template><template #footer><p>父组件使用了 footer具名插槽</p></template></Info>
</template><script setup lang="ts">import Info from "./info.vue"
</script>

子组件

<template><h1>info</h1><slot name="header" /><slot name="footer" />
</template><script setup lang="ts">import { onMounted, useSlots, useAttrs } from "vue";const slots = useSlots();const attrs = useAttrs();onMounted( () => {// 注意不能直接写slots.header(),要写 slots.header && slots.header(),否则有红色波浪线console.log(slots.header && slots.header()); // 输出的是插槽名为header的插槽组件信息console.log(slots.footer && slots.footer()); // 输出的是插槽名为footer的插槽组件信息console.log(attrs) // 打印出的是插槽组件传进来的全部属性})
</script>

五、顶层await

await的使用必须要在async语法糖的包裹下,否则将无法执行,为了更简化代码,<script setup> 中可以使用顶层await

旧的写法

使用了顶层await

六、v-bind

vue3.2的TS写法相关推荐

  1. 【前端工程化】深入浅出vite(二)--vue3全家桶+ts构建后管系统

    安装基础包 npm create vite@latest # 这里选择的是Vue+Typescript的组合 cd vue-admin npm install# 先安装基础包 npm install ...

  2. 尤大都说Vue3 + script setup + TS + Volar真香,你说香不香?

    前两天尤大官宣发布了Vue3.2,支持了好几个很不错的新特性,而且自信放话:<script setup> + TS + Volar = 真香,是时候了 想看Vue3.2更新的内容文档的读者 ...

  3. [VUE3]vue2.x中slot-scope插槽在vue3.x中的写法(以elementPlus和AntDesign为例)

    [VUE3]vue2.x中slot-scope插槽在vue3.x中的写法 elementUI vue2.x的写法 <el-table-column label="测试" al ...

  4. vue3.2+element-plus+ts节假日管理界面

    说明 由于element-plus原生的el-calendar 样式不太好看 所以在实际项目重新写了下节假日管理的页面;用到的有vue3.2+element-plus+ts 先看完整效果 调整el-c ...

  5. vue vite创建项目的使用(使用技术栈vue3+vuex+router+ts+element plus)

    文章目录 前言 创建vite项目 vite.config.ts配置 自动化引入组件配置以及.env配置的引用 创建src/vite-env.d.ts main.ts配置 api/request.ts ...

  6. Vue3中methods的写法可以这样写

    vue3中methods的写法 import { reactive } from "vue"; export default {setup() {const data = reac ...

  7. vue3.0的多种写法,你喜欢哪种呢?

    第一种写法: <template><div>defineComponent</div><div>{{ topinset }}</div>&l ...

  8. 推荐一个 Vue3 全家桶 + TS+ Vite2 + element-plus 的网站实战项目

    五一期间,花了 3 天时间,边学 Vue3 和 Vite2,边重构自己的项目,终于都用 Vue3 + TypeScript + Vite2 + Vuex4 + Vue-Router4 + elemen ...

  9. Vue3.2(语法糖写法) 入门推荐

    前言:距vue3.2发布已一年有余,3.2新增的setup的语法糖写法 作为紧跟时代的前端开发者是必须要会的,多一项技能也就多一项能在时代洪流中争渡的本钱,本文主要是介绍一些vue3.2日常中用到的比 ...

最新文章

  1. Visual Studio进行Web性能测试- Part III
  2. OpenCV4 C++学习 必备基础语法知识二
  3. C# winform 上传文件 (多种方案)
  4. LightOJ 1074 Extended Traffic(spfa+dfs标记负环上的点)
  5. 【渝粤教育】国家开放大学2018年秋季 0550-22T素描(一) 参考试题
  6. java 什么叫异或_Java中 ^异或
  7. 中国计算机类核心期刊
  8. Scratch3.0创意编程(基础篇):第11课 智能小车
  9. es6 箭头函数 模板字符串 点点点运算符
  10. mfc100u.dll丢失的解决方法
  11. ARM CM0 push和pop指令
  12. QQ是怎么实现通讯的
  13. c语言判断学生成绩等级用switch,switch语句判断学生成绩
  14. LaTeX错误 Misplaced alignment tab character
  15. 中软国际面试题及答案
  16. centos7修改宝塔面板端口6666无法访问
  17. G120变频器本地_远程切换(CDS切换)的具体方法和步骤
  18. destoon首页底部加产品分类拼音索引
  19. openwrt下wifi配置详细细节
  20. 【区间dp】括号序列再战猪猪侠

热门文章

  1. 线性代数-MIT 18.06-7(a)
  2. 网赚小项目,聊天挣钱,打字聊天就能挣钱的方法
  3. Python - 列表补充(二)
  4. 关系型数据库和非关系型数据
  5. 计算机专业试讲10分钟教案,10分钟试讲教案模板.doc
  6. linux网络连接红叉号,win10能上网,但右下角宽带连接图标显示红叉的解决方法
  7. 智能家居创意产品一智能插座
  8. AD18添加LOGO图标更改大小
  9. 关于 WEB/HTTP 调试利器 Fiddler 的一些技巧分享
  10. Android App收不到推送的消息