vue3.x連官網(wǎng)都不親的選項(xiàng)--Mixin

不足

官網(wǎng)原文如下:

mixin-buzu.png

簡(jiǎn)單來(lái)說(shuō)不足有二:
1、所有屬性都會(huì)合并到組件里面孽拷,所以相同命名會(huì)沖突。
2半抱、寫完就定下來(lái)了脓恕,不夠靈活
vue3 提供了 setup膜宋,來(lái)解決這些問(wèn)題。

個(gè)人見(jiàn)解炼幔,其實(shí)在vue2的時(shí)候就很少使用mixin來(lái)抽象邏輯秋茫,一般抽象邏輯都會(huì)使用一個(gè)封裝的js對(duì)象。而mixin更多的是像封裝一個(gè)“基類”那樣乃秀,提供給組件繼承肛著,暫時(shí)而言個(gè)人還是覺(jué)得類似于“基類”這樣的用法,使用mixin挺好跺讯。

基礎(chǔ)

mixin 對(duì)象可以包含任意組件選項(xiàng)枢贿。當(dāng)組件使用 mixin 對(duì)象時(shí),所有 mixin 對(duì)象的選項(xiàng)將被“混合”進(jìn)入該組件本身的選項(xiàng)刀脏。例如:

// 定義一個(gè) mixin 對(duì)象
const testMixin = {
  created() {
    this.test()
  },
  methods: {
    test() {
      console.log('from test mixin!')
    }
  }
}

export default {
  mixins: [testMixin]
}
// 當(dāng)這個(gè)組件被創(chuàng)建時(shí)局荚,會(huì)看到日志:from test mixin!

選項(xiàng)合并

當(dāng)組件和 mixin 對(duì)象含有同名選項(xiàng)時(shí),這些選項(xiàng)將以恰當(dāng)?shù)姆绞竭M(jìn)行“合并”愈污。

比如耀态,每個(gè) mixin 可以擁有自己的 data 函數(shù)。每個(gè) data 函數(shù)都會(huì)被調(diào)用暂雹,并將返回結(jié)果合并首装。該數(shù)據(jù)的 property 發(fā)生沖突時(shí),會(huì)以組件自身的數(shù)據(jù)為優(yōu)先杭跪。

// 定義一個(gè) mixin 對(duì)象
const testMixin = {
  data() {
    return {
      message: 'hello',
      foo: 'abc'
    }
  },
  methods: {
    test() {
      console.log(this.$data)
    }
  }
}

