最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Vue3 Composition API如何替換Vue Mixins

 更新時間:2020年04月29日 11:29:28   作者:杜尼卜  
這篇文章主要介紹了淺談Vue3 Composition API如何替換Vue Mixins,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

想在你的Vue組件之間共享代碼?如果你熟悉Vue 2 則可能知道使用mixin,但是新的Composition API 提供了更好的解決方案。

在本文中,我們將研究mixins的缺點(diǎn),并了解Composition API如何克服它們,并使Vue應(yīng)用程序具有更大的可伸縮性。

回顧Mixins功能

讓我們快速回顧一下mixins模式,因?yàn)閷τ谙乱徊糠治覀儗⒁v到的內(nèi)容,請務(wù)必將其放在首位。

通常,Vue組件是由一個JavaScript對象定義的,它具有表示我們所需功能的各種屬性——諸如 data,methods,computed 等。

// MyComponent.js
export default {
 data: () => ({
  myDataProperty: null
 }),
 methods: {
  myMethod () { ... }
 }
 // ...
}

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

// MyMixin.js
export default {
 data: () => ({
  mySharedDataProperty: null
 }),
 methods: {
  mySharedMethod () { ... }
 }
}

現(xiàn)在,我們可以通過將其分配給 mixin config屬性將其添加到任何使用的組件中。在運(yùn)行時,Vue會將組件的屬性與任何添加的mixin合并。

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

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

對于這個特定的例子,在運(yùn)行時使用的組件定義應(yīng)該是這樣的:

export default {
 data: () => ({
  mySharedDataProperty: null
  myLocalDataProperty: null
 }),
 methods: {
  mySharedMethod () { ... },
  myLocalMethod () { ... }
 }
}

Mixins被認(rèn)為“有害”

早在2016年中期,丹·阿布拉莫夫(Dan Abramov)就寫了《mixin被認(rèn)為是有害的》(mixin Considered Harmful),他在書中辯稱,將mixin用于在React組件中重用邏輯是一種反模式,主張遠(yuǎn)離它們。

不幸的是,他提到的關(guān)于React mixins的缺點(diǎn)同樣適用于Vue。在了解Composition API如何克服這些缺點(diǎn)之前,讓我們熟悉這些缺點(diǎn)。

命名沖突

我們看到了mixin模式如何在運(yùn)行時合并兩個對象。如果他們兩個都共享同名屬性,會發(fā)生什么?

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

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

這就是合并策略發(fā)揮作用的地方。這是一組規(guī)則,用于確定當(dāng)一個組件包含多個具有相同名稱的選項(xiàng)時會發(fā)生什么。

Vue組件的默認(rèn)(但可以配置)合并策略指示本地選項(xiàng)將覆蓋mixin選項(xiàng)。Vue組件的默認(rèn)(可選配置)合并策略指示本地選項(xiàng)將覆蓋mixin選項(xiàng)。不過也有例外,例如,如果我們有多個相同類型的生命周期鉤子,這些鉤子將被添加到一個鉤子數(shù)組中,并且所有的鉤子都將被依次調(diào)用。

盡管我們不應(yīng)該遇到任何實(shí)際的錯誤,但是在跨多個組件和mixin處理命名屬性時,編寫代碼變得越來越困難。一旦第三方mixin作為帶有自己命名屬性的npm包被添加進(jìn)來,就會特別困難,因?yàn)樗鼈兛赡軙?dǎo)致沖突。

隱式依賴

mixin和使用它的組件之間沒有層次關(guān)系。這意味著組件可以使用mixin中定義的數(shù)據(jù)屬性(例如mySharedDataProperty),但是mixin也可以使用假定在組件中定義的數(shù)據(jù)屬性(例如myLocalDataProperty)。這種情況通常是在mixin被用于共享輸入驗(yàn)證時出現(xiàn)的,mixin可能會期望一個組件有一個輸入值,它將在自己的validate方法中使用。

不過,這可能會引起一些問題。如果我們以后想重構(gòu)一個組件,改變了mixin需要的變量的名稱,會發(fā)生什么情況呢?我們在看這個組件時,不會發(fā)現(xiàn)有什么問題。linter也不會發(fā)現(xiàn)它,我們只會在運(yùn)行時看到錯誤。

