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

Vue mixin 混入

這篇具有很好參考價值的文章主要介紹了Vue mixin 混入。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

可以復(fù)用的組件,我們一般會抽離,寫成公共的模塊。

可以復(fù)用的方法,我們一般會抽離,寫成公共的函數(shù)。

那么 在 Vue 中,如果 某幾個組件實例 VueComponent 中、或者 整個 Vue 項目中 都存在相同的配置,那就需要用到 mixin 這個方法了

混入 (mixin) :提供了一種非常靈活的方式,來分發(fā) Vue 組件中的可復(fù)用功能。一個混入對象可以包含任意組件選項。當組件使用混入對象時,所有混入對象的選項將被“混合”進入該組件本身的選項。

?首先、我們需要明白第一點,mixin 是一個對象,而且是包含組件中任意配置項的對象,也就是說,創(chuàng)建組件的時候,我們傳遞的 data、component、methods、computed、directives、生命周期鉤子函數(shù) 等等 一系列配置項 都可以作為 mixin 對象的鍵值對。

其次、我們創(chuàng)建的 mixin 對象,在組件中引用的時候,mixin 對象 中的鍵值對會 混入 該組件的配置詳項中,至于是怎么混入的,下面在講。?

創(chuàng)建 mixin?

?這個 mixin 對象 中,配置了一個 created 鉤子函數(shù),和 methods 對象,如果我們單獨把這個配置寫在組件中的話,那就是組件在初始化的時候,就會調(diào)用 hello()?

// 定義一個混入對象
var myMixin = {
  created: function () {
    this.hello()
  },
  methods: {
    hello: function () {
      console.log('hello from mixin!')
    }
  }
}

創(chuàng)建一個 mixin 混入對象是很簡單的,只是我們需要注意的是,配置的鍵值對,只能是創(chuàng)建組件時傳入的配置項,如果你傳了一個 其他不存在的屬性 ,組件接收之后,是不會對其解析的,就相當于你在組件內(nèi)部,定義了一個不存在屬性,Vue 底層是不會管這個玩意的。

但是,實例對象上是存在你混入的這個屬性的,下面的自定義混入會說到

const mixin = {
    msg: '這是混入的msg',
    created: () => {
      console.log("mixin混入對象的鉤子被調(diào)用!");
    },
  };

const vm1 = Vue.extend({
  template: `<div>123</div> `,
  mixins:[mixin]
})

const vm = new Vue({
  el: '#root1',
  mixins: [mixin]
})

console.dir(vm1, 'vm1')
console.dir(vm, 'vm')

分別打印出兩個實例對象,左邊是 組件實例對象,右邊是 Vue 實例對象(可以看到其中存在 el 屬性)。我們發(fā)現(xiàn),兩者都是存在混入的數(shù)據(jù)的 ,且混入的自定義數(shù)據(jù)已經(jīng)被平鋪出來了。

Vue mixin 混入,vue專欄,vue.js,javascript,前端Vue mixin 混入,vue專欄,vue.js,javascript,前端

使用 mixin 混入?

創(chuàng)建了一個 mixin 對象之后,組件需要使用的時候,就和引入公共組件和公共方法一樣。至于其中的內(nèi)容,還是使用上面定義的

比如:我在 src 目錄下新建了一個 mixin 文件夾,和一個 index.js 文件,那我在引用的時候就正常引入,至于 你是 默認暴露還是分別暴露,那就看個人習慣了。

import {mixin} from '@/mixin/index'

然后在組件配置項中,配置一個 mixins 屬性,值是一個數(shù)組。

export default {
  name: 'HelloWorld',
  mixins:[mixin]
}

刷新頁面,你會發(fā)現(xiàn)控制臺上已經(jīng)輸出了 我想要的結(jié)果

Vue mixin 混入,vue專欄,vue.js,javascript,前端

?mixin 選項合并

?因為 mixin 混入對象 中的配置,是包含組件中任意配置項的對象,如果我的 mixin 混入對象中定義的配置,和組件內(nèi)部定義的配置出現(xiàn)了同名了,那 Vue 是怎么合并這兩個選項的呢?

data數(shù)據(jù)對象:在內(nèi)部會進行遞歸合并,并在發(fā)生沖突時以組件數(shù)據(jù)優(yōu)先

var mixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  }
}

