Vue3.2 中新出的 expose 是做啥用的?以下這篇文章帶大家好好了解下Vue3.2的expose工具,希望對大家有幫助!
隨著Vue 3.2的發布,一個新的組合工具提供給我們,叫做 expose
。 (學習影片分享:vue影片教學)
你是否曾經建立過一個需要提供給範本一些方法和屬性的元件,但又希望這些方法對元件是私有的,不能被父類別呼叫?
如果你在開發一個開源的元件或函式庫,你有可能想保持一些內部方法的私有性。在Vue 3.2之前,這並不容易實現,因為所有在選項API中聲明的方法或資料等都是公開的,所以模板可以存取它。
組合API也是如此。我們從setup
方法中傳回的所有東西都可以被父類別直接存取。
組合 API
讓我們來看一個實際的例子。想像一下,我們有一個元件,它創建了一個計數器,每一秒都會更新這個計數器。
** MyCounter.vue**
<template> <p>Counter: {{ counter }}</p> <button>Reset</button> <button>☠️</button> </template> <script> import { ref } from 'vue' export default { setup () { const counter = ref(0) const interval = setInterval(() => { counter.value++ }, 1000) const reset = () => { counter.value = 0 } const terminate = () => { clearInterval(interval) } return { counter, reset, terminate } } } </script>
從組合的角度來看,我希望父級元件能夠在需要時直接呼叫reset
方法--但我希望保持terminate
函數和counter
的參考只對元件可用。
如果我們把這個元件實例化到一個父類別中,例如App.vue,並給它附加一個ref 引用,我們可以很容易地讓父類別呼叫reset
方法,因為當我們從setup
中傳回它時,它已經和terminate
一起被揭露了。
App.vue
<template> <mycounter></mycounter> <button>Reset from parent</button> <button>Terminate from parent</button> </template> <script> import MyCounter from '@/components/MyCounter.vue' export default { name: 'App', components: { MyCounter }, methods: { reset () { this.$refs.counter.reset() }, terminate () { this.$refs.counter.terminate() } } } </script>
如果現在運行這個,並點擊重置或終止按鈕,兩者都可以工作。
讓我們明確說明我們要向父類別暴露(expose
)的內容,以便只有 reset
函數可用。
** MyCounter.vue**
<script> import { ref } from 'vue' export default { setup (props, context) { const counter = ref(null) const interval = setInterval(() => { counter.value++ }, 1000) const reset = () => { counter.value = 0 } const terminate = () => { console.log(interval) clearInterval(interval) } context.expose({ reset }) return { counter, reset, terminate } } } </script>
這裡,我們在setup
函數中加入了props
和context
參數。我們需要有可用的上下文,因為這是 expose
函數的位置。我們也可以這樣使用重構: { expose }
。
接下來,我們使用context.expose
來宣告一個我們想要對實例化這個元件的父類別公開的元素物件;在這個例子中,我們只打算讓reset
功能可用。
如果我們再次執行這個例子,並點擊 "Terminate from parent" 按鈕,我們會得到一個錯誤。
Uncaught TypeError: this.$refs.counter.terminate is not a function
terminate
功能不再可用,我們的私有API現在也無法存取了。
選項API
上面我們在composition API
使用exponse
,但在options API中也可以使用這個方法。我們可以把它改寫成如下。
// MyCounter.vue export default { created () { ... }, data: () => ({ counter: null }), methods: { reset () { ... }, terminate () { ... } }, expose: ['reset'] }
注意,我們新增了一個新的選項API屬性expose
,允許我們傳入一個數組,其中字串'reset'
是我們公開的函數的名稱。
組合API 渲染功能
創建一個強大臉靈活的元件的方法是利用渲染函數的力量。這對Vue 3來說並不新鮮,但是隨著composition API的建立,我們現在可以靈活地從setup
方法直接傳回組合API h
函數。
這就產生了一個問題,因為在我們的setup
函數中,整個return
語句只是包含元件正在建立的節點的h
方法。
如果在這個時候我們選擇向父類 expose 一些東西,我們就會遇到與我們之前看到的相反的問題。沒有任何東西被暴露,因為除了DOM元素,沒有任何東西被返回。
讓我們重寫 MyCounter.vue
元件來使用這個方法。
<script> // The template has been deleted import { ref, h } from 'vue' export default { setup (props, context) { const counter = ref(0) const interval = setInterval(() => { counter.value++ }, 1000) const reset = () => { counter.value = 0 } const terminate = () => { clearInterval(interval) } // context.expose({ reset }) return () => h('div', [ h('p', `Counter: ${counter.value}`), h('button', { onClick: reset }, 'Reset'), h('button', { onClick: terminate }, 'Terminate') ]) } } </script>
注意,我們在頂部從Vue導入了 h
,因為我們需要用它來創建我們的DOM元素。
為了說明問題,暫時註解了context.expose
方法。
現在的 return 語句複製了我們先前的 <template></template>
的DOM結構,如果我們執行這個例子,我們能夠正確點擊元素上的重置和終止按鈕。
然而,如果我們現在點擊 "Reset from parent"按鈕,我們會遇到一個錯誤。
Uncaught TypeError: this.$refs.counter.reset is not a function
reset
方法不再被揭露,因為它沒有被setup
函數傳回。為了解決這個問題,我們需要取消對context.expose
的調用,使其再次可用。
總結
新的 expose
方法是非常直覺的,而且很容易在我們的元件中實作。它清除了一些非常重要的組成問題,這些問題在過去甚至需要重寫一個完整的元件,所以即使它不是你日常使用的API,它也是值得收藏在我們資料夾中吃灰。
英文原文:https://www.vuemastery.com/blog/understanding-vue-3-expose/
以上是Vue3.2中的expose是啥?有什麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Netflix使用React來提升用戶體驗。 1)React的組件化特性幫助Netflix將復雜UI拆分成可管理模塊。 2)虛擬DOM優化了UI更新,提高了性能。 3)結合Redux和GraphQL,Netflix高效管理應用狀態和數據流動。

