国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

說說你對vue的mixin的理解,有什么應(yīng)用場景?

這篇具有很好參考價值的文章主要介紹了說說你對vue的mixin的理解,有什么應(yīng)用場景?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識,希望對大家有所幫助

說說你對vue的mixin的理解,有什么應(yīng)用場景?

一、mixin是什么

Mixin是面向?qū)ο蟪绦蛟O(shè)計語言中的類,提供了方法的實現(xiàn)。其他類可以訪問mixin類的方法而不必成為其子類

Mixin類通常作為功能模塊使用,在需要該功能時“混入”,有利于代碼復(fù)用又避免了多繼承的復(fù)雜

Vue中的mixin

先來看一下官方定義

mixin(混入),提供了一種非常靈活的方式,來分發(fā)?Vue?組件中的可復(fù)用功能。

本質(zhì)其實就是一個js對象,它可以包含我們組件中任意功能選項,如data、componentsmethods、createdcomputed等等

我們只要將共用的功能以對象的方式傳入?mixins選項中,當(dāng)組件使用?mixins對象時所有mixins對象的選項都將被混入該組件本身的選項中來

Vue中我們可以局部混入跟全局混入

局部混入

定義一個mixin對象,有組件optionsdata、methods屬性

var myMixin = {
  created: function () {
    this.hello()
  },
  methods: {
    hello: function () {
      console.log('hello from mixin!')
    }
  }
}

組件通過mixins屬性調(diào)用mixin對象

Vue.component('componentA',{
  mixins: [myMixin]
})

該組件在使用的時候,混合了mixin里面的方法,在自動執(zhí)行created生命鉤子,執(zhí)行hello方法

全局混入

通過Vue.mixin()進行全局的混入

Vue.mixin({
  created: function () {
      console.log("全局混入")
    }
})

使用全局混入需要特別注意,因為它會影響到每一個組件實例(包括第三方組件)

PS:全局混入常用于插件的編寫

注意事項:

當(dāng)組件存在與mixin對象相同的選項的時候,進行遞歸合并的時候組件的選項會覆蓋mixin的選項

但是如果相同選項為生命周期鉤子的時候,會合并成一個數(shù)組,先執(zhí)行mixin的鉤子,再執(zhí)行組件的鉤子

二、使用場景

在日常的開發(fā)中,我們經(jīng)常會遇到在不同的組件中經(jīng)常會需要用到一些相同或者相似的代碼,這些代碼的功能相對獨立

這時,可以通過Vuemixin功能將相同或者相似的代碼提出來

舉個例子

定義一個modal彈窗組件,內(nèi)部通過isShowing來控制顯示

const Modal = {
  template: '#modal',
  data() {
    return {
      isShowing: false
    }
  },
  methods: {
    toggleShow() {
      this.isShowing = !this.isShowing;
    }
  }
}

定義一個tooltip提示框,內(nèi)部通過isShowing來控制顯示

const Tooltip = {
  template: '#tooltip',
  data() {
    return {
      isShowing: false
    }
  },
  methods: {
    toggleShow() {
      this.isShowing = !this.isShowing;
    }
  }
}

通過觀察上面兩個組件,發(fā)現(xiàn)兩者的邏輯是相同,代碼控制顯示也是相同的,這時候mixin就派上用場了

首先抽出共同代碼,編寫一個mixin

const toggle = {
  data() {
    return {
      isShowing: false
    }
  },
  methods: {
    toggleShow() {
      this.isShowing = !this.isShowing;
    }
  }
}

兩個組件在使用上,只需要引入mixin

const Modal = {
  template: '#modal',
  mixins: [toggle]
};
 
const Tooltip = {
  template: '#tooltip',
  mixins: [toggle]
}

通過上面小小的例子,讓我們知道了Mixin對于封裝一些可復(fù)用的功能如此有趣、方便、實用

三、源碼分析

首先從Vue.mixin入手

源碼位置:/src/core/global-api/mixin.js

export function initMixin (Vue: GlobalAPI) {
  Vue.mixin = function (mixin: Object) {
    this.options = mergeOptions(this.options, mixin)
    return this
  }
}

主要是調(diào)用merOptions方法

