搜尋
首頁web前端js教程您需要了解的 Vue 可組合技巧

Vue Composables Tips You Need to Know

Vue 可組合項非常強大,但如果您不小心,它們很快就會變得混亂且難以維護。

這就是為什麼我確定了 13 個技巧,可以幫助您編寫更好、更易於維護的可組合項。

無論您是建立簡單的狀態管理解決方案還是複雜的共享邏輯,這些技巧都將為您提供幫助:

  • 避免導致義大利麵式程式碼的常見陷阱
  • 編寫更易於測試和維護的可組合項
  • 建立更靈活、可重複使用的共享邏輯
  • 如果需要,請逐漸從 Options API 移轉到 Composition API

您將學到的技巧是:

  1. 避免透過多個組件進行 Prop 鑽孔
  2. 在不相關的組件之間共享資料
  3. 用清晰的方法控制狀態更新
  4. 將大組件分解為較小的函數
  5. 將業務邏輯與 Vue 反應性分開
  6. 在一個函數中處理同步和非同步資料
  7. 使函數參數更具描述性
  8. 防止使用預設值的未定義選項
  9. 根據需要傳回簡單或複雜的值
  10. 將不同的邏輯路徑分成各自的函數
  11. 一致地處理反應值和原始值
  12. 簡化引用展開
  13. 逐步從Options API遷移到Composition API

讓我們深入研究每種模式,看看它們如何改進您的 Vue 應用程式。

別忘了,在下面留言你最喜歡的提示!

1. 避免透過多個組件進行支柱鑽孔

資料儲存模式可以幫助避免透過多個元件層傳遞道具和事件。

一種情況是父母和孩子透過無休止的道具鑽探和事件冒泡進行交流:

<!-- Parent.vue -->
<template>
  <!-- But many more layers of components -->
  <child :user="user"></child>
</template>

<script setup>
const user = ref({ name: 'Alice' })
function onUserChange(updatedUser) {
  user.value = updatedUser
}
</script>

這會造成很大的複雜性,因為這些道具和事件必須在元件層次結構中來回移動。

更簡單的解決方案是建立一個任何元件都可以匯入的共享資料儲存:

import { reactive, toRefs } from 'vue'
const state = reactive({ user: { name: 'Alice' } })

export function useUserStore() {
  return toRefs(state)
}

2. 在不相關的組件之間共享數據

當兄弟或「表兄弟」組件需要在沒有任何直接連接的情況下共享相同的資料時,資料儲存模式也會有所幫助。

假設兩個兄弟姊妹都需要相同的使用者對象,但沒有優雅的道具或事件路徑。

這通常會導致在父狀態或重複狀態之間進行尷尬的資料處理。

更好的方法是依賴一個兄弟姊妹都可以使用的可組合儲存:

// SiblingA.vue
import { useUserStore } from './useUserStore'
const { user } = useUserStore()

// SiblingB.vue
import { useUserStore } from './useUserStore'
const { user } = useUserStore()

3. 使用清晰的方法控制狀態更新

資料儲存模式鼓勵提供清晰的方法來更新共享狀態。

有些開發人員將整個反應式物件暴露給世界,如下所示:

<!-- Parent.vue -->
<template>
  <!-- But many more layers of components -->
  <child :user="user"></child>
</template>

<script setup>
const user = ref({ name: 'Alice' })
function onUserChange(updatedUser) {
  user.value = updatedUser
}
</script>

這使得任何人都可以直接從任何檔案更改使用者的 darkMode 屬性,這可能會導致分散的、不受控制的突變。

更好的想法是將狀態傳回為唯讀以及定義更新如何發生的函數:

import { reactive, toRefs } from 'vue'
const state = reactive({ user: { name: 'Alice' } })

export function useUserStore() {
  return toRefs(state)
}

4. 將大型組件分解為較小的功能

內聯可組合模式透過將相關狀態和邏輯收集到較小的函數中來幫助分解大型組件。

一個巨大的組件可能會將其所有引用和方法放在一個地方:

