Vue 3.3 新功能defineProps、defineEmits、defineSlots、generic的使用

本文详细介绍了在Vue3的ScriptSetup语法中,如何使用defineProps定义props类型、defineEmits声明自定义事件及其参数类型以及defineSlots处理插槽和作用域。还展示了如何利用generic提高类型推断。
摘要由CSDN通过智能技术生成

目录

defineProps

defineEmits

defineSlots

generic 


defineProps

先声明一个类型,比如

export type TableProps = {
  data: Object[]
  columns: Array<{ label: string; prop: string }>
  stripe: boolean
}

然后使用defineProps接收这个类型

<script setup lang="ts">
import type { TableProps } from './types'

const props = defineProps<TableProps>()
</script>

这样 props 的类型就定义好了,在父组件中可以这样使用

<template>
<table :data="data" :columns="columns" :stripe="true"></table>
</template>

另外需要定义 props 的默认值可以使用 withDefaults

<script setup lang="ts">
import type { TableProps } from './types'

const props = withDefaults(defineProps<TableProps>(), {
    data: {},
    stripe: false
  })
</script>

defineEmits

声明自定义事件和入参类型

<script setup lang="ts">
const emit = defineEmits<{
  update: (data: Record<string>) => void
  sort: (value: boolean) => void
}>()
</script>

父组件接收事件

<template>
  <table :data="data" :columns="columns"  @sort="onSort"></table>
</template>

defineSlots

声明插槽和插槽作用域参数类型

<script setup lang="ts">
defineSlots<{
  header: (props: { name: string; age: number }) => void
  footer: (value: boolean) => void
}>()
</script>

父组件使用插槽,使用插槽参数

<template>
  <table :data="data" :columns="columns">
    <template #header="{ name, age }">
      <div>{{ name }} - {{ age }}</div>
    </template>
  </table>
</template>

generic 

使用 generic 可以准确的推断类型,方便在模板里面可以有准确的类型提示

可以使用 <script> 标签上的 generic 属性声明泛型类型参数

<script setup lang="ts" generic="T">
defineProps<{
  columnItem: T
  columns: T[]
}>()
</script>

也可以多个泛型类型参数

<script setup lang="ts" generic="T, U extends { label: string }">
defineProps<{
  columnItem: T
  columns: T[]
  data: U[]
}>()
</script>

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在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。如果仍然遇到问题,请确保您的项目正确配置并且已安装了正确的依赖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值