您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Vue3通用API功能怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Vue3通用API功能怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
import Vue from 'vue'; export default { setup(props, context) { console.log(Vue.version); return {}; } };
當我們更改響應式state
時,Vue
更新DOM
并不是同步實時更新的,而是將同步執行的所有state更新緩存起來,同步代碼執行完后再去執行Dom更新操作,很大程度的優化了render
性能,減少了Dom
更新次數;
而這一特性帶來的一個問題,我們無法在state
更改后獲取到真實的Dom
,所以Vue提供了nextTick
來獲取state
更新后的Dom
function nextTick(callback?: () => void): Promise<void>
使用案例
<template> <div class="test_demo"> <h3 class="text">{{ text }}</h3> <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>
點擊更新
按鈕后,輸出test_2。但是,如果注釋掉text.value = 'test_1';
,輸出結果大不一樣,輸出test_0。
為什么會有這個問題?
text.value
賦值操作是同步實時的,代碼執行遇到響應式state
的更改時,會提交一個視圖更新邏輯
到微任務隊列,遇到nextTick,也會向微任務隊列提交。 所以上述代碼,視圖更新邏輯
在nextTick
前邊,視圖更新邏輯
的執行是將text.value = 'test_1'
和text.value = 'test_2'
合并后再更新視圖,所以輸出test2;
注釋掉text.value = 'test_1'
后,nextTick
在微任務隊列的順序就在視圖更新邏輯
前邊了,所以輸出test_0。
如果你使用<script setup lang='ts'>
語法,就需要使用defineProps
讓TS
推導出組件的Props
<script setup lang="ts"> // 啟用了 TypeScript import { ref } from 'vue' const props = defineProps({ msg: String }) const count = ref(1) </script> <template> <!-- 啟用了類型檢查和自動補全 --> {{ count.toFixed(2) }} </template>
如果沒有使用setup
語法,考慮使用defineComponent
進行包裹,從而實現類型推導
import { defineComponent } from 'vue' export default defineComponent({ // 啟用了類型推導 props: { message: String }, setup(props) { props.message // 類型:string | undefined } })
如果項目用Webpack,需要注意下,defineComponent
可能導致組件無法被tree shaking
, 為了確保組件被安全的tree shaking
,需要我們開發時做一下處理
export default /*#__PURE__*/ defineComponent(/* ... */)
如果項目用Vite,不需要做任何處理,因為Vite
底層的Rollup
會智能的認為defineComponent
沒有副作用。
開發過程中,有一些場景例如:彈框內的表單、其它Tab下的組件等在頁面初始化時不需要加載,我們可以考慮使用defineAsyncComponent
來聲明成異步組件,從而提高頁面初始化的速度。
import { defineAsyncComponent } from 'vue'; const AsyncComp = defineAsyncComponent(() => { return new Promise((resolve, reject) => { // ...從服務器獲取組件 resolve(/* 獲取到的組件 */); }); });
import { defineAsyncComponent } from 'vue'; const AsyncComp = defineAsyncComponent( () => import('./components/MyComponent.vue') );
const AsyncComp = defineAsyncComponent({ // 加載函數 loader: () => import('./Foo.vue'), // 加載異步組件時使用的組件 loadingComponent: LoadingComponent, // 展示加載組件前的延遲時間,默認為 200ms delay: 200, // 加載失敗后展示的組件 errorComponent: ErrorComponent, // 如果提供了一個 timeout 時間限制,并超時了 // 也會顯示這里配置的報錯組件,默認值是:Infinity timeout: 3000 });
<Suspense>
是一個內置組件,用來在組件樹中協調對異步依賴的處理。它讓我們可以在組件樹上層等待下層的多個嵌套異步依賴項解析完成,并可以在等待時渲染一個加載狀態。
雖然defineAsyncComponent
具備loadingComponent
參數來配置加載異步組件時的Loading組件,但是在一些場景,是需要使用Suspense
來使用的。例如:A組件依賴了B、C、D,如果三個都是異步組件,加載的過程要顯示3個Loading,而Suspense
可以配置所有子組件存在未加載時而現實的Loading。
關于Web Components
的介紹請參考文章 Web Components入門
Vue 提供了一個和定義一般 Vue 組件幾乎完全一致的defineCustomElement
方法來支持創建自定義元素。
import { defineCustomElement } from 'vue'; const MyVueElement = defineCustomElement({ /* 組件選項 */ }); // 注冊自定義元素 customElements.define('my-vue-element', MyVueElement);
讀到這里,這篇“Vue3通用API功能怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。