// SiblingA.vue
import { useUserStore } from './useUserStore'
const { user } = useUserStore()

// SiblingB.vue
import { useUserStore } from './useUserStore'
const { user } = useUserStore()

這種設定很快就會變得難以管理。

相反,內聯可組合項可以將邏輯分組並在本地提供。然後我們可以稍後將其提取到一個單獨的文件中:

export const user = reactive({ darkMode: false })

5. 將業務邏輯與 Vue 反應性分開

精簡可組合模式告訴我們將原始業務邏輯與 Vue 反應性分開,以便測試和維護變得更簡單。

您可以將所有邏輯嵌入可組合項目中:

import { reactive, readonly } from 'vue'
const state = reactive({ darkMode: false })

export function toggleDarkMode() {
  state.darkMode = !state.darkMode
}

export function useUserStore() {
  return {
    darkMode: readonly(state.darkMode),
    toggleDarkMode
  }
}

這迫使您在 Vue 環境中測試邏輯。

相反,將複雜的規則保留在純函數中,並讓可組合項僅處理反應式包裝器:

<script setup>
const count = ref(0)
const user = ref({ name: 'Alice' })
// 500 more lines of intertwined code with watchers, methods, etc.
</script>

6. 在一個函數中處理同步和非同步數據

非同步同步可組合模式將同步和非同步步行為合併到一個可組合中,而不是建立單獨的函數。

這就像 Nuxt 的 useAsyncData 的工作原理一樣。

這裡我們有一個可組合項,它可以回傳承諾,同時也為同步使用提供即時反應屬性:

<script setup>
function useCounter() {
  const count = ref(0)
  const increment = () => count.value++
  return { count, increment }
}

const { count, increment } = useCounter()
</script>

7. 讓函數參數更具描述性

選項物件模式可以透過期望單一配置物件來清除長參數清單。

這樣的呼叫比較麻煩而且容易出錯,新增選項需要更新函數簽章:

export function useCounter() {
  const count = ref(0)
  function increment() {
    count.value = (count.value * 3) / 2
  }
  return { count, increment }
}

每個參數代表什麼並不明顯。

接受選項物件的可組合項使所有內容保持描述性:

// counterLogic.js
export function incrementCount(num) {
  return (num * 3) / 2
}

// useCounter.js
import { ref } from 'vue'
import { incrementCount } from './counterLogic'

export function useCounter() {
  const count = ref(0)
  function increment() {
    count.value = incrementCount(count.value)
  }
  return { count, increment }
}

8. 防止使用預設值的未定義選項

選項物件模式也建議每個屬性的預設值。

假設某些欄位存在的函數如果未傳遞,可能會出現問題:

import { ref } from 'vue'

export function useAsyncOrSync() {
  const data = ref(null)
  const promise = fetch('/api')
    .then(res => res.json())
    .then(json => {
      data.value = json
      return { data }
    })
  return Object.assign(promise, { data })
}

最好使用安全預設值解構選項:

useRefHistory(someRef, true, 10, 500, 'click', false)

9. 根據需要傳回簡單或複雜的值

動態回傳模式可確保可組合項目可以傳回簡單用例的單一值或具有更高階控制項的擴充物件。

有些方法總是傳回一個包含所有內容的物件:

<!-- Parent.vue -->
<template>
  <!-- But many more layers of components -->
  <child :user="user"></child>
</template>

<script setup>
const user = ref({ name: 'Alice' })
function onUserChange(updatedUser) {
  user.value = updatedUser
}
</script>

任何只需要主要無功值的人都被迫處理額外的東西。

有條件回傳單一引用或物件的可組合項解決了:

import { reactive, toRefs } from 'vue'
const state = reactive({ user: { name: 'Alice' } })

export function useUserStore() {
  return toRefs(state)
}

10.將不同的邏輯路徑分成各自的功能

隱藏可組合項模式有助於避免在相同可組合項中混合互斥邏輯。

有些程式碼將多種模式或程式碼路徑組合在一起:

// SiblingA.vue
import { useUserStore } from './useUserStore'
const { user } = useUserStore()

