国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
簡述Mixin
Mixin被認為是“有害的”
命名沖突
隱式依賴
從mixin遷移
Composition API速成課程
代碼提取
代碼重用
命名沖突……已解決!
隱式依賴……已解決!
總結(jié)
首頁 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,您可能已經(jīng)使用過mixin來實現(xiàn)此目的。但是新的Composition API(現(xiàn)在可作為Vue 2的插件使用,并且是Vue 3的即將推出的功能)提供了一種更好的解決方案。

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

簡述Mixin

讓我們快速回顧一下mixin模式,因為它對于我們將在下一節(jié)中介紹的內(nèi)容至關(guān)重要。

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

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

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

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

現(xiàn)在,我們可以通過將其分配給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來重用邏輯是一種反模式,主張避免使用它們。

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

命名沖突

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

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

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

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

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

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

隱式依賴

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

但這可能會導致問題。如果我們稍后想要重構(gòu)組件并更改mixin需要的變量的名稱會發(fā)生什么?從組件中我們不會注意到任何問題。代碼檢查器也不會發(fā)現(xiàn)它。我們只會在運行時看到錯誤。

現(xiàn)在想象一個包含許多mixin的組件。我們可以重構(gòu)局部數(shù)據(jù)屬性嗎,或者它會破壞mixin嗎?哪個mixin?我們必須手動搜索所有mixin才能知道。

從mixin遷移

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

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

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

Composition API速成課程

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

這是一個使用Composition API定義的Vue 2組件的經(jīng)典示例,它定義了一個“計數(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.value * 2)
    function increment() {
      count.value  ;
    }
    return {
      count,
      double,
      increment
    }
  }
}

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

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

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

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

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

代碼提取

Composition API的第一個明顯優(yōu)勢是易于提取邏輯。

讓我們使用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.value * 2)
  function increment() {
    count.value  ;
  }
  return {
    count,
    double,
    increment
  }
}

代碼重用

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

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

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

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

命名沖突……已解決!

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

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

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

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

隱式依賴……已解決!

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

組合函數(shù)也可以調(diào)用使用組件中定義的局部變量。但是,區(qū)別在于現(xiàn)在必須將此變量顯式地傳遞給組合函數(shù)。

import useCompFunction from "./useCompFunction";

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

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

總結(jié)

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

Composition API最巧妙之處在于它允許Vue依靠內(nèi)置于原生JavaScript中的安全措施來共享代碼,例如將變量傳遞給函數(shù)和模塊系統(tǒng)。

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

以上是VUE組成API如何替代Vue Mixins的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

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集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

什么是'渲染障礙CSS”? 什么是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會阻塞頁面渲染是因為瀏覽器默認將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量內(nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢樣式。1.提取關(guān)鍵CSS并內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合并CSS減少請求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過度拆分與復雜腳本控制。

外部與內(nèi)部CSS:最好的方法是什么? 外部與內(nèi)部CSS:最好的方法是什么? Jun 20, 2025 am 12:45 AM

thebestapphachforcssdepprodsontheproject'sspefificneeds.forlargerprojects,externalcsSissBetterDuoSmaintoMaintainability andReusability; forsMallerProjectsorsingle-pageApplications,InternaltCsmightBemoresobleable.InternalCsmightBemorese.it.it'sclucialtobalancepopryseceneceenceprodrenceprodrenceNeed

我的CSS必須在較低的情況下嗎? 我的CSS必須在較低的情況下嗎? Jun 19, 2025 am 12:29 AM

否,CSSDOESNOTHAVETOBEINLOWERCASE.CHOMENDENS,使用flowercaseisrecommondendendending:1)一致性和可讀性,2)避免使用促進性技術(shù),3)潛在的Performent FormanceBenefits,以及4)RightCollaboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraborationWithInteams。

CSS案例靈敏度:了解重要的 CSS案例靈敏度:了解重要的 Jun 20, 2025 am 12:09 AM

cssismostlycaseminemintiment,buturlsandfontfamilynamesarecase敏感。1)屬性和valueslikeColor:紅色; prenotcase-sensive.2)urlsmustmustmatchtheserver'server'scase,例如

什么是AutoPrefixer,它如何工作? 什么是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個根據(jù)目標瀏覽器范圍自動為CSS屬性添加廠商前綴的工具。1.它解決了手動維護前綴易出錯的問題;2.通過PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設置browserslist、在構(gòu)建流程中啟用;4.注意事項有不手動加前綴、保持配置更新、非所有屬性都加前綴、建議配合預處理器使用。

什么是CSS計數(shù)器? 什么是CSS計數(shù)器? Jun 19, 2025 am 12:34 AM

csscounterscanautomationallymentermentermentections和lists.1)usecounter-ensettoInitializize,反插入式發(fā)芽,andcounter()orcounters()

CSS:何時重要(何時不)? CSS:何時重要(何時不)? Jun 19, 2025 am 12:27 AM

在CSS中,選擇器和屬性名不區(qū)分大小寫,而值、命名顏色、URL和自定義屬性則區(qū)分大小寫。1.選擇器和屬性名不區(qū)分大小寫,例如background-color和Background-Color相同。2.值中的十六進制顏色不區(qū)分大小寫,但命名顏色區(qū)分大小寫,如red有效而Red無效。3.URL區(qū)分大小寫,可能導致文件加載問題。4.自定義屬性(變量)區(qū)分大小寫,使用時需注意大小寫一致。

CSS中的情況敏感性:選擇器,屬性和值所解釋的 CSS中的情況敏感性:選擇器,屬性和值所解釋的 Jun 19, 2025 am 12:38 AM

cssselectorsand and propertynamesarecase-insimentimentiment.1)selectorSlike like'div'div'div'div'and'and'and'And'Andiv'areequivalent.2)propertioessuchas'backusuchas'backusuchas'backusuchas'backusuchas'backer'back-and'background and backorgook crolor'backorground-artreateateDthesementhesame.3)

See all articles