new Vue({
  mixins: [mixin],
  data: function () {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  created: function () {
    console.log(this.$data)
    // => { message: "goodbye", foo: "abc", bar: "def" }
  }
})

同名鉤子函數(shù)?將合并為一個數(shù)組,因此都將被調(diào)用。另外,混入對象的鉤子將在組件自身鉤子?之前?調(diào)用。

export const mixin = {
  created: () => {
    console.log("mixin混入對象的鉤子被調(diào)用!");
  },
};

export default {
  name: 'HelloWorld',
  mixins: [mixin],
  created: function () {
    console.log('組件鉤子被調(diào)用')
  }
}

Vue mixin 混入,vue專欄,vue.js,javascript,前端

?值為對象的選項例如?methodscomponents?和?directives,將被合并為同一個對象。兩個對象鍵名沖突時,取組件對象的鍵值對。

export const mixin = {
  created: () => {
    console.log("mixin混入對象的鉤子被調(diào)用!");
  },
  methods: {
    foo: () => {
      console.log("foo");
    },
    conflicting: () => {
      console.log("from mixin");
    },
  },
};

export default {
  name: "HelloWorld",
  mixins: [mixin],
  created: () => {
    console.log("組件鉤子被調(diào)用");
  },
  methods: {
    bar: () => {
      console.log("bar");
    },
    conflicting: () => {
      console.log("from self");
    },
  },
};

在組件中調(diào)用這三個方法,看看在控制臺上輸出的是啥

<div @click="bar">bar</div>
<div @click="conflicting">conflicting</div>
<div @click="foo">foo</div>

Vue mixin 混入,vue專欄,vue.js,javascript,前端

?可以看到,mixin 混入對象中存在的 foo 函數(shù),和?conflicting函數(shù),而組件中 存在 bar函數(shù) 和?conflicting 函數(shù)。在組件中能成功調(diào)用這三個方法,說明 mixin 混入對象中的 foo 函數(shù),已經(jīng)被合并到了組件的 methods 對象中。而?conflicting 函數(shù)執(zhí)行之后,根據(jù)打印出的值,發(fā)現(xiàn)該函數(shù)執(zhí)行的是 組件內(nèi)部定義的?conflicting 函數(shù)。這就說明兩個對象鍵名沖突時,取組件對象的鍵值對。

全局混入

上面講的都是在組件內(nèi)部混入,其實也可以在全局中混入。在 mian.js 中,當 執(zhí)行 new Vue ( ) 之前,可以通過?Vue.mixin() 函數(shù),向其內(nèi)部傳入一個 mixin 混入對象,Vue 底層就會將混入對象掛載到Vue全局上。

Vue.mixin({
  created:  () => {
    console.log('我在全局混入了created鉤子函數(shù)');
  },
});

new Vue({
  render: h => h(App),
}).$mount('#app')

但是這樣存在一個問題,就是如果我在全局通過 Vue.mixin() 混入了配置,那么我所有的組件 (包括第三方組件) 都會混入這個配置,這樣可能會導(dǎo)致組件配置混亂冗余,甚至覆蓋第三方組件的配置導(dǎo)致程序出錯。

Vue mixin 混入,vue專欄,vue.js,javascript,前端

?上面我在全局混入了 一個 鉤子函數(shù),導(dǎo)致這個鉤子函數(shù)執(zhí)行了三次,這是因為,在 new Vue() 的時候執(zhí)行了一次,App組件中執(zhí)行了一次,在 HelloWorld 組件也執(zhí)行了一次。這就看出來很多余了。

?自定義混入

區(qū)別:通過 Vue.mixin() 混入的是正?;烊?,直接寫在 new Vue() 中(或者是組件中)的是自定義混入。通過Vue.config.optionMergeStrategies 添加的也是自定義混入

Vue.mixin({
  created: function () {
    var myOption = this.$options.myOption
    if (myOption) {
      console.log(myOption)
    }
  }
})

new Vue({
  myOption: 'hello!'
})

Vue mixin 混入,vue專欄,vue.js,javascript,前端

?這里只打印了一次,代表只在 new Vue()的時候執(zhí)行了一次。大多數(shù)情況下,全局的混入只應(yīng)當應(yīng)用于自定義選項,這樣可以避免上面的副作用。

自定義選項將使用默認策略,即簡單地覆蓋已有值。

我先正常混入了一個??myOption 屬性,值為 123。

Vue.mixin({
  myOption:'123',
});

打印vm實例,$options 對象中存在該鍵值對

Vue mixin 混入,vue專欄,vue.js,javascript,前端

?直接在 new Vue() 中定義 同名屬性,值為 abc

const vm =  new Vue({
  myOption:'abc',
  render: h => h(App),
}).$mount('#app')

打印 vm實例對象,發(fā)現(xiàn)屬性值已經(jīng)更改。

Vue mixin 混入,vue專欄,vue.js,javascript,前端

如果想讓自定義選項以自定義邏輯合并,可以向?Vue.config.optionMergeStrategies?添加一個函數(shù),那我們來看看?Vue.config.optionMergeStrategies?是個啥

Vue mixin 混入,vue專欄,vue.js,javascript,前端

打印出來一看, 好家伙,這不就是 Vue 實例上的所有方法么。按文檔的意思,我好像也可以自定義的往這里面加我自己的方法。

var strategies = Vue.config.optionMergeStrategies;
strategies.myOption = "123";

?我隨便往里面加了一個?myOption 屬性,值為 123,打印出來之后,確實存在設(shè)置的屬性和值

Vue mixin 混入,vue專欄,vue.js,javascript,前端

我默認在 new Vue()的時候,注入了一個自定義的選項。這個時候,我們打印這個接收到的vm實例對象,能在 $options 里面找到該屬性,且它的值就是我設(shè)置的 hello

Vue mixin 混入,vue專欄,vue.js,javascript,前端

?通過??Vue.config.optionMergeStrategies 添加一個同名的屬性 ,但是這個屬性值是一個函數(shù),且沒有返回值。然后打印vm實例對象會發(fā)現(xiàn) $options 里面的 myOption 屬性值 變成了undefined,函數(shù)沒有返回值,那肯定是undefined。

Vue mixin 混入,vue專欄,vue.js,javascript,前端

?增加一個 返回值 abc,再來看看。

Vue mixin 混入,vue專欄,vue.js,javascript,前端

上面的例子只是做一個演示,表示這個 也可以 通過??Vue.config.optionMergeStrategies 來覆蓋之前的 自定義 選項,同時還可以讓自定義選項以自定義邏輯合并

Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {
  // 接收兩個參數(shù),返回合并后的值,toVal - 現(xiàn)在定義的值,fromVal - 之前定義的值
  console.log(toVal, fromVal, "toVal, fromVal");
  return "aaaaaaa";
};

Vue.config.optionMergeStrategies 對象

?Vue.config.optionMergeStrategies 對象 中存在的屬性之前說過了,就是 實例對象上的屬性和方法。那這么多方法 在合并的時候都是怎么合并的呢?這個就需要去源碼里面瞅一瞅了。

總結(jié)

總結(jié):

1、mixin 混入是一個對象,對象的配置項就是 創(chuàng)建組件 時傳入的 options 配置項

2、在組件內(nèi)混入時,增加引入 mixin 對象,配置項中新增 mixins:['xxx']。全局混入時 Vue.mixin()

3、正?;烊? 在組件中新增配置項?或在全局中使用 Vue.mixin()??) 和? 自定義混入的方式( new Vue() 中增加自定義項 或使用?Vue.config.optionMergeStrategies?)還是存在區(qū)別的

