Vue3通用API功能示例剖析
通用API
version (暴漏當(dāng)前使用的Vue版本)
import Vue from 'vue'; export default { setup(props, context) { console.log(Vue.version); return {}; } };
nextTick (Dom更新完成后觸發(fā),用于獲取更新后的Dom)
當(dāng)我們更改響應(yīng)式state
時(shí),Vue
更新DOM
并不是同步實(shí)時(shí)更新的,而是將同步執(zhí)行的所有state更新緩存起來,同步代碼執(zhí)行完后再去執(zhí)行Dom更新操作,很大程度的優(yōu)化了render
性能,減少了Dom
更新次數(shù);
而這一特性帶來的一個(gè)問題,我們無法在state
更改后獲取到真實(shí)的Dom
,所以Vue提供了nextTick
來獲取state
更新后的Dom
function nextTick(callback?: () => void): Promise<void>
使用案例
<template> <div class="test_demo"> <h2 class="text">{{ text }}</h2> <button @click="onBtnClick">更新</button> </div> </template> <script lang="ts" setup> import { ref, nextTick } from 'vue'; const text = ref('test_0'); const onBtnClick = () => { text.value = 'test_1'; nextTick(() => { const text = ( document.querySelector<HTMLElement>('.text') as HTMLElement ).innerText; console.log(text); }); text.value = 'test_2'; }; </script>
點(diǎn)擊更新
按鈕后,輸出test_2。但是,如果注釋掉text.value = 'test_1';
,輸出結(jié)果大不一樣,輸出test_0。
為什么會(huì)有這個(gè)問題?
text.value
賦值操作是同步實(shí)時(shí)的,代碼執(zhí)行遇到響應(yīng)式state
的更改時(shí),會(huì)提交一個(gè)視圖更新邏輯
到微任務(wù)隊(duì)列,遇到nextTick,也會(huì)向微任務(wù)隊(duì)列提交。 所以上述代碼,視圖更新邏輯
在nextTick
前邊,視圖更新邏輯
的執(zhí)行是將text.value = 'test_1'
和text.value = 'test_2'
合并后再更新視圖,所以輸出test2;
注釋掉text.value = 'test_1'
后,nextTick
在微任務(wù)隊(duì)列的順序就在視圖更新邏輯
前邊了,所以輸出test_0。
defineComponent(類型推導(dǎo)的輔助函數(shù), 讓 TypeScript 正確地推導(dǎo)出組件選項(xiàng)內(nèi)的類型)
如果你使用<script setup lang='ts'>
語法,就需要使用defineProps
讓TS
推導(dǎo)出組件的Props
<script setup lang="ts"> // 啟用了 TypeScript import { ref } from 'vue' const props = defineProps({ msg: String }) const count = ref(1) </script> <template> <!-- 啟用了類型檢查和自動(dòng)補(bǔ)全 --> {{ count.toFixed(2) }} </template>
如果沒有使用setup
語法,考慮使用defineComponent
進(jìn)行包裹,從而實(shí)現(xiàn)類型推導(dǎo)
import { defineComponent } from 'vue' export default defineComponent({ // 啟用了類型推導(dǎo) props: { message: String }, setup(props) { props.message // 類型:string | undefined } })
如果項(xiàng)目用Webpack,需要注意下,defineComponent
可能導(dǎo)致組件無法被tree shaking
, 為了確保組件被安全的tree shaking
,需要我們開發(fā)時(shí)做一下處理
export default /*#__PURE__*/ defineComponent(/* ... */)
如果項(xiàng)目用Vite,不需要做任何處理,因?yàn)?code>Vite底層的Rollup
會(huì)智能的認(rèn)為defineComponent
沒有副作用。
defineAsyncComponent (異步組件)
開發(fā)過程中,有一些場景例如:彈框內(nèi)的表單、其它Tab下的組件等在頁面初始化時(shí)不需要加載,我們可以考慮使用defineAsyncComponent
來聲明成異步組件,從而提高頁面初始化的速度。
用法一(從服務(wù)器獲取組件)
import { defineAsyncComponent } from 'vue'; const AsyncComp = defineAsyncComponent(() => { return new Promise((resolve, reject) => { // ...從服務(wù)器獲取組件 resolve(/* 獲取到的組件 */); }); });
用法二(異步加載本地組件)
import { defineAsyncComponent } from 'vue'; const AsyncComp = defineAsyncComponent( () => import('./components/MyComponent.vue') );
defineAsyncComponent其它參數(shù)配置
const AsyncComp = defineAsyncComponent({ // 加載函數(shù) loader: () => import('./Foo.vue'), // 加載異步組件時(shí)使用的組件 loadingComponent: LoadingComponent, // 展示加載組件前的延遲時(shí)間,默認(rèn)為 200ms delay: 200, // 加載失敗后展示的組件 errorComponent: ErrorComponent, // 如果提供了一個(gè) timeout 時(shí)間限制,并超時(shí)了 // 也會(huì)顯示這里配置的報(bào)錯(cuò)組件,默認(rèn)值是:Infinity timeout: 3000 });
Suspense
<Suspense>
是一個(gè)內(nèi)置組件,用來在組件樹中協(xié)調(diào)對(duì)異步依賴的處理。它讓我們可以在組件樹上層等待下層的多個(gè)嵌套異步依賴項(xiàng)解析完成,并可以在等待時(shí)渲染一個(gè)加載狀態(tài)。
雖然defineAsyncComponent
具備loadingComponent
參數(shù)來配置加載異步組件時(shí)的Loading組件,但是在一些場景,是需要使用Suspense
來使用的。例如:A組件依賴了B、C、D,如果三個(gè)都是異步組件,加載的過程要顯示3個(gè)Loading,而Suspense
可以配置所有子組件存在未加載時(shí)而現(xiàn)實(shí)的Loading。
defineCustomElement (使用Vue組件開發(fā)Web Components)
關(guān)于Web Components
的介紹請(qǐng)參考文章 Web Components入門
Vue 提供了一個(gè)和定義一般 Vue 組件幾乎完全一致的defineCustomElement
方法來支持創(chuàng)建自定義元素。
import { defineCustomElement } from 'vue'; const MyVueElement = defineCustomElement({ /* 組件選項(xiàng) */ }); // 注冊(cè)自定義元素 customElements.define('my-vue-element', MyVueElement);
以上就是Vue3通用API功能示例剖析的詳細(xì)內(nèi)容,更多關(guān)于Vue3通用API剖析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue項(xiàng)目啟動(dòng)端口更改的實(shí)現(xiàn)
在Vue前端項(xiàng)目中,可以通過修改配置文件來指定啟動(dòng)的端口號(hào),本文就來介紹 一下vue項(xiàng)目啟動(dòng)端口更改的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10Vue?ElementUI?table實(shí)現(xiàn)表格斜線分隔線
這篇文章主要為大家詳細(xì)介紹了Vue?ElementUI?table實(shí)現(xiàn)表格斜線分隔線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Vue+Element-ui彈窗?this.$alert?is?not?a?function問題
這篇文章主要介紹了Vue+Element-ui彈窗?this.$alert?is?not?a?function問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue實(shí)現(xiàn)表單單獨(dú)移除一個(gè)字段驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)表單單獨(dú)移除一個(gè)字段驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03使用vite搭建ssr活動(dòng)頁架構(gòu)的實(shí)現(xiàn)
本文主要介紹了使用vite搭建ssr活動(dòng)頁架構(gòu),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07