目錄
簡述Mixin
Mixin被認為是“有害的”
命名衝突
隱式依賴
從mixin遷移
Composition API速成課程
代碼提取
代碼重用
命名衝突……已解決!
隱式依賴……已解決!
總結
首頁 web前端 css教學 VUE組成API如何替代Vue Mixins

VUE組成API如何替代Vue Mixins

Apr 07, 2025 am 10:50 AM

How the Vue Composition API Replaces Vue Mixins

在Vue組件間共享代碼?如果您熟悉Vue 2,您可能已經使用過mixin來實現此目的。但是新的Composition API (現在可作為Vue 2的插件使用,並且是Vue 3的即將推出的功能)提供了一種更好的解決方案。

本文將探討mixin的缺點,並了解Composition API如何克服這些缺點,並使Vue應用程序更具可擴展性。

簡述Mixin

讓我們快速回顧一下mixin模式,因為它對於我們將在下一節中介紹的內容至關重要。

通常,Vue組件由一個JavaScript對象定義,該對象具有各種屬性,表示我們需要實現的功能——例如數據、方法、計算屬性等等。

 // MyComponent.js
export default {
  data: () => ({
    myDataProperty: null
  }),
  methods: {
    myMethod () { ... }
  }
  // ...
}
登入後複製

當我們想要在組件之間共享相同的屬性時,可以將公共屬性提取到一個單獨的模塊中:

 // MyMixin.js
export default {
  data: () => ({
    mySharedDataProperty: null
  }),
  methods: {
    mySharedMethod () { ... }
  }
}
登入後複製

現在,我們可以通過將其分配給mixin配置屬性,將此mixin添加到任何使用它的組件中。在運行時,Vue會將組件的屬性與任何添加的mixin合併。

 // ConsumingComponent.js
import MyMixin from "./MyMixin.js";

export default {
  mixins: [MyMixin],
  data: () => ({
    myLocalDataProperty: null
  }),
  methods: {
    myLocalMethod () { ... }
  }
}
登入後複製

對於此特定示例,運行時使用的組件定義如下所示:

 export default {
  data: () => ({
    mySharedDataProperty: null,
    myLocalDataProperty: null
  }),
  methods: {
    mySharedMethod () { ... },
    myLocalMethod () { ... }
  }
}
登入後複製

Mixin被認為是“有害的”

早在2016年中期,Dan Abramov就撰寫了“Mixins Considered Harmful”(認為Mixin有害),其中他認為在React組件中使用mixin來重用邏輯是一種反模式,主張避免使用它們。

不幸的是,他提到的關於React mixin的缺點也適用於Vue。在了解Composition API如何克服這些缺點之前,讓我們先了解一下這些缺點。

命名衝突

我們看到了mixin模式如何在運行時合併兩個對象。如果它們都共享一個同名的屬性會發生什麼?

 const mixin = {
  data: () => ({
    myProp: null
  })
}

export default {
  mixins: [mixin],
  data: () => ({
    // 同名!
    myProp: null
  })
}
登入後複製

這就是合併策略發揮作用的地方。這是一組規則,用於確定當組件包含多個同名選項時會發生什麼。

Vue組件的默認(但可配置)合併策略規定局部選項將覆蓋mixin選項。不過也有例外。例如,如果我們有多個相同類型的生命週期鉤子,這些鉤子將被添加到鉤子數組中,並且所有鉤子都將按順序調用。

即使我們不會遇到任何實際錯誤,但在多個組件和mixin之間處理命名屬性時,編寫代碼也會越來越困難。一旦添加了作為npm包的第三方mixin及其可能導致衝突的命名屬性,情況尤其困難。

隱式依賴

mixin和使用它的組件之間沒有層次關係。這意味著組件可以使用mixin中定義的數據屬性(例如mySharedDataProperty),但mixin也可以使用它假定在組件中定義的數據屬性(例如myLocalDataProperty)。當使用mixin來共享輸入驗證時,這種情況很常見。 mixin可能期望組件具有一個輸入值,它將在自己的validate方法中使用該值。

但這可能會導致問題。如果我們稍後想要重構組件並更改mixin需要的變量的名稱會發生什麼?從組件中我們不會注意到任何問題。代碼檢查器也不會發現它。我們只會在運行時看到錯誤。

現在想像一個包含許多mixin的組件。我們可以重構局部數據屬性嗎,或者它會破壞mixin嗎?哪個mixin?我們必須手動搜索所有mixin才能知道。

從mixin遷移

Dan的文章提供了mixin的替代方案,包括高階組件、實用程序方法和一些其他組件組合模式。

雖然Vue在許多方面與React相似,但他建議的替代模式並不能很好地轉換為Vue。因此,儘管這篇文章寫於2016年中期,但Vue開發人員從那時起就一直在忍受mixin問題。

直到現在。 mixin的缺點是Composition API背後的主要動機因素之一。在了解它如何克服mixin問題之前,讓我們快速了解一下它的工作原理。

Composition API速成課程

Composition API的關鍵思想是,與其將組件的功能(例如狀態、方法、計算屬性等)定義為對象屬性,不如將它們定義為從新的setup函數返回的JavaScript變量。