export default {
  mixins: [testMixin],
  data() {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  created() {
    this.test() // => { message: "goodbye", foo: "abc", bar: "def" }
  }
}

同名鉤子函數(shù)將合并為一個(gè)數(shù)組仙逻,因此都將被調(diào)用。另外揍魂,mixin 對(duì)象的鉤子將在組件自身鉤子之前調(diào)用桨醋。

const testMixin = {
  created() {
    console.log('mixin 對(duì)象的鉤子被調(diào)用')
  }
}

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

// => "mixin 對(duì)象的鉤子被調(diào)用"
// => "組件鉤子被調(diào)用"

值為對(duì)象的選項(xiàng)棚瘟,例如 methods现斋、components 和 directives,將被合并為同一個(gè)對(duì)象偎蘸。兩個(gè)對(duì)象鍵名沖突時(shí)庄蹋,取組件對(duì)象的鍵值對(duì)。

const testMixin = {
  methods: {
    foo() {
      console.log('foo')
    },
    conflicting() {
      console.log('from mixin')
    }
  }
}

export default {
  mixins: [testMixin],
  methods: {
    bar() {
      console.log('bar')
    },
    conflicting() {
      console.log('from self')
    }
  },
  created() {
    this.foo() // => "foo"
    this.bar() // => "bar"
    this.conflicting() // => "from self"
  }
}

注意
vue3.x Mixin 合并行為發(fā)生了變更迷雪,當(dāng)來(lái)自組件的 data() 及其 mixin 或 extends 基類被合并時(shí)限书,合并操作現(xiàn)在將被淺層次地執(zhí)行:

const testMixin = {
  methods: {
    data() {
      return {
        user: {
          name: 'Jack',
          id: 1
        }
      }
    }
  }
}

export default {
  mixins: [testMixin],
  data() {
    return {
      user: {
        id: 2
      }
    }
  },
  created() {
    console.log(this.$data)
  }
}

在 Vue 2.x 中,生成的 $data 是:

{
  "user": {
    "id": 2,
    "name": "Jack"
  }
}

在 3.0 中章咧,其結(jié)果將會(huì)是:

{
  "user": {
    "id": 2
  }
}

全局 mixin

額倦西,全局mixin還是少用吧,應(yīng)該說(shuō)別用吧赁严,這玩意真的真的覺(jué)得有點(diǎn)坑扰柠。一旦使用全局 mixin粉铐,它將影響每一個(gè)之后創(chuàng)建的組件 (例如,每個(gè)子組件)卤档。
全局mixin如下:

app.mixin({
  created() {
    console.log("form mixin!")
  }
})

光這樣一個(gè)log蝙泼,就會(huì)導(dǎo)致"form mixin!"竟然會(huì)被輸出一排。最后強(qiáng)調(diào)下劝枣,別用汤踏!

自定義選項(xiàng)合并策略

自定義選項(xiàng)在合并時(shí),默認(rèn)策略為簡(jiǎn)單地覆蓋已有值舔腾。如果想讓某個(gè)自定義選項(xiàng)以自定義邏輯進(jìn)行合并溪胶,可以在 app.config.optionMergeStrategies 中添加一個(gè)函數(shù):

const app = Vue.createApp({})

app.config.optionMergeStrategies.customOption = (toVal, fromVal) => {
  // toVal  組件數(shù)據(jù); 
  // fromVal  mixin數(shù)據(jù)
  // return mergedVal
}

實(shí)際開(kāi)發(fā)過(guò)程中合并策略也很少使用稳诚,更多的會(huì)使用一些邏輯代碼所代替载荔,這種隱式的寫法并不太好理解。

關(guān)于setup使用mixin的相關(guān)內(nèi)容后續(xù)再寫采桃,謝謝閱讀懒熙。
原創(chuàng)不易,歡迎指正普办。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末工扎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衔蹲,更是在濱河造成了極大的恐慌肢娘,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舆驶,死亡現(xiàn)場(chǎng)離奇詭異橱健,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)沙廉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門拘荡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人撬陵,你說(shuō)我怎么就攤上這事珊皿。” “怎么了巨税?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蟋定,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我草添,道長(zhǎng)驶兜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮抄淑,結(jié)果婚禮上犀盟,老公的妹妹穿的比我還像新娘。我一直安慰自己蝇狼,他們只是感情好阅畴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著迅耘,像睡著了一般贱枣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颤专,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天纽哥,我揣著相機(jī)與錄音,去河邊找鬼栖秕。 笑死春塌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的簇捍。 我是一名探鬼主播只壳,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼暑塑!你這毒婦竟也來(lái)了吼句?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤事格,失蹤者是張志新(化名)和其女友劉穎惕艳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體驹愚,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡远搪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逢捺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谁鳍。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒸甜,靈堂內(nèi)的尸體忽然破棺而出棠耕,到底是詐尸還是另有隱情,我是刑警寧澤柠新,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站辉巡,受9級(jí)特大地震影響恨憎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一憔恳、第九天 我趴在偏房一處隱蔽的房頂上張望瓤荔。 院中可真熱鬧,春花似錦钥组、人聲如沸输硝。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)点把。三九已至,卻和暖如春屿附,著一層夾襖步出監(jiān)牢的瞬間郎逃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工挺份, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褒翰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓匀泊,卻偏偏與公主長(zhǎng)得像优训,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子各聘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容