源碼位置:/src/core/util/options.js

export function mergeOptions (
  parent: Object,
  child: Object,
  vm?: Component
): Object {

if (child.mixins) { // 判斷有沒有mixin 也就是mixin里面掛mixin的情況 有的話遞歸進行合并
    for (let i = 0, l = child.mixins.length; i < l; i++) {
    parent = mergeOptions(parent, child.mixins[i], vm)
    }
}

  const options = {} 
  let key
  for (key in parent) {
    mergeField(key) // 先遍歷parent的key 調(diào)對應(yīng)的strats[XXX]方法進行合并
  }
  for (key in child) {
    if (!hasOwn(parent, key)) { // 如果parent已經(jīng)處理過某個key 就不處理了
      mergeField(key) // 處理child中的key 也就parent中沒有處理過的key
    }
  }
  function mergeField (key) {
    const strat = strats[key] || defaultStrat
    options[key] = strat(parent[key], child[key], vm, key) // 根據(jù)不同類型的options調(diào)用strats中不同的方法進行合并
  }
  return options
}

從上面的源碼,我們得到以下幾點:

  • 優(yōu)先遞歸處理?mixins
  • 先遍歷合并parent?中的key,調(diào)用mergeField方法進行合并,然后保存在變量options
  • 再遍歷?child,合并補上?parent?中沒有的key,調(diào)用mergeField方法進行合并,保存在變量options
  • 通過?mergeField?函數(shù)進行了合并

下面是關(guān)于Vue的幾種類型的合并策略

  • 替換型
  • 合并型
  • 隊列型
  • 疊加型

替換型

替換型合并有props、methodsinject、computed

strats.props =
strats.methods =
strats.inject =
strats.computed = function (
  parentVal: ?Object,
  childVal: ?Object,
  vm?: Component,
  key: string
): ?Object {
  if (!parentVal) return childVal // 如果parentVal沒有值,直接返回childVal
  const ret = Object.create(null) // 創(chuàng)建一個第三方對象 ret
  extend(ret, parentVal) // extend方法實際是把parentVal的屬性復(fù)制到ret中
  if (childVal) extend(ret, childVal) // 把childVal的屬性復(fù)制到ret中
  return ret
}
strats.provide = mergeDataOrFn

同名的props、methodsinject、computed會被后來者代替

合并型

和并型合并有:data

strats.data = function(parentVal, childVal, vm) {    
    return mergeDataOrFn(
        parentVal, childVal, vm
    )
};

function mergeDataOrFn(parentVal, childVal, vm) {    
    return function mergedInstanceDataFn() {        
        var childData = childVal.call(vm, vm) // 執(zhí)行data掛的函數(shù)得到對象
        var parentData = parentVal.call(vm, vm)        
        if (childData) {            
            return mergeData(childData, parentData) // 將2個對象進行合并                                 
        } else {            
            return parentData // 如果沒有childData 直接返回parentData
        }
    }
}

function mergeData(to, from) {    
    if (!from) return to    
    var key, toVal, fromVal;    
    var keys = Object.keys(from);   
    for (var i = 0; i < keys.length; i++) {
        key = keys[i];
        toVal = to[key];
        fromVal = from[key];    
        // 如果不存在這個屬性,就重新設(shè)置
        if (!to.hasOwnProperty(key)) {
            set(to, key, fromVal);
        }      
        // 存在相同屬性,合并對象
        else if (typeof toVal =="object" && typeof fromVal =="object") {
            mergeData(toVal, fromVal);
        }
    }    
    return to
}

mergeData函數(shù)遍歷了要合并的 data 的所有屬性,然后根據(jù)不同情況進行合并:

  • 當(dāng)目標(biāo) data 對象不包含當(dāng)前屬性時,調(diào)用?set?方法進行合并(set方法其實就是一些合并重新賦值的方法)
  • 當(dāng)目標(biāo) data 對象包含當(dāng)前屬性并且當(dāng)前值為純對象時,遞歸合并當(dāng)前對象值,這樣做是為了防止對象存在新增屬性

隊列性

隊列性合并有:全部生命周期和watch