4、混入的規(guī)則文章來源地址http://www.zghlxwxcb.cn/news/detail-613235.html

  • 普通的js原始值(string,number,boolean等)直接覆蓋,以組件值為主。
  • 對象的合并,如果合并雙方都是對象,則使用遞歸的方式將其合并,以組件對象為主。
  • 對于函數(shù),如果需要他們合并后都可以執(zhí)行,則可以考慮將函數(shù)合并成數(shù)組,然后你可以將其包裝成一個新函數(shù),依次調(diào)用合并后數(shù)組中的函數(shù)。生命周期鉤子函數(shù)就是這樣,最后是先執(zhí)行混入的鉤子,在執(zhí)行自己的鉤子。
  • 如果合并的是一些特殊對象,不能遞歸合并,那么根據(jù)情況,你還可以使用原型鏈的方式進行合并。

到了這里,關(guān)于Vue mixin 混入的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • vue2混入實現(xiàn)、mixin、methods

    mixin 混入提供了一種非常靈活的方式來分發(fā) vue 組件中的可復(fù)用功能。一個混入對象可以包含任意組件選項。當組件使用混入對象時,所有混入對象的選項將被混合進入該組件本身的選項。 混入可以將多個組件中的公共配置提取成一個混入對象,這樣就可以實現(xiàn)代碼復(fù)用。

    2023年04月25日
    瀏覽(20)
  • Vue(標簽屬性:ref、配置項:props、混入mixin、插件、樣式屬性:scroped)

    Vue(標簽屬性:ref、配置項:props、混入mixin、插件、樣式屬性:scroped)

    前面提及到了標簽屬性:keys 這里將了解ref:打標識 正常布置腳手架并創(chuàng)建入口文件main.js引入組件 給一個按鈕獲取上方的dom的方法,方法中使用什么進行獲取dom元素 是使用獲取id方法給標簽設(shè)置id,直接操作dom?? 錯誤? 既然原生js可以給dom添加id,那么Vue也有類似的標識方

    2024年02月02日
    瀏覽(44)
  • uniapp開發(fā)中基于vue的混入(mixin) 實現(xiàn)微信小程序全局【發(fā)送給朋友】、【分享到朋友圈】、【復(fù)制鏈接】

    uniapp開發(fā)中基于vue的混入(mixin) 實現(xiàn)微信小程序全局【發(fā)送給朋友】、【分享到朋友圈】、【復(fù)制鏈接】

    一、在開發(fā)微信小程序的時候,發(fā)現(xiàn)【發(fā)送給朋友】、【分享到朋友圈】、【復(fù)制鏈接】功能,灰色不可用。 很常見的功能,但是這幾個功能,并不是你項目建起來了就有的。 1.【發(fā)送給朋友】使用 onShareAppMessage 這個方法 如果你的小程序,發(fā)現(xiàn)他的【轉(zhuǎn)發(fā)給朋友】的按鈕時

    2024年01月17日
    瀏覽(111)
  • 在Vue.js中,什么是mixins?它們的作用是什么?

    在Vue.js中,什么是mixins?它們的作用是什么?

    目錄 一、Vue.js介紹 二、什么是mixins 三、mixins的應(yīng)用場景 四、mixins的優(yōu)勢和作用 Vue.js是一種流行的JavaScript前端框架,用于構(gòu)建交互式的Web界面。它被設(shè)計為易于理解和集成的框架,使開發(fā)者能夠快速構(gòu)建可復(fù)用的組件化應(yīng)用程序。Vue.js采用了MVVM(Model-View-ViewModel)架構(gòu)模式,通

    2024年01月23日
    瀏覽(33)
  • Vue 2 混入

    混入(Mixins)是一種在Vue組件中重用代碼的方式。它允許你定義一些可復(fù)用的選項對象,然后將這些選項合并到不同的組件中。混入可以用于在多個組件之間共享邏輯、方法、生命周期鉤子等。 示例: 選項合并 當組件和混入對象的選項同名時,數(shù)據(jù)對象data中同名選項以組件

    2024年02月12日
    瀏覽(18)
  • JavaScript - 判斷當前時間是否在指定區(qū)間內(nèi),例如:9:00~12:00(檢查當前時間是否處于規(guī)定的兩個時間段范圍內(nèi)),適用于 vue.js / uniapp / 微信小程序等前端項目

    例如,您想知道當前時間是否處于 9:00 ~ 12:00 時間區(qū)間內(nèi),然后根據(jù)這個判斷進而實現(xiàn)業(yè)務(wù)邏輯。 如下示例所示, 本文提供一個函數(shù),您只需要傳入 2 個時間區(qū)間,便可得出當前時間是否在該時間區(qū)間范圍內(nèi): 您可以一鍵復(fù)制,直接粘貼到您的項目中。 您只需要傳入開始時

    2024年02月16日
    瀏覽(50)
  • Vue中mixins的使用

    Vue中mixins的使用方法和注意點 - 掘金 ?

    2024年02月13日
    瀏覽(19)
  • 前端隨筆:HTML/CSS/JavaScript和Vue

    前端隨筆:HTML/CSS/JavaScript和Vue

    最近因為工作需要,需要接觸一些前端的東西。之前雖然大體上了解過 HTML 、 CSS 和 JavaScript ,也知道 HTML 定義了內(nèi)容、 CSS 定義了樣式、 JavaScript 定義了行為,但是卻沒有詳細的學習過前端三件套的細節(jié)。而最近的工作中需要使用 Vue ,并且想到未來的工作中使用 Vue 能夠更

    2024年02月16日
    瀏覽(26)
  • JavaScript 框架比較:Angular、React、Vue.js

    在 Web 開發(fā)領(lǐng)域,JavaScript 提供大量技術(shù)棧可供選擇。其中最典型的三套組合,分別是 MERN、MEAN 和 MEVN。這些首字母相同的選項各自代表不同的技術(shù)加工具組合。為了在這些技術(shù)棧中做出明智選擇,讓我們先從核心組件聊起,再對各自前端框架(React、Angular 和 Vue)進行簡化比

    2024年01月20日
    瀏覽(36)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包