現(xiàn)在想象一個有很多mixin的組件。我們可以重構(gòu)本地?cái)?shù)據(jù)屬性嗎?或者它會破壞mixin嗎?我們得手動搜索才能知道。

從mixins遷移

mixin的替代方案,包括高階組件,utility 方法和其他一些組件組成模式。

mixins的缺點(diǎn)是Composition API背后的主要推動因素之一,讓我們快速了解一下它是如何工作的,然后再看它如何克服mixin問題。

快速入門Composition API

Composition API的主要思想是,我們將它們定義為從新的 setup 函數(shù)返回的JavaScript變量,而不是將組件的功能(例如state、method、computed等)定義為對象屬性。

以這個經(jīng)典的Vue 2組件為例,它定義了一個“計(jì)數(shù)器”功能:

//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 * 2)
  function increment() {
   count.value++;
  }
  return {
   count,
   double,
   increment
  }
 }
}

首先會注意到,我們導(dǎo)入了 ref 函數(shù),該函數(shù)允許我們定義一個響應(yīng)式變量,其作用與 data 變量幾乎相同。計(jì)算屬性的情況與此相同。

increment 方法不是被動的,所以它可以被聲明為一個普通的JavaScript函數(shù)。注意,我們需要更改子屬性 count 的 value 才能更改響應(yīng)式變量。這是因?yàn)槭褂?ref 創(chuàng)建的響應(yīng)式變量必須是對象,以便在傳遞時保持其響應(yīng)式。

定義完這些功能后,我們將從 setup 函數(shù)中將其返回。上面兩個組件之間的功能沒有區(qū)別,我們所做的只是使用替代API。

代碼提取

Composition API的第一個明顯優(yōu)點(diǎn)是提取邏輯很容易。

讓我們使用Composition API重構(gòu)上面定義的組件,以使我們定義的功能位于JavaScript模塊 useCounter 中(在特性描述前面加上“use”是一種Composition API命名約定。)。

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

export default function () {
 const count = ref(0);
 const double = computed(() => count * 2)
 function increment() {
  count.value++;
 }
 return {
  count,
  double,
  increment
 }
}

代碼重用

要在組件中使用該函數(shù),我們只需將模塊導(dǎo)入組件文件并調(diào)用它(注意導(dǎo)入是一個函數(shù))。這將返回我們定義的變量,隨后我們可以從 setup 函數(shù)中返回它們。

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

export default {
 setup() {
  const { count, double, increment } = useCounter();
  return {
   count,
   double,
   increment
  }
 }
}

乍一看,這似乎有點(diǎn)冗長而毫無意義,但讓我們來看看這種模式如何克服了前面討論的mixins問題。

命名沖突解決了
我們之前已經(jīng)了解了mixin如何使用與消費(fèi)者組件中的名稱相同的屬性,或者甚至更隱蔽地使用了消費(fèi)者組件使用的其他mixin中的屬性。

這不是Composition API的問題,因?yàn)槲覀冃枰@式命名任何狀態(tài)或從合成函數(shù)返回的方法。

export default {
 setup () {
  const { someVar1, someMethod1 } = useCompFunction1();
  const { someVar2, someMethod2 } = useCompFunction2();
  return {
   someVar1,
   someMethod1,
   someVar2,
   someMethod2
  }
 }
}

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

隱式依賴…解決了!

前面還看到mixin如何使用在消費(fèi)組件上定義的 data 屬性,這可能會使代碼變得脆弱,并且很難進(jìn)行推理。

合成函數(shù)(Composition Function)還可以調(diào)用消費(fèi)組件中定義的局部變量。不過,不同之處在于,現(xiàn)在必須將此變量顯式傳遞給合成函數(shù)。

import useCompFunction from "./useCompFunction";

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

  // 它必須作為參數(shù)顯式地傳遞
  const { ... } = useCompFunction(myLocalVal);
 }
}

總結(jié)

mixin模式表面上看起來很安全。然而,通過合并對象來共享代碼,由于它給代碼增加了脆弱性,并且掩蓋了推理功能的能力,因此成為一種反模式。