function mergeHook (
  parentVal: ?Array<Function>,
  childVal: ?Function | ?Array<Function>
): ?Array<Function> {
  return childVal
    ? parentVal
      ? parentVal.concat(childVal)
      : Array.isArray(childVal)
        ? childVal
        : [childVal]
    : parentVal
}

LIFECYCLE_HOOKS.forEach(hook => {
  strats[hook] = mergeHook
})

// watch
strats.watch = function (
  parentVal,
  childVal,
  vm,
  key
) {
  // work around Firefox's Object.prototype.watch...
  if (parentVal === nativeWatch) { parentVal = undefined; }
  if (childVal === nativeWatch) { childVal = undefined; }
  /* istanbul ignore if */
  if (!childVal) { return Object.create(parentVal || null) }
  {
    assertObjectType(key, childVal, vm);
  }
  if (!parentVal) { return childVal }
  var ret = {};
  extend(ret, parentVal);
  for (var key$1 in childVal) {
    var parent = ret[key$1];
    var child = childVal[key$1];
    if (parent && !Array.isArray(parent)) {
      parent = [parent];
    }
    ret[key$1] = parent
      ? parent.concat(child)
      : Array.isArray(child) ? child : [child];
  }
  return ret
};

生命周期鉤子和watch被合并為一個數(shù)組,然后正序遍歷一次執(zhí)行

疊加型

疊加型合并有:component、directives、filters

strats.components=
strats.directives=

strats.filters = function mergeAssets(
    parentVal, childVal, vm, key
) {    
    var res = Object.create(parentVal || null);    
    if (childVal) { 
        for (var key in childVal) {
            res[key] = childVal[key];
        }   
    } 
    return res
}

疊加型主要是通過原型鏈進行層層的疊加文章來源地址http://www.zghlxwxcb.cn/news/detail-837817.html

小結(jié):

  • 替換型策略有props、methods、inject、computed,就是將新的同名參數(shù)替代舊的參數(shù)
  • 合并型策略是data, 通過set方法進行合并和重新賦值
  • 隊列型策略有生命周期函數(shù)和watch,原理是將函數(shù)存入一個數(shù)組,然后正序遍歷依次執(zhí)行
  • 疊加型有component、directivesfilters,通過原型鏈進行層層的疊加

參考文獻(xiàn)

  • https://zhuanlan.zhihu.com/p/31018570
  • https://juejin.cn/post/6844904015495446536#heading-1
  • https://juejin.cn/post/6844903846775357453
  • https://vue3js.cn/docs/zh