// SiblingB.vue
import { useUserStore } from './useUserStore'
const { user } = useUserStore()

將每個路徑拆分為自己的可組合項更加清晰,並且不會影響功能:

export const user = reactive({ darkMode: false })

11. 一致地處理反應值和原始值

靈活參數模式確保可組合項中的輸入和輸出被統一處理為反應資料或原始值,避免混淆。

有些程式碼檢查輸入是否為引用:

import { reactive, readonly } from 'vue'
const state = reactive({ darkMode: false })

export function toggleDarkMode() {
  state.darkMode = !state.darkMode
}

export function useUserStore() {
  return {
    darkMode: readonly(state.darkMode),
    toggleDarkMode
  }
}

相反,您可以立即轉換。

透過使用 ref,如果輸入是 ref,則會傳回該 ref。否則,它將被轉換為 ref:

<script setup>
const count = ref(0)
const user = ref({ name: 'Alice' })
// 500 more lines of intertwined code with watchers, methods, etc.
</script>

12. 簡化引用展開

當需要展開時,靈活參數模式也會使用 toValue。

沒有它,程式碼可能會繼續執行 isRef 檢查:

<script setup>
function useCounter() {
  const count = ref(0)
  const increment = () => count.value++
  return { count, increment }
}

const { count, increment } = useCounter()
</script>

呼叫更簡單:

export function useCounter() {
  const count = ref(0)
  function increment() {
    count.value = (count.value * 3) / 2
  }
  return { count, increment }
}

13. 逐步從Options API遷移到Composition API

Options to Composition 模式可讓您以易於遵循的增量方式逐步將大型 Options API 元件遷移到 Composition API。

經典的選項組件可能會這樣做:

// counterLogic.js
export function incrementCount(num) {
  return (num * 3) / 2
}

// useCounter.js
import { ref } from 'vue'
import { incrementCount } from './counterLogic'

export function useCounter() {
  const count = ref(0)
  function increment() {
    count.value = incrementCount(count.value)
  }
  return { count, increment }
}

資料、計算屬性和方法是分散的。

將其轉換為腳本設定將它們組合在一起,使其更易於遵循,並允許您使用這些模式:

import { ref } from 'vue'

export function useAsyncOrSync() {
  const data = ref(null)
  const promise = fetch('/api')
    .then(res => res.json())
    .then(json => {
      data.value = json
      return { data }
    })
  return Object.assign(promise, { data })
}

把它包起來

這 13 個技巧將幫助您編寫更好的 Vue 可組合項,更容易在應用程式中維護、測試和重複使用。

但我們只是觸及了表面。

多年來,我收集了更多模式和技巧,並將它們全部放入可組合模式的深入課程中。

總共涵蓋16種圖案,每種圖案有:

  • 深入解釋 — 何時使用它、邊緣情況和變體
  • 現實世界的範例 - 這樣您就可以了解如何使用這些簡單範例以外的它們
  • 逐步重建範例 — 這樣您就可以了解如何將它們應用到您自己的程式碼中

到這裡了解更多。

哦,這門課程優惠至 1 月 15 日,所以您現在就可以享受超值折扣!

查看可組合設計模式

以上是您需要了解的 Vue 可組合技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

在Quartz中如何在任務開始前發送通知?在Quartz中如何在任務開始前發送通知?Apr 04, 2025 pm 09:24 PM

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

在JavaScript中,如何在構造函數中獲取原型鏈上函數的參數?在JavaScript中,如何在構造函數中獲取原型鏈上函數的參數?Apr 04, 2025 pm 09:21 PM

在JavaScript中如何獲取原型鏈上函數的參數在JavaScript編程中,理解和操作原型鏈上的函數參數是常見且重要的任�...

微信小程序webview中Vue.js動態style位移失效是什麼原因?微信小程序webview中Vue.js動態style位移失效是什麼原因?Apr 04, 2025 pm 09:18 PM

在微信小程序web-view中使用Vue.js動態style位移失效的原因分析在使用Vue.js...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用