這是一個使用Composition API定義的Vue 2組件的經典示例,它定義了一個“計數器”功能:

 //Counter.vue
export default {
  data: () => ({
    count: 0
  }),
  methods: {
    increment() {
      this.count ;
    }
  },
  computed: {
    double () {
      return this.count * 2;
    }
  }
}
登入後複製

以下是使用Composition API定義的完全相同的組件。

 // Counter.vue
import { ref, computed } from "vue";

export default {
  setup() {
    const count = ref(0);
    const double = computed(() => count.value * 2)
    function increment() {
      count.value ;
    }
    return {
      count,
      double,
      increment
    }
  }
}
登入後複製

您首先會注意到我們導入了ref函數,它允許我們定義一個響應式變量,其功能與data變量幾乎相同。 computed函數也是如此。

increment方法不是響應式的,因此可以將其聲明為普通的JavaScript函數。請注意,我們需要更改子屬性值才能更改count響應式變量的值。這是因為使用ref創建的響應式變量需要是對象才能在傳遞時保持其響應性。

最好查閱Vue Composition API文檔以詳細了解ref的工作原理。

定義這些功能後,我們從setup函數返回它們。上面兩個組件的功能沒有區別。我們所做的只是使用了替代API。

提示: Composition API將成為Vue 3的核心功能,但您也可以在Vue 2中使用NPM插件@vue/composition-api。

代碼提取

Composition API的第一個明顯優勢是易於提取邏輯。

讓我們使用Composition API重構上面定義的組件,以便我們定義的功能位於JavaScript模塊useCounter中。 (使用“use”作為功能描述的前綴是Composition API的命名約定。)

 // useCounter.js
import { ref, computed } from "vue";

export default function () {
  const count = ref(0);
  const double = computed(() => count.value * 2)
  function increment() {
    count.value ;
  }
  return {
    count,
    double,
    increment
  }
}
登入後複製

代碼重用

要在組件中使用該功能,我們只需將模塊導入到組件文件中並調用它(注意導入是一個函數)。這將返回我們定義的變量,然後我們可以從setup函數返回這些變量。

 // MyComponent.js
import useCounter from "./useCounter.js";

export default {
  setup() {
    const { count, double, increment } = useCounter();
    return {
      count,
      double,
      increment
    }
  }
}
登入後複製

起初,這似乎有點冗長且毫無意義,但讓我們看看這種模式如何克服我們之前看到的mixin的問題。

命名衝突……已解決!

我們之前看到,mixin可以使用可能與使用組件中甚至更隱蔽地與使用組件使用的其他mixin中的屬性同名的屬性。

Composition API中不存在這個問題,因為我們需要顯式命名從組合函數返回的任何狀態或方法:

 export default {
  setup () {
    const { someVar1, someMethod1 } = useCompFunction1();
    const { someVar2, someMethod2 } = useCompFunction2();
    return {
      someVar1,
      someMethod1,
      someVar2,
      someMethod2
    }
  }
}
登入後複製

命名衝突將以與任何其他JavaScript變量相同的方式解決。

隱式依賴……已解決!

我們之前還看到,mixin可以使用使用組件上定義的數據屬性,這會使代碼變得脆弱且難以理解。

組合函數也可以調用使用組件中定義的局部變量。但是,區別在於現在必須將此變量顯式地傳遞給組合函數。

 import useCompFunction from "./useCompFunction";

export default {
  setup () {
    // 組合函數需要使用的某個局部值const myLocalVal = ref(0);

    // 它必須作為參數顯式傳遞const { ... } = useCompFunction(myLocalVal);
  }
}
登入後複製

總結

mixin模式表面上看起來非常安全。但是,由於它增加了代碼的脆弱性以及它掩蓋了理解功能的能力的方式,通過合併對象來共享代碼成為了一種反模式。

Composition API最巧妙之處在於它允許Vue依靠內置於原生JavaScript中的安全措施來共享代碼,例如將變量傳遞給函數和模塊系統。

這是否意味著Composition API在各個方面都優於Vue的經典API?不。在大多數情況下,您可以堅持使用經典API。但是,如果您計劃重用代碼,Composition API無疑是更好的選擇。

以上是VUE組成API如何替代Vue Mixins的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1230
24
Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

如何在WordPress主題中構建VUE組件 如何在WordPress主題中構建VUE組件 Apr 11, 2025 am 11:03 AM

內聯式模板指令使我們能夠將豐富的VUE組件構建為對現有WordPress標記的逐步增強。

php是A-OK用於模板 php是A-OK用於模板 Apr 11, 2025 am 11:04 AM

PHP模板通常會因促進Subpar代碼而變得不良說唱,但這並不是這樣的情況。讓我們看一下PHP項目如何執行基本的

編程SASS創建可訪問的顏色組合 編程SASS創建可訪問的顏色組合 Apr 09, 2025 am 11:30 AM

我們一直在尋求使網絡更容易訪問。顏色對比只是數學,因此Sass可以幫助涵蓋設計師可能錯過的邊緣案例。

See all articles