vue3.3最新发布defineProps,generic,defineEmits,defineSlots教程

文章详细介绍了Vue3.3中defineProps的改进,如设置默认值,以及使用通用类型generic进行更灵活的接口定义。同时,文章阐述了defineEmits的优化,简化了事件类型的声明方式。此外,还讲解了defineSlots如何用于约束插槽的类型,增强代码的可维护性。
摘要由CSDN通过智能技术生成

vue3.3最新发布defineProps,generic,defineEmits,defineSlots教程

以下内容是目前vue3.3版本部分发布内容的比较详细的使用方法,如果有不对的地方,欢迎指出.

我会持续更新vue3的相关内容,谢谢!

此外,我还会定期更新最新的前端资讯,欢迎关注我,谢谢!

vue3.3已更新


defineProps的改进


比如我们有一个组件,它的接口是这样的

interface people{
    name:string,
    age:number
}
export type {people}

那我们在使用的时候,就可以这样

<script lang="ts" setup>
import {people} from './interface'
defineProps<people>()
</script>

<template>
  <h1>{{ name }}</h1>
</template>

在父组件中调用

<HelloWorld name="any" :age="20" />

子组件中的defineProps也可以使用多个条件

<script lang="ts" setup>
import {people} from './interface'
defineProps<people&{speak?:string}>()
</script>

<template>
  <h1>{{ name }}</h1>
  <h2>{{ speak }}</h2>
</template>

父组件

 <HelloWorld name="any" :age="20" speak="hello world"/>

感谢 @仟白 提供的反馈关于"使用3.3 的话 props默认值如何设置?"

withDefaults(defineProps<people>(),{
name:'anny',
age:20
})

通用类型 generic


这里继续使用上面的接口:

interface people{
    name:string,
    age:number
}

子组建中的defineProps可以使用通用类型

<script setup lang="ts" generic="U extends people">
import { people } from '../interface'
defineProps<{
  peopleObj:U
}>()
</script>

<template>
  <h1>{{ peopleObj }}</h1>
</template>

父组件中调用

<HelloWorld :peopleObj="{ name: 'any', age: 20 }" />

defineEmits 的改进


现在抛出事件的时候,我们可以更方便的设置事件的类型

看下之前的调用方法:

const emit = defineEmits<{
  (e: 'foo', id: number): void
}>()
emit('foo', 1)

父组件中调用

<HelloWorld @foo="foo" />

现在我们可以这样写:

const emit = defineEmits<{
  foo:[id:number]
}>()
emit('foo', 1)

父组件中调用

<HelloWorld @foo="foo" />

defineSlots 的使用


我们可以使用defineSlots来定义插槽的类型

首先看个例子,让我们定义一个插槽

<slot name="main"></slot>

父组件

  <HelloWorld >
    <template #main>
      <h1>hello world !</h1>
    </template>
  </HelloWorld>

可以看出来,以上一个具名插槽。

接下来我们将使用defineSlots来约束一个作用域插槽

子组件:

<script setup lang="ts">
defineSlots<{
  main?: (props: { msg: string }) => any
}>()
</script>

<template>
  <slot name="main" msg="tony"></slot>
</template>

其中,defineSlots中的main就是我们定义的插槽名称,props就是我们定义的插槽的参数,any就是我们定义的插槽的返回值。

这里我们限制了插槽的名称为main,并且插槽的参数为msg,返回值为any

看下父组件的调用:

  <HelloWorld >
    <template #main="slotProps">
      <h1>hello world {{slotProps.msg}}!</h1>
    </template>
  </HelloWorld>

需要注意的是,它们有一些限制:
当前的一些限制:

  1. volar / vue-tsc 中尚未实现必需的插槽检查。
  2. 插槽函数返回类型目前被忽略,可以是any,但我们将来可能会利用它来检查插槽内容。
要在WebStorm中正确识别Vue 3的withDefaults、definePropsdefineEmits,您需要进行以下配置步骤: 1. 确保您的WebStorm版本是最新的,以便获得对Vue 3的最新支持。 2. 在您的Vue 3项目中,确保已安装了Vue 3的相关依赖。您可以通过运行以下命令来安装最新版本的Vue 3: ```bash npm install vue@next ``` 3. 确保您的WebStorm正确配置了Vue.js的语言支持。您可以按照以下步骤进行配置: - 打开WebStorm的设置(Preferences)。 - 在左侧导航栏中选择 "Languages & Frameworks"。 - 选择 "JavaScript",然后在右侧的 "JavaScript language version" 下拉菜单中选择 "ECMAScript 6" 或更高版本。 - 在左侧导航栏中选择 "Vue.js"。 - 在右侧的 "Version" 下拉菜单中选择 "Vue 3.x"。 4. 如果您仍然无法识别withDefaults、definePropsdefineEmits,请尝试手动添加类型声明文件。创建一个名为 `shims-vue.d.ts` 的文件,并将以下内容添加到文件中: ```typescript declare module 'vue' { export function withDefaults<T>(component: T): T; export function defineProps<T extends Record<string, unknown>>(props: T): T; export function defineEmits<T extends Record<string, (...args: any[]) => any>>(emits: T): T; } ``` 5. 确保您的WebStorm已重新加载项目,然后尝试使用withDefaults、definePropsdefineEmits时,应该能够正确识别它们的类型。 通过以上配置,您应该能够在WebStorm中正确识别Vue 3的withDefaults、definePropsdefineEmits。如果仍然遇到问题,请确保您的项目正确配置并且已安装了正确的依赖。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一拖再拖 一拖再拖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值