Composition API最聰明的部分是,它允許Vue依靠原生JavaScript中內(nèi)置的保障措施來共享代碼,比如將變量傳遞給函數(shù)和模塊系統(tǒng)。

這是否意味著Composition API在各方面都比Vue的經(jīng)典API優(yōu)越?不是的。在大多數(shù)情況下,你堅(jiān)持使用經(jīng)典API是沒有問題的。但是,如果你打算重用代碼,Composition API無疑是優(yōu)越的。

到此這篇關(guān)于淺談Vue3 Composition API如何替換Vue Mixins的文章就介紹到這了,更多相關(guān)Vue3 Composition 替換Vue Mixins內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 解決Vue2?axios發(fā)請求報(bào)400錯誤"Error:?Request?failed?with?status?code?400"

    解決Vue2?axios發(fā)請求報(bào)400錯誤"Error:?Request?failed?with?s

    這篇文章主要給大家介紹了關(guān)于如何解決Vue2?axios發(fā)請求報(bào)400錯誤"Error:?Request?failed?with?status?code?400"的相關(guān)資料,在Vue應(yīng)用程序中我們通常會使用axios作為網(wǎng)絡(luò)請求庫,需要的朋友可以參考下
    2023-07-07
  • Vue CLI4 Vue.config.js標(biāo)準(zhǔn)配置(最全注釋)

    Vue CLI4 Vue.config.js標(biāo)準(zhǔn)配置(最全注釋)

    這篇文章主要介紹了Vue CLI4 Vue.config.js標(biāo)準(zhǔn)配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • vue發(fā)送ajax請求詳解

    vue發(fā)送ajax請求詳解

    如何利用vue進(jìn)行AJAX,其它vue本身不支持發(fā)送AJAX請求,需要使用vue-resource(vue1.0版本)或axios(vue2.0版本)第三方插件的支持才行
    2018-10-10
  • Elemenu中el-table中使用el-popover選中關(guān)閉無效解決辦法(最新推薦)

    Elemenu中el-table中使用el-popover選中關(guān)閉無效解決辦法(最新推薦)

    這篇文章主要介紹了Elemenu中el-table中使用el-popover選中關(guān)閉無效解決辦法(最新推薦),因?yàn)樵趀l-table-column里,因?yàn)槭嵌嘈?使用trigger="manual"?時,用v-model="visible"來控制時,控件找不到這個值,才換成trigger="click",需要的朋友可以參考下
    2024-03-03
  • WebStorm無法正確識別Vue3組合式API的解決方案

    WebStorm無法正確識別Vue3組合式API的解決方案

    這篇文章主要介紹了WebStorm無法正確識別Vue3組合式API的解決方案,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-02-02
  • vue3動態(tài)路由addRoute實(shí)例詳解

    vue3動態(tài)路由addRoute實(shí)例詳解

    這篇文章主要介紹了vue3動態(tài)路由addRoute的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • vue3 axios安裝及使用示例詳解

    vue3 axios安裝及使用示例詳解

    這篇文章主要介紹了vue3 axios安裝及使用示例代碼,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • vue使用代理解決請求跨域問題詳解

    vue使用代理解決請求跨域問題詳解

    這篇文章主要為大家詳細(xì)介紹了vue使用代理解決請求跨域問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Vue.js中關(guān)于“{{}}”的用法

    Vue.js中關(guān)于“{{}}”的用法

    這篇文章主要介紹了Vue.js中關(guān)于“{{}}”的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue infinite update loop的問題解決

    Vue infinite update loop的問題解決

    這篇文章主要介紹了Vue "...infinite update loop..."的問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04

最新評論

莱芜市| 揭阳市| 徐汇区| 开平市| 霍城县| 西丰县| 郴州市| 湖北省| 子长县| 道真| 新宾| 甘孜县| 红原县| 沾化县| 丹凤县| 缙云县| 崇文区| 昌乐县| 休宁县| 醴陵市| 锡林浩特市| 阳城县| 德昌县| 香港 | 远安县| 尚义县| 松江区| 甘孜县| 阿瓦提县| 揭阳市| 敦化市| 丰顺县| 宜兰县| 天门市| 萨嘎县| 白朗县| 珲春市| 北票市| 绥棱县| 连平县| 七台河市|