vue3中defineProps的使用詳解
1、數(shù)組寫(xiě)法
const props = defineProps(["applyBasicInfo", "operateCommandType"]);
這是一個(gè)非?;A(chǔ)的 Vue props 聲明方式,適用于簡(jiǎn)單場(chǎng)景。以下是詳細(xì)解釋?zhuān)?/p>
代碼含義
const props = defineProps(["applyBasicInfo", "operateCommandType"]);
- 作用:聲明組件接收兩個(gè) props(屬性)
- 特點(diǎn):僅指定 prop 名稱(chēng),不進(jìn)行任何類(lèi)型校驗(yàn)
- 等價(jià)于:
defineProps({
applyBasicInfo: null, // 無(wú)類(lèi)型檢查
operateCommandType: null // 無(wú)類(lèi)型檢查
})關(guān)鍵特性分析
1.極簡(jiǎn)聲明
- 只聲明 props 的名稱(chēng)(字符串?dāng)?shù)組)
- 不校驗(yàn)類(lèi)型
- 沒(méi)有默認(rèn)值
- 不強(qiáng)制 required
2.適用場(chǎng)景
- 快速原型開(kāi)發(fā)
- 不需要類(lèi)型檢查的簡(jiǎn)單組件
- 臨時(shí)過(guò)渡代碼
3.實(shí)際效果
<!-- 父組件 --> <ChildComponent :applyBasicInfo="任何類(lèi)型的數(shù)據(jù)" <!-- 可以是對(duì)象、字符串、數(shù)字等 --> operateCommandType="任何內(nèi)容" <!-- 可以是任意類(lèi)型 --> /> <!-- 子組件 --> <script setup> // 使用時(shí)需要自行確保類(lèi)型正確 console.log(props.applyBasicInfo) // 可能是任意類(lèi)型 </script>
與其他聲明方式的對(duì)比
| 特性 | 數(shù)組寫(xiě)法 | 對(duì)象寫(xiě)法(完整) | TypeScript 類(lèi)型寫(xiě)法 |
|---|---|---|---|
| 類(lèi)型校驗(yàn) | ? 無(wú) | ? Vue 運(yùn)行時(shí)校驗(yàn) | ? 編譯時(shí)校驗(yàn) |
| 默認(rèn)值 | ? 不能設(shè)置 | ? 通過(guò) default 設(shè)置 | ? 通過(guò) withDefaults 設(shè)置 |
| 必需性控制 | ? 默認(rèn)都是可選 | ? 通過(guò) required 控制 | ? 通過(guò) ? 符號(hào)控制 |
| 類(lèi)型提示 | ? 無(wú) | ?? 基礎(chǔ)類(lèi)型提示 | ? 完整類(lèi)型提示 |
| 代碼安全性 | ?? 低(可能運(yùn)行時(shí)出錯(cuò)) | ?? 中(有基礎(chǔ)校驗(yàn)) | ?? 高(編譯時(shí)攔截錯(cuò)誤) |
潛在風(fēng)險(xiǎn)示例
<!-- 父組件傳遞錯(cuò)誤類(lèi)型 --> <ChildComponent :applyBasicInfo="123" <!-- 傳遞數(shù)字 --> operateCommandType <!-- 未傳遞 --> /> <!-- 子組件使用時(shí) --> <script setup> // 可能引發(fā)運(yùn)行時(shí)錯(cuò)誤 props.applyBasicInfo.name // 報(bào)錯(cuò):數(shù)字沒(méi)有 name 屬性 props.operateCommandType // 拼寫(xiě)錯(cuò)誤也不會(huì)警告(正確是 operateCommandType) </script>
為什么要用這種寫(xiě)法?
- 歷史兼容:Vue 2 的 props 數(shù)組寫(xiě)法在 Vue 3 中仍然可用
- 快速開(kāi)發(fā):節(jié)省寫(xiě)類(lèi)型校驗(yàn)的時(shí)間
- 簡(jiǎn)單場(chǎng)景:當(dāng) props 類(lèi)型不重要或可以確定時(shí)
如何改進(jìn)?
基礎(chǔ)改進(jìn)(添加類(lèi)型校驗(yàn))
const props = defineProps({
applyBasicInfo: {
type: Object,
required: true
},
operateCommandType: {
type: String,
default: "view"
}
});高級(jí)改進(jìn)(TypeScript)
interface ApplyBasicInfo {
id: number;
name: string;
}
const props = defineProps<{
applyBasicInfo: ApplyBasicInfo;
operateCommandType?: string;
}>();最佳實(shí)踐建議
僅用于臨時(shí)代碼:正式項(xiàng)目建議使用完整聲明
配合 JSDoc 使用(如果不用 TypeScript):
/**
* @typedef {Object} ApplyBasicInfo
* @property {number} id
* @property {string} name
*/
const props = defineProps(["applyBasicInfo", "operateCommandType"]);漸進(jìn)式增強(qiáng):后續(xù)逐步替換為完整聲明
這種寫(xiě)法就像騎自行車(chē)不戴頭盔——簡(jiǎn)單快捷,但不夠安全。建議新手僅在快速驗(yàn)證想法時(shí)使用,正式開(kāi)發(fā)中盡量使用更完善的 props 聲明方式。
2、對(duì)象寫(xiě)法(純 JavaScript 項(xiàng)目的寫(xiě)法,運(yùn)行時(shí) props 聲明)
const props = defineProps({
applyBasicInfo: {
type: Object, // 要求必須是 Object 類(lèi)型
required: true // 表示父組件必須傳遞這個(gè)prop,不能與 default 同時(shí)使用
},
operateCommandType: {
type: String, // 要求必須是 String 類(lèi)型
default: "info-view" // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
}
});數(shù)組簡(jiǎn)寫(xiě) vs 對(duì)象寫(xiě)法
// 簡(jiǎn)寫(xiě)方式(不推薦)
defineProps(['applyBasicInfo', 'operateCommandType'])
// vs
// 當(dāng)前對(duì)象寫(xiě)法(推薦)
defineProps({
applyBasicInfo: { type: Object, required: true },
operateCommandType: { type: String, default: "info-view" }
})| 特性 | 數(shù)組寫(xiě)法 | 對(duì)象寫(xiě)法 |
|---|---|---|
| 類(lèi)型檢查 | ? 無(wú) | ? 基礎(chǔ)類(lèi)型檢查 |
| 默認(rèn)值 | ? 不可設(shè)置 | ? 可設(shè)置 |
| 必填控制 | ? 默認(rèn)全部可選 | ? 精確控制 |
| 代碼安全性 | ?? 低 | ?? 中等 |
這段代碼使用 Vue 的 defineProps 方法聲明組件需要接收的兩個(gè) props(組件參數(shù)),并設(shè)置了參數(shù)的基本驗(yàn)證規(guī)則。
3、TypeScript 的類(lèi)型聲明寫(xiě)法
3.1、使用標(biāo)準(zhǔn)的PropType進(jìn)行對(duì)象類(lèi)型定義
import type { PropType } from "vue";
import type { ApplyBasicInfo } from "@/interface";
const props = defineProps({
applyBasicInfo: {
type: Object as PropType<ApplyBasicInfo>, // 使用標(biāo)準(zhǔn)的PropType進(jìn)行對(duì)象類(lèi)型定義
required: true // 表示父組件必須傳遞這個(gè)prop,不能與 default 同時(shí)使用
},
operateCommandType: {
type: String,
default: "info-view" // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
}
});關(guān)鍵概念拆解
1. 類(lèi)型導(dǎo)入部分
import type { PropType } from "vue";
import type { ApplyBasicInfo } from "@/interface";PropType:Vue 提供的類(lèi)型工具,用于在運(yùn)行時(shí)聲明中指定復(fù)雜類(lèi)型ApplyBasicInfo:自定義的業(yè)務(wù)數(shù)據(jù)類(lèi)型(通常定義在src/interface.ts等位置)import type:TypeScript 語(yǔ)法,表示只導(dǎo)入類(lèi)型信息,不導(dǎo)入實(shí)際代碼
2. 核心 props 聲明
applyBasicInfo: {
type: Object as PropType<ApplyBasicInfo>, // 類(lèi)型斷言
required: true
}Object:Vue 的運(yùn)行時(shí)類(lèi)型校驗(yàn)(基礎(chǔ)對(duì)象類(lèi)型)as PropType<ApplyBasicInfo>:類(lèi)型斷言,告訴 TypeScript 這個(gè)對(duì)象的具體結(jié)構(gòu)
雙重效果:
- 運(yùn)行時(shí):Vue 檢查傳入的是否為對(duì)象
- 開(kāi)發(fā)時(shí):TypeScript 檢查對(duì)象是否符合
ApplyBasicInfo的結(jié)構(gòu)
3. 對(duì)比普通對(duì)象聲明
// 普通寫(xiě)法(只有 Vue 校驗(yàn))
applyBasicInfo: {
type: Object, // 只知道是個(gè)對(duì)象,不清楚具體結(jié)構(gòu)
required: true
}
// 當(dāng)前寫(xiě)法(Vue校驗(yàn) + TS類(lèi)型)
applyBasicInfo: {
type: Object as PropType<ApplyBasicInfo>, // 明確對(duì)象結(jié)構(gòu)
required: true
}工作原理圖示
graph TD
A[父組件傳遞 props] --> B{Vue 運(yùn)行時(shí)校驗(yàn)}
B -->|通過(guò)| C[組件內(nèi)使用]
B -->|不通過(guò)| D[控制臺(tái)警告]
C --> E[TypeScript 類(lèi)型檢查]
E -->|類(lèi)型正確| F[正常開(kāi)發(fā)]
E -->|類(lèi)型錯(cuò)誤| G[IDE 提示錯(cuò)誤]為什么要這樣寫(xiě)?
優(yōu)勢(shì)對(duì)比表
| 特性 | 普通 Object 類(lèi)型 | 當(dāng)前寫(xiě)法 |
|---|---|---|
| 代碼提示 | 只知道是對(duì)象,無(wú)具體屬性提示 | ? 顯示 ApplyBasicInfo 的所有屬性 |
| 重構(gòu)安全性 | 修改屬性時(shí)不會(huì)報(bào)錯(cuò) | ? 修改接口定義會(huì)引發(fā)相關(guān)代碼報(bào)錯(cuò) |
| 參數(shù)校驗(yàn) | 只校驗(yàn)是否是對(duì)象 | ? 運(yùn)行時(shí)對(duì)象校驗(yàn) + 類(lèi)型結(jié)構(gòu)校驗(yàn) |
| 協(xié)作效率 | 需要查文檔看數(shù)據(jù)結(jié)構(gòu) | ? 直接通過(guò)提示查看數(shù)據(jù)結(jié)構(gòu) |
示例類(lèi)型定義
// 假設(shè)在 @/interface 中
interface ApplyBasicInfo {
id: number; // 申請(qǐng)ID
applicant: string; // 申請(qǐng)人姓名
status: 'pending' | 'approved'; // 申請(qǐng)狀態(tài)
createTime: Date; // 創(chuàng)建時(shí)間
}在組件中的實(shí)際使用
智能提示示例
// 正確使用(有提示) props.applyBasicInfo.id // 提示 number 類(lèi)型 props.applyBasicInfo.applicant // 提示 string 類(lèi)型 // 錯(cuò)誤使用(立即報(bào)錯(cuò)) props.applyBasicInfo.APPlicant // ? 拼寫(xiě)錯(cuò)誤提示 props.applyBasicInfo.status = 'rejected' // ? 類(lèi)型不匹配
對(duì)應(yīng)模板使用
<template>
<!-- 顯示申請(qǐng)人信息 -->
<div>{{ props.applyBasicInfo.applicant }}</div>
<!-- 根據(jù)操作類(lèi)型顯示不同內(nèi)容 -->
<div v-if="operateCommandType === 'info-view'">
查看模式
</div>
</template>常見(jiàn)錯(cuò)誤及解決方案
錯(cuò)誤1:未定義接口
// 錯(cuò)誤提示:Cannot find name 'ApplyBasicInfo'
// 解決方案:確保類(lèi)型文件正確定義并導(dǎo)出
// 在 @/interface.ts 中:
export interface ApplyBasicInfo { ... }錯(cuò)誤2:錯(cuò)誤類(lèi)型傳遞
<!-- 父組件傳遞錯(cuò)誤數(shù)據(jù)結(jié)構(gòu) -->
<MyComponent :apply-basic-info="{ id: '100' }" />
<!-- 錯(cuò)誤:id 應(yīng)該是 number -->錯(cuò)誤3:缺少必要屬性
// 組件內(nèi)使用時(shí)
const submit = () => {
console.log(props.applyBasicInfo.createTime) // 如果接口中有該屬性
}
// 當(dāng)父組件傳遞的對(duì)象缺少 createTime 時(shí),TS 會(huì)報(bào)錯(cuò)不同技術(shù)棧的寫(xiě)法對(duì)比
| 場(chǎng)景 | JavaScript 寫(xiě)法 | TypeScript 基礎(chǔ)寫(xiě)法 | 當(dāng)前進(jìn)階寫(xiě)法 |
|---|---|---|---|
| props 類(lèi)型 | type: Object | type: Object | Object as PropType<T> |
| 代碼提示 | 無(wú) | 顯示 Object 類(lèi)型 | 顯示具體接口屬性 |
| 類(lèi)型安全 | 低 | 中 | 高 |
| 維護(hù)成本 | 高(需口頭溝通數(shù)據(jù)結(jié)構(gòu)) | 中(需查看接口定義) | 低(直接提示數(shù)據(jù)結(jié)構(gòu)) |
最佳實(shí)踐建議
接口定義規(guī)范:
- 在
src/types或src/interface目錄統(tǒng)一管理類(lèi)型 - 為每個(gè)接口添加文檔注釋
interface ApplyBasicInfo {
/**
* 申請(qǐng)的唯一標(biāo)識(shí)
* @example 123456
*/
id: number;
}props 校驗(yàn)增強(qiáng):
applyBasicInfo: {
type: Object as PropType<ApplyBasicInfo>,
required: true,
validator: (value: ApplyBasicInfo) => {
return !!value.id // 添加自定義校驗(yàn)邏輯
}
}默認(rèn)值處理技巧:
// 對(duì)于復(fù)雜對(duì)象,建議提供默認(rèn)值函數(shù)
applyBasicInfo: {
type: Object as PropType<ApplyBasicInfo>,
default: () => ({ id: 0, applicant: '', status: 'pending' })
}這種寫(xiě)法是 Vue 3 項(xiàng)目中平衡類(lèi)型安全和開(kāi)發(fā)效率的典型實(shí)踐,既能享受 TypeScript 的類(lèi)型提示優(yōu)勢(shì),又保留了 Vue 原有的 props 校驗(yàn)機(jī)制,特別適合中大型項(xiàng)目維護(hù)使用。
3.2、混合寫(xiě)法(結(jié)合了 Vue 的運(yùn)行時(shí) props 校驗(yàn)和 TypeScript 類(lèi)型提示的混合寫(xiě)法)
import type { ApplyBasicInfo } from "@/interface";
const props = defineProps({
applyBasicInfo: {
type: Object as () => ApplyBasicInfo, // 使用箭頭函數(shù)返回類(lèi)型
required: true // 表示父組件必須傳遞這個(gè)prop,不能與 default 同時(shí)使用
},
operateCommandType: {
type: String,
default: "info-view" // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
}
});這是一個(gè)結(jié)合了 Vue 的運(yùn)行時(shí) props 校驗(yàn)和 TypeScript 類(lèi)型提示的混合寫(xiě)法代碼,特別適用于 Vue 3 + TypeScript 項(xiàng)目。以下是逐層解析:
代碼結(jié)構(gòu)解析
import type { ApplyBasicInfo } from "@/interface"; // 導(dǎo)入類(lèi)型
const props = defineProps({
applyBasicInfo: {
type: Object as () => ApplyBasicInfo, // 核心類(lèi)型聲明
required: true
},
operateCommandType: {
type: String,
default: "info-view"
}
});關(guān)鍵部分詳解
1. 類(lèi)型導(dǎo)入
import type { ApplyBasicInfo } from "@/interface";作用:導(dǎo)入自定義類(lèi)型(通常定義在 src/interface.ts 或類(lèi)型聲明文件中)
示例類(lèi)型定義:
// 假設(shè)在 @/interface 中
interface ApplyBasicInfo {
id: number;
name: string;
status: 'pending' | 'approved';
createTime: Date;
}2. defineProps 函數(shù)
const props = defineProps({...});- Vue 3 特有語(yǔ)法:用于聲明組件接收的 props
- 返回響應(yīng)式對(duì)象:包含所有已聲明的 props
3. applyBasicInfo 屬性
{
type: Object as () => ApplyBasicInfo,
required: true
}- 運(yùn)行時(shí)類(lèi)型:
Object表示接受對(duì)象類(lèi)型(Vue 的運(yùn)行時(shí)校驗(yàn)) - 類(lèi)型斷言:
as () => ApplyBasicInfo為 TypeScript 提供類(lèi)型提示 - 實(shí)際效果:
// 使用時(shí)可以獲得類(lèi)型提示 props.applyBasicInfo.id // 提示 number 類(lèi)型 props.applyBasicInfo.name // 提示 string 類(lèi)型
4. operateCommandType 屬性
{
type: String,
default: "info-view"
}- 標(biāo)準(zhǔn) Vue 校驗(yàn):接受字符串類(lèi)型
- 默認(rèn)值:當(dāng)父組件未傳遞時(shí)默認(rèn)為 "info-view"
代碼特點(diǎn)
| 特性 | 說(shuō)明 |
|---|---|
| 雙重校驗(yàn) | Vue 運(yùn)行時(shí)類(lèi)型檢查 + TypeScript 靜態(tài)類(lèi)型提示 |
| 明確契約 | 通過(guò) ApplyBasicInfo 接口明確定義數(shù)據(jù)結(jié)構(gòu) |
| 漸進(jìn)式類(lèi)型 | 不需要完全遷移到 TypeScript 也能獲得部分類(lèi)型優(yōu)勢(shì) |
| 代碼可維護(hù)性 | 接口修改只需改動(dòng)一處定義 |
不同寫(xiě)法的對(duì)比
| 這種寫(xiě)法 | 純 TypeScript 寫(xiě)法 | 純 JavaScript 寫(xiě)法 | |
|---|---|---|---|
| 類(lèi)型提示 | ? 完整類(lèi)型提示 | ? 完整類(lèi)型提示 | ? 無(wú) |
| 運(yùn)行時(shí)校驗(yàn) | ? Vue 會(huì)校驗(yàn) Object 類(lèi)型 | ? 需額外配置 | ? 標(biāo)準(zhǔn)校驗(yàn) |
| 默認(rèn)值支持 | ? 直接通過(guò) default 設(shè)置 | ? 需要使用 withDefaults | ? 原生支持 |
| 代碼復(fù)雜度 | ?? 中等 | ?? 簡(jiǎn)潔(類(lèi)型優(yōu)先) | ?? 高(需自行維護(hù)類(lèi)型約束) |
為什么這樣寫(xiě)?
平衡開(kāi)發(fā)體驗(yàn):
- 獲得 TypeScript 的智能提示
- 保留 Vue 的運(yùn)行時(shí)校驗(yàn)安全網(wǎng)
漸進(jìn)增強(qiáng):
- 適合逐步將 JavaScript 項(xiàng)目遷移到 TypeScript
- 不需要一次性重寫(xiě)所有類(lèi)型
明確數(shù)據(jù)契約:
// 父組件使用時(shí)
<MyComponent
:apply-basic-info="{
id: 123, // ? 必須 number
name: '張三', // ? 必須 string
status: 'pending', // ? 必須是枚舉值
createTime: new Date() // ? 必須 Date
}"
/>常見(jiàn)錯(cuò)誤示例
// 錯(cuò)誤1:缺少必填字段 props.applyBasicInfo.missingProp // ? TS 報(bào)錯(cuò):屬性不存在 // 錯(cuò)誤2:類(lèi)型不匹配 props.applyBasicInfo.id = "100" // ? TS 報(bào)錯(cuò):不能將 string 賦給 number // 錯(cuò)誤3:錯(cuò)誤的值類(lèi)型 <MyComponent :apply-basic-info="'字符串'" /> // ? Vue 控制臺(tái)警告:期望 Object,得到 String
在組件中的使用
<script setup>
// 獲得智能提示
const submit = () => {
console.log(props.applyBasicInfo.id) // 正確:number 類(lèi)型
console.log(props.operateCommandType.toUpperCase()) // 正確:string 方法
}
// 類(lèi)型安全操作
const statusLabel = computed(() => {
switch(props.applyBasicInfo.status) {
case 'pending': return '審批中';
case 'approved': return '已通過(guò)';
// case 'rejected' 會(huì)觸發(fā) TS 錯(cuò)誤(如果接口中未定義)
}
})
</script>最佳實(shí)踐建議
保持接口同步:當(dāng) ApplyBasicInfo 類(lèi)型修改時(shí),需要同步更新所有使用它的組件
默認(rèn)值處理:對(duì)于復(fù)雜對(duì)象 prop,建議:
// 使用解構(gòu)默認(rèn)值
const { applyBasicInfo = DEFAULT_INFO } = toRefs(props)文檔注釋:在接口定義處添加詳細(xì)注釋
interface ApplyBasicInfo {
/** 申請(qǐng)ID,唯一標(biāo)識(shí) */
id: number;
/** 申請(qǐng)人姓名 */
name: string;
// ...
}這種寫(xiě)法特別適合需要逐步引入 TypeScript 的 Vue 項(xiàng)目,既能享受類(lèi)型系統(tǒng)的優(yōu)勢(shì),又不會(huì)完全顛覆原有的開(kāi)發(fā)模式。
3.3、與3.1等效的TypeScript 的類(lèi)型聲明寫(xiě)法
import { toRefs } from "vue";
import type { ApplyBasicInfo } from "@/interface";
const props = defineProps<{
applyBasicInfo: ApplyBasicInfo;
operateCommandType: string;
}>();
這段代碼是 Vue 3 組合式 API 中使用 TypeScript 的類(lèi)型聲明寫(xiě)法,主要用于定義組件的 props。讓我們分步詳細(xì)解釋?zhuān)?/p>
defineProps 的作用:
- 這是 Vue 3 的組合式 API 函數(shù),用于聲明組件接收的 props
- 類(lèi)似于選項(xiàng)式 API 中的
props選項(xiàng),但更符合組合式 API 的編程風(fēng)格
泛型參數(shù) <...>:
- 這是 TypeScript 的泛型語(yǔ)法,用于為 defineProps 提供類(lèi)型注解
- 泛型參數(shù)中定義了一個(gè)對(duì)象類(lèi)型,描述了這個(gè)組件接收的所有 props 及其類(lèi)型
props 具體定義:
{
applyBasicInfo: ApplyBasicInfo;
operateCommandType: string;
}a) applyBasicInfo:
b) operateCommandType:
- 聲明了組件需要接收兩個(gè) props:
- 類(lèi)型為
ApplyBasicInfo(這應(yīng)該是一個(gè)自定義的 TypeScript 類(lèi)型/接口) - 可能是一個(gè)包含申請(qǐng)基本信息的對(duì)象,比如:
interface ApplyBasicInfo {
id: number;
applicantName: string;
applyDate: Date;
// ...其他字段
}- 類(lèi)型為
string - 可能用于表示操作命令類(lèi)型,比如:"create"、"edit"、"view" 等字符串枚舉值
最終結(jié)果:
{
applyBasicInfo: { /* 具體數(shù)據(jù) */ },
operateCommandType: "edit" // 示例值
}- 定義了一個(gè)名為
props的常量 - 該常量包含兩個(gè)響應(yīng)式屬性:
在組件中的使用:
// 父組件使用 <ChildComponent :applyBasicInfo="myApplyInfo" operateCommandType="edit" /> // 子組件內(nèi)使用 console.log(props.applyBasicInfo.applicantName) console.log(props.operateCommandType)
類(lèi)型檢查:
- 如果父組件傳遞錯(cuò)誤類(lèi)型的 prop,TypeScript 會(huì)給出編譯時(shí)錯(cuò)誤
- 例如:傳遞數(shù)字類(lèi)型的 operateCommandType 會(huì)報(bào)錯(cuò)
對(duì)比 JavaScript 版本:
如果是純 JavaScript,等效寫(xiě)法可能是:
const props = defineProps({
applyBasicInfo: {
type: Object,
required: true
},
operateCommandType: {
type: String,
default: 'view'
}
})注意事項(xiàng):
- 需要確保
ApplyBasicInfo類(lèi)型已經(jīng)在項(xiàng)目中定義(通常是在獨(dú)立的類(lèi)型聲明文件中) - 這種寫(xiě)法需要 Vue 3.3+ 版本支持
- 如果不需要 TypeScript 類(lèi)型檢查,可以使用運(yùn)行時(shí)聲明方式
- 這種寫(xiě)法默認(rèn) props 都是 required 的,如果需要可選參數(shù),應(yīng)該使用
propName?: Type的語(yǔ)法
實(shí)例代碼
<script setup lang="ts" name="ApplySampleOtherTable"> // 1、數(shù)組寫(xiě)法 const props = defineProps(["applySampleData", "applySampleTableScrollTop", "operateCommandType"]); </script>
<script setup lang="ts" name="ApplySampleOtherTable">
// 2、對(duì)象寫(xiě)法
const props = defineProps({
applySampleData: {
type: Object, // 要求必須是 Object 類(lèi)型
required: true // 表示父組件必須傳遞這個(gè)prop,不能與 default 同時(shí)使用
},
applySampleTableScrollTop: {
type: Number, // 要求必須是 Number 類(lèi)型
default: 0 // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
},
operateCommandType: {
type: String, // 要求必須是 String 類(lèi)型
default: "info-add" // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
}
});
</script><script setup lang="ts" name="ApplySampleOtherTable">
import type { ApplySample } from "@/interface";
import type { PropType } from "vue";
// 3、TypeScript 的類(lèi)型聲明寫(xiě)法1:使用標(biāo)準(zhǔn)的PropType進(jìn)行對(duì)象類(lèi)型定義
const props = defineProps({
applySampleData: {
type: Object as PropType<ApplySample[]>, // 要求必須是 Object 類(lèi)型,類(lèi)型為ApplySample[]
required: true // 表示父組件必須傳遞這個(gè)prop,不能與 default 同時(shí)使用
},
applySampleTableScrollTop: {
type: Number, // 要求必須是 Number 類(lèi)型
default: 0 // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
},
operateCommandType: {
type: String, // 要求必須是 String 類(lèi)型
default: "info-add" // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
}
});
</script><script setup lang="ts" name="ApplySampleOtherTable">
import type { ApplySample } from "@/interface";
// 4、TypeScript 的類(lèi)型聲明寫(xiě)法2:結(jié)合了 Vue 的運(yùn)行時(shí) props 校驗(yàn)和 TypeScript 類(lèi)型提示的混合寫(xiě)法
const props = defineProps({
applySampleData: {
type: Object as () => ApplySample[], // 要求必須是 Object 類(lèi)型,類(lèi)型為ApplySample[],使用箭頭函數(shù)返回類(lèi)型
required: true // 表示父組件必須傳遞這個(gè)prop,不能與 default 同時(shí)使用
},
applySampleTableScrollTop: {
type: Number, // 要求必須是 Number 類(lèi)型
default: 0 // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
},
operateCommandType: {
type: String, // 要求必須是 String 類(lèi)型
default: "info-add" // 表示當(dāng)父組件沒(méi)有傳遞時(shí)使用默認(rèn)值,不能與 required 同時(shí)使用
}
});
</script><script setup lang="ts" name="ApplySampleOtherTable">
import type { ApplySample } from "@/interface";
// 5、TypeScript 的類(lèi)型聲明寫(xiě)法3:vue3的寫(xiě)法,不設(shè)置默認(rèn)值
const props = defineProps<{
applySampleData: ApplySample[];
applySampleTableScrollTop: number;
operateCommandType: string;
}>();
</script><script setup lang="ts" name="ApplySampleOtherTable">
import type { ApplySample } from "@/interface";
// 6、TypeScript 的類(lèi)型聲明寫(xiě)法3:vue3的寫(xiě)法,設(shè)置默認(rèn)值
const props = withDefaults(
// withDefaults 是 Vue3 提供的一個(gè)工具函數(shù),專(zhuān)門(mén)用于處理類(lèi)型聲明的 props 默認(rèn)值。
defineProps<{
applySampleData: ApplySample[];
applySampleTableScrollTop: number;
operateCommandType: string;
}>(),
{
// 數(shù)組類(lèi)型,使用工廠(chǎng)函數(shù)返回默認(rèn)值
applySampleData: () => [],
// 數(shù)字類(lèi)型,使用默認(rèn)值
applySampleTableScrollTop: 0,
// 字符串類(lèi)型,使用默認(rèn)值
operateCommandType: "info-add"
}
);
</script>在 Vue 3 的 <script setup> 語(yǔ)法中,當(dāng)使用 withDefaults 為對(duì)象類(lèi)型的 prop 設(shè)置默認(rèn)值時(shí),必須使用工廠(chǎng)函數(shù)返回默認(rèn)對(duì)象(用箭頭函數(shù) () => {} ),這是 Vue 設(shè)計(jì)層面的強(qiáng)制要求,主要目的是避免多個(gè)組件實(shí)例共享同一個(gè)對(duì)象引用的問(wèn)題。
<script setup lang="ts" name="CommonApplyItemTable">
import type { ApplyItem } from "@/interface";
const props = withDefaults(
defineProps<{
// 受理項(xiàng)目列表
applyItemList: ApplyItem[];
// 受理模式,1:樣品檢相同項(xiàng)目;2:樣品檢不同項(xiàng)目
dataType: 1 | 2;
// 操作指令類(lèi)型:新增刪除:info-new;修改:info-modify;查看:info-view
operateCommandType: "info-add" | "info-modify" | "info-view";
}>(),
{
applyItemList: () => {
let applyItemList: ApplyItem[] = [];
return applyItemList;
},
dataType: 1,
operateCommandType: "info-view"
}
);
</script><script setup lang="ts" name="CommonApplyBasicInfoForm">
import type { ApplyBasicInfo, ApplyBasicInfoOperateCommandType } from "@/interface";
const props = withDefaults(
defineProps<{
// 受理基礎(chǔ)信息
applyBasicInfo: ApplyBasicInfo;
// 操作指令類(lèi)型
operateCommandType: ApplyBasicInfoOperateCommandType;
}>(),
{
// 對(duì)象類(lèi)型,使用工廠(chǎng)函數(shù)返回默認(rèn)值
applyBasicInfo: () => {
return {
id: 0,
verifyType: null,
verifyTypeName: "",
outerApplyId: "",
acceptType: "",
acceptTypeName: "",
acceptDate: "",
acceptGroupId: null,
acceptGroupName: "",
acceptPerson: "",
acceptPersonName: "",
reportDate: "",
wspjType: 0,
sjdwName: "",
sjdwAddress: "",
sjdwRegion: "",
cydwName: "",
cydwAddress: "",
cyDate: "",
cyPerson: "",
cyType: "",
wsdwName: "",
wsdwAddress: "",
wsPerson: "",
lxPerson: "",
lxPhone: "",
email: "",
payType: "",
createTime: ""
};
},
// 字符串類(lèi)型,使用默認(rèn)值
operateCommandType: "info-view"
}
);總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Vue3之defineProps、defineEmits和defineExpose的使用及說(shuō)明
- Vue3屬性值傳遞defineProps詳解
- Vue3中defineProps設(shè)置默認(rèn)值的方法實(shí)現(xiàn)
- vue3中defineProps及使用方法詳解
- vue3中defineEmits與defineProps的用法實(shí)例
- 解決vue3?defineProps?引入定義的接口報(bào)錯(cuò)
- 一文詳細(xì)聊聊vue3的defineProps、defineEmits和defineExpose
- 關(guān)于Vue3中defineProps用法圖文詳解
- 一文講解VUE3 defineProps的使用
相關(guān)文章
使用vue-cli3新建一個(gè)項(xiàng)目并寫(xiě)好基本配置(推薦)
這篇文章主要介紹了使用vue-cli3新建一個(gè)項(xiàng)目并寫(xiě)好基本配置的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04
vue 點(diǎn)擊展開(kāi)顯示更多(點(diǎn)擊收起部分隱藏)
這篇文章主要介紹了vue 點(diǎn)擊展開(kāi)顯示更多(點(diǎn)擊收起部分隱藏),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Vue+axios實(shí)現(xiàn)統(tǒng)一接口管理的方法
這篇文章主要介紹了Vue+axios實(shí)現(xiàn)統(tǒng)一接口管理的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Vue自定義省市區(qū)三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了Vue自定義省市區(qū)三級(jí)聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

