Vue3中defineEmits、defineProps?不用引入便直接用
前言:
最近正在將一個(gè)使用單文件組件的 Options API 的 Vue2 JavaScript 項(xiàng)目升級(jí)為 Vue3 typescript,并利用 Composition API 的優(yōu)勢(shì)。
比如,下面這種 選項(xiàng)API 方式:
export default {
props: {
name: {
type: String,
required: true.
}
},
emits: ['someEvent', 'increaseBy']
};我們將它轉(zhuǎn)成 組合API 方式:
const props = defineProps<{
name: string;
}>();
const emit = defineEmits<{
(event: 'someEvent): void;
(event: 'increaseBy', value: number): void;
}>();從 選項(xiàng)API 的 ??emit?? 和 ??props?? 到 組合API 的 ??defineemit?? 和 ??defineProps?? 函數(shù)的基于類型語法的轉(zhuǎn)換并不簡(jiǎn)單。我也很好奇 Vue 是如何處理接口的。
TypeScript 接口是只在設(shè)計(jì)和編譯時(shí)存在的結(jié)構(gòu)。它們?cè)贘avaScript運(yùn)行時(shí)之前被過濾掉,那么它們是如何影響組件的行為的呢?
我想知道是否有辦法看到Vue如何解釋傳遞給 ??defineEmits?? 和 ??defineProps?? 的通用參數(shù)。如果你注意到文檔中說你不需要導(dǎo)入 ??defineEmits?? 和 ??defineProps?? 函數(shù)。這是因?yàn)樗鼈儗?shí)際上是同名的JavaScript函數(shù)的宏。在進(jìn)行完整的 TypeScript 傳遞之前,Vue webpack插件使用TypeScript的 AST(抽象語法樹)來推導(dǎo)JavaScript版本的函數(shù)選項(xiàng)。
如果不是因?yàn)楹?
defineProps<{
prop1: string;
prop2: number;
}>();就會(huì)變成:
defineProps();
這樣就會(huì)導(dǎo)致參數(shù)缺失的錯(cuò)誤。
如果看一下Vue的 SFC(單文件組件)編譯器源代碼,有一個(gè)叫做 compileScript 的函數(shù)。我開始嘗試用最少的參數(shù)來調(diào)用這個(gè)函數(shù),這樣就不會(huì)出錯(cuò),并模擬任何不重要的必要參數(shù)。最終發(fā)現(xiàn)了另一個(gè)叫 parse 的函數(shù)。這給了我所需的大部分參數(shù),只剩下要mock的組件 ??id??。
這里有一個(gè)小腳本,它接收SFC的 ??.vue??文件并輸出 Vue 如何解釋 TypeScript。
import { readFile, writeFile } from "fs";
import parseArgs from "minimist";
import { parse, compileScript } from "@vue/compiler-sfc";
const { file, out } = parseArgs(process.argv.slice(2), {
string: ["file", "out"],
alias: {
file: "f",
out: "o"
}
});
const filename = file;
const mockId = "xxxxxxxx";
readFile(filename, "utf8", (err, data) => {
const { descriptor } = parse(data, {
filename
});
const { content } = compileScript(descriptor, {
inlineTemplate: true,
templateOptions: {
filename
},
id: mockId
});
if (out) {
writeFile(out, "utf8", content);
} else {
process.stdout.write(content);
}
});事例地址:https://stackblitz.com/edit/node-fzuykn?file=index.js
例如,有如以下組件:
interface Bar {
prop1: string;
prop2: number;
}
defineProps<{
bar: Bar;
bars: Bar[];
asdf1?: boolean;
asdf2: string[];
}>();輸出:
interface Bar {
prop1: string;
prop2: number;
}
export default /*#__PURE__*/_defineComponent({
__name: 'demo',
props: {
bar: { type: Object, required: true },
bars: { type: Array, required: true },
asdf1: { type: Boolean, required: false },
asdf2: { type: Array, required: true }
},
setup(__props: any) {
return (_ctx: any,_cache: any) => {
return (_openBlock(), _createElementBlock("div"))
}
}
正如上面所看到的,SFC編譯器采用TypeScript類型信息,并建立了 ??props?? 對(duì)象。原始類型是一對(duì)一的。接口變成對(duì)象,而 ????? 可選語法驅(qū)動(dòng) ??required?? 的屬性。
到此這篇關(guān)于Vue3中defineEmits、defineProps 不用引入便直接用的文章就介紹到這了,更多相關(guān)Vue3 defineEmit 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3 setup中defineEmits與defineProps的使用案例詳解
- vue3中defineEmits的使用舉例詳解
- 一文詳細(xì)聊聊vue3的defineProps、defineEmits和defineExpose
- vue3?setup語法糖之組件傳參(defineProps、defineEmits、defineExpose)示例詳解
- vue3.0語法糖內(nèi)的defineProps及defineEmits解析
- vue3中組件事件和defineEmits示例代碼
- vue3使用element-plus中el-table組件報(bào)錯(cuò)關(guān)鍵字'emitsOptions'與'insertBefore'分析
- vue3 組合式API defineEmits() 與 emits 組件選項(xiàng)詳解
相關(guān)文章
vue性能優(yōu)化之cdn引入vue-Router的問題
這篇文章主要介紹了vue性能優(yōu)化之cdn引入vue-Router的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
v-distpicker地區(qū)選擇器組件使用實(shí)例詳解
代碼添加了一個(gè)vDistpickerHandle的事件處理函數(shù)對(duì)地區(qū)選擇器中的數(shù)據(jù)進(jìn)行處理,將數(shù)據(jù)存儲(chǔ)到form對(duì)象的相應(yīng)屬性中,方便數(shù)據(jù)提交,這篇文章主要介紹了v-distpicker地區(qū)選擇器組件使用,需要的朋友可以參考下2024-02-02
Vue.js實(shí)現(xiàn)watch屬性的示例詳解
本文討論了watch函數(shù)是如何利用副作用函數(shù)和options進(jìn)行封裝實(shí)現(xiàn)的,也通過調(diào)度函數(shù)去控制回調(diào)函數(shù)的立即執(zhí)行和執(zhí)行時(shí)機(jī),還可以解決競(jìng)態(tài)問題,感興趣的可以了解一下2022-04-04
詳解基于vue-router的動(dòng)態(tài)權(quán)限控制實(shí)現(xiàn)方案
本篇文章主要介紹了詳解基于vue-router的動(dòng)態(tài)權(quán)限實(shí)現(xiàn)方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
Vue實(shí)現(xiàn)簡(jiǎn)單搜索功能的示例代碼
在vue項(xiàng)目中,搜索功能是我們經(jīng)常需要使用的一個(gè)場(chǎng)景,最常用的是在列表數(shù)據(jù)中搜索一個(gè)想要的,今天的例子就是我們實(shí)現(xiàn)vue從列表數(shù)據(jù)中搜索,希望對(duì)大家有所幫助2023-03-03
vue子組件改變父組件傳遞的prop值通過sync實(shí)現(xiàn)數(shù)據(jù)雙向綁定(DEMO)
本文通過一個(gè)demo給大家介紹了vue子組件改變父組件傳遞的prop值通過sync實(shí)現(xiàn)數(shù)據(jù)雙向綁定,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Vue之beforeEach非登錄不能訪問的實(shí)現(xiàn)(代碼親測(cè))
這篇文章主要介紹了Vue之beforeEach非登錄不能訪問的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
vue2 d3實(shí)現(xiàn)企查查股權(quán)穿透圖股權(quán)結(jié)構(gòu)圖效果詳解
這篇文章主要為大家介紹了vue2 d3實(shí)現(xiàn)企查查股權(quán)穿透圖股權(quán)結(jié)構(gòu)圖效果詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
vue3整合SpringSecurity加JWT實(shí)現(xiàn)登錄認(rèn)證
本文主要介紹了vue3整合SpringSecurity加JWT實(shí)現(xiàn)登錄認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04