Vue.js是前端框架,後端框架用於處理服務器端邏輯。 1)Vue.js專注於構建用戶界面,通過組件化和響應式數據綁定簡化開發。 2)後端框架如Express、Django處理HTTP請求、數據庫操作和業務邏輯,運行在服務器上。

Vue.js與前端技術棧緊密集成,提升開發效率和用戶體驗。 1)構建工具:與Webpack、Rollup集成,實現模塊化開發。 2)狀態管理:與Vuex集成,管理複雜應用狀態。 3)路由:與VueRouter集成,實現單頁面應用路由。 4)CSS預處理器:支持Sass、Less,提升樣式開發效率。

Netflix選擇React來構建其用戶界面,因為React的組件化設計和虛擬DOM機制能夠高效處理複雜界面和頻繁更新。 1)組件化設計讓Netflix將界面分解成可管理的小組件,提高了開發效率和代碼可維護性。 2)虛擬DOM機制通過最小化DOM操作,確保了Netflix用戶界面的流暢性和高性能。

Vue.js被開發者喜愛因為它易於上手且功能強大。 1)其響應式數據綁定係統自動更新視圖。 2)組件系統提高了代碼的可重用性和可維護性。 3)計算屬性和偵聽器增強了代碼的可讀性和性能。 4)使用VueDevtools和檢查控制台錯誤是常見的調試技巧。 5)性能優化包括使用key屬性、計算屬性和keep-alive組件。 6)最佳實踐包括清晰的組件命名、使用單文件組件和合理使用生命週期鉤子。

Vue.js是一個漸進式的JavaScript框架,適用於構建高效、可維護的前端應用。其關鍵特性包括:1.響應式數據綁定,2.組件化開發,3.虛擬DOM。通過這些特性,Vue.js簡化了開發過程,提高了應用性能和可維護性,使其在現代Web開發中備受歡迎。

Vue.js和React各有優劣,選擇取決於項目需求和團隊情況。 1)Vue.js適合小型項目和初學者,因其簡潔和易上手;2)React適用於大型項目和復雜UI,因其豐富的生態系統和組件化設計。

Vue.js通過多種功能提升用戶體驗:1.響應式系統實現數據即時反饋;2.組件化開發提高代碼復用性;3.VueRouter提供平滑導航;4.動態數據綁定和過渡動畫增強交互效果;5.錯誤處理機制確保用戶反饋;6.性能優化和最佳實踐提升應用性能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版
好用的JavaScript開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。