到了這里,關(guān)于說說你對vue的mixin的理解,有什么應(yīng)用場景?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 說說你對二分查找的理解?如何實現(xiàn)?應(yīng)用場景?

    說說你對二分查找的理解?如何實現(xiàn)?應(yīng)用場景?

    ? 在計算機科學(xué)中,二分查找算法,也稱折半搜索算法,是一種在有序數(shù)組中查找某一特定元素的搜索算法 想要應(yīng)用二分查找法,則這一堆數(shù)應(yīng)有如下特性: 存儲在數(shù)組中 有序排序 搜索過程從數(shù)組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結(jié)束 如果

    2024年04月25日
    瀏覽(20)
  • 說說你對貪心算法、回溯算法的理解?應(yīng)用場景?

    說說你對貪心算法、回溯算法的理解?應(yīng)用場景?

    貪心算法,又稱貪婪算法,是算法設(shè)計中的一種思想 其期待每一個階段都是局部最優(yōu)的選擇,從而達(dá)到全局最優(yōu),但是結(jié)果并不一定是最優(yōu)的 舉個零錢兌換的例子,如果你有1元、2元、5元的錢幣數(shù)張,用于兌換一定的金額,但是要求兌換的錢幣張數(shù)最少 如果現(xiàn)在你要兌換

    2024年04月28日
    瀏覽(31)
  • 說說你對slot的理解?slot使用場景有哪些?

    說說你對slot的理解?slot使用場景有哪些?

    定義 在Vue.js中,slot(插槽)是一種用于組件之間內(nèi)容分發(fā)的機制。它允許你在父組件中編寫子組件的內(nèi)容,從而增加了組件的靈活性和可重用性。 Slot 藝名插槽,花名“占坑”,我們可以理解為 slot 在組件模板中占好了位置,當(dāng)使用該組件標(biāo)簽時候,組件標(biāo)簽里面的內(nèi)容就

    2024年02月07日
    瀏覽(23)
  • 說說你對keep-alive的理解是什么?

    說說你對keep-alive的理解是什么?

    keep-alive 是 vue 中的內(nèi)置組件,能在組件切換過程中將狀態(tài)保留在內(nèi)存中,防止重復(fù)渲染 DOM keep-alive ?包裹動態(tài)組件時,會緩存不活動的組件實例,而不是銷毀它們 keep-alive 可以設(shè)置以下 props 屬性: include ?- 字符串或正則表達(dá)式。只有名稱匹配的組件會被緩存 exclude ?- 字符串

    2024年03月09日
    瀏覽(31)
  • 說說對WebSocket的理解?應(yīng)用場景?

    說說對WebSocket的理解?應(yīng)用場景?

    WebSocket,是一種網(wǎng)絡(luò)傳輸協(xié)議,位于 OSI 模型的應(yīng)用層??稍趩蝹€ TCP 連接上進行全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實時通迅 客戶端和服務(wù)器只需要完成一次握手,兩者之間就可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸 從上圖可見, websocket 服務(wù)器與客戶

    2024年04月08日
    瀏覽(56)
  • 說說你對圖的理解?相關(guān)操作有哪些?

    說說你對圖的理解?相關(guān)操作有哪些?

    在計算機科學(xué)中,圖是一種抽象的數(shù)據(jù)類型,在圖中的數(shù)據(jù)元素通常稱為結(jié)點, V 是所有頂點的集合, E 是所有邊的集合 如果兩個頂點 v , w ,只能由 v 向 w ,而不能由 w 向 v ,那么我們就把這種情況叫做一個從? v ?到? w ?的有向邊。 v 也被稱做初始點, w 也被稱為終點。這

    2024年04月22日
    瀏覽(28)
  • 說說你對集合的理解?常見的操作有哪些?

    說說你對集合的理解?常見的操作有哪些?

    集合(Set),指具有某種特定性質(zhì)的事物的總體,里面的每一項內(nèi)容稱作元素 在數(shù)學(xué)中,我們經(jīng)常會遇到集合的概念: 有限集合:例如一個班集所有的同學(xué)構(gòu)成的集合 無限集合:例如全體自然數(shù)集合 在計算機中集合道理也基本一致,具有三大特性: 確定性:于一個給定的

    2024年04月16日
    瀏覽(21)
  • 說說你對數(shù)據(jù)結(jié)構(gòu)的理解?有哪些?區(qū)別?

    說說你對數(shù)據(jù)結(jié)構(gòu)的理解?有哪些?區(qū)別?

    數(shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式,是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合 前面講到,一個程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)是實現(xiàn)算法的基礎(chǔ),選擇合適的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運行或者存儲效率 數(shù)據(jù)元素相互之間的關(guān)系稱為結(jié)構(gòu),根據(jù)數(shù)據(jù)元

    2024年04月10日
    瀏覽(24)
  • 說說你對樹的理解?相關(guān)的操作有哪些?

    說說你對樹的理解?相關(guān)的操作有哪些?

    在計算機領(lǐng)域,樹形數(shù)據(jù)結(jié)構(gòu)是一類重要的非線性數(shù)據(jù)結(jié)構(gòu),可以表示數(shù)據(jù)之間一對多的關(guān)系。以樹與二叉樹最為常用,直觀看來,樹是以分支關(guān)系定義的層次結(jié)構(gòu) 二叉樹滿足以下兩個條件: 本身是有序樹 樹中包含的各個結(jié)點的不能超過 2,即只能是 0、1 或者 2 如下圖,左

    2024年04月17日
    瀏覽(22)
  • 說說你對鏈表的理解?常見的操作有哪些?

    說說你對鏈表的理解?常見的操作有哪些?

    鏈表(Linked List)是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的,由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成 每個結(jié)點包括兩個部分:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,另一個是存儲下一個結(jié)點地址的指針域

    2024年04月15日
    瀏覽(48)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包