成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue3中DefineEmits、DefineProps 是怎么做到不用引入就能直接使用

開發 前端
TypeScript 接口是只在設計和編譯時存在的結構。它們在JavaScript運行時之前被過濾掉,那么它們是如何影響組件的行為的呢?

最近正在將一個使用單文件組件的 Options API 的 Vue2 JavaScript 項目升級為 Vue3 typescript,并利用 Composition API 的優勢。

比如,下面這種 選項API 方式:

export default {
props: {
name: {
type: String,
required: true.
}
},
emits: ['someEvent', 'increaseBy']
};

我們將它轉成 組合API 方式:

const props = defineProps<{
name: string;
}>();
const emit = defineEmits<{
(event: 'someEvent): void;
(event: 'increaseBy', value: number): void;
}>();

從 選項API 的 emit 和 props 到 組合API 的 defineemit 和 defineProps 函數的基于類型語法的轉換并不簡單。我也很好奇 Vue 是如何處理接口的。

TypeScript 接口是只在設計和編譯時存在的結構。它們在JavaScript運行時之前被過濾掉,那么它們是如何影響組件的行為的呢?

我想知道是否有辦法看到Vue如何解釋傳遞給 defineEmits 和 defineProps 的通用參數。如果你注意到文檔中說你不需要導入 defineEmits 和 defineProps 函數。這是因為它們實際上是同名的JavaScript函數的宏。在進行完整的 TypeScript 傳遞之前,Vue webpack插件使用TypeScript的 AST(抽象語法樹)來推導JavaScript版本的函數選項。

如果不是因為宏:

defineProps<{
prop1: string;
prop2: number;
}>();

就會變成:

defineProps();

這樣就會導致參數缺失的錯誤。

如果看一下Vue的 SFC(單文件組件)編譯器源代碼,有一個叫做 compileScript 的函數。我開始嘗試用最少的參數來調用這個函數,這樣就不會出錯,并模擬任何不重要的必要參數。最終發現了另一個叫 parse 的函數。這給了我所需的大部分參數,只剩下要mock的組件 id。

這里有一個小腳本,它接收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 對象。原始類型是一對一的。接口變成對象,而 ? 可選語法驅動 required 的屬性。

責任編輯:姜華 來源: 大遷世界
相關推薦

2023-11-28 09:03:59

Vue.jsJavaScript

2024-01-12 09:24:03

組件庫vue組件

2024-03-22 08:57:04

Vue3Emoji表情符號

2013-08-02 13:30:02

蘋果保秘

2024-10-24 09:18:45

2022-11-01 11:55:27

ReactVue3

2021-09-01 08:46:29

Vue3 插件Vue應用

2024-01-04 08:49:03

Vuescope限制

2021-12-01 08:11:44

Vue3 插件Vue應用

2024-11-06 10:16:22

2021-11-30 08:19:43

Vue3 插件Vue應用

2021-12-29 07:51:21

Vue3 插件Vue應用

2021-12-08 09:09:33

Vue 3 Computed Vue2

2022-07-20 11:13:05

前端JSONVue3

2022-04-01 09:01:55

Dubbo接口系統

2020-09-19 21:15:26

Composition

2019-09-20 08:54:15

換膚網易云音樂QQ

2021-10-26 15:33:07

區塊鏈安全加密算法

2022-09-06 12:20:30

Vue3CVCRUD

2022-07-15 08:45:07

slotVue3
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线观看成人小视频 | 国产一区二区三区在线看 | 一级毛片在线播放 | 天天爱av | 欧美久久一区二区 | 亚洲精品视频一区二区三区 | 伊人网伊人 | 亚洲福利一区二区 | 这里只有精品999 | 国产精品欧美一区二区 | 日韩国产中文字幕 | 久久久久亚洲精品 | 美女视频黄色片 | 欧美性受xxxx白人性爽 | 精品福利在线 | 亚洲免费在线观看 | 久久国产高清视频 | 欧洲毛片 | 日韩精品在线观看一区二区三区 | 国产精品免费大片 | 成年人网站免费视频 | 七七婷婷婷婷精品国产 | 国产亚洲一区二区在线观看 | 精品亚洲视频在线 | 日韩一区二区三区精品 | 久久久久久国产精品久久 | 一级欧美黄色片 | 精品视频一区二区三区在线观看 | 久久久久免费精品国产 | 中文字幕日韩一区 | 国产精品乱码一区二区三区 | www久久99 | 久久久久久久91 | 亚洲欧美日韩一区二区 | 一区二区三区四区毛片 | 天堂亚洲网 | 亚洲国产精品va在线看黑人 | 国产精品日韩 | 9久久精品 | 久久久久久久久久久久久久国产 | 亚洲欧美一区二区三区国产精品 |