亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入淺析Vue中mixin和extend的區別和使用場景

2019-11-19 11:05:36
字體:
來源:轉載
供稿:網友

Vue中有兩個較為高級的靜態方法mixin和extend,接下來我們來討論下關于他們各自的原理和使用場景。

Mixin:

原理:

先來看看官網的介紹:

參數:{Object} mixin

用法:

混入也可以進行全局注冊。使用時格外小心!一旦使用全局混入,它將影響每一個之后創建的 Vue 實例。使用恰當時,這可以用來為自定義選項注入處理邏輯。

// 為自定義的選項 'myOption' 注入一個處理器。   Vue.mixin({    created: function () {     var myOption = this.$options.myOption     if (myOption) {      console.log(myOption)     }    }   })      new Vue({    myOption: 'hello!'   })   // => "hello!"

我們知道,Vue.mixin傳遞的這個參數對象,在初始化Vue實例的時候會merge到options上,下面是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  } }// src/core/instance/index.js function Vue (options) {   if (process.env.NODE_ENV !== 'production' &&   !(this instanceof Vue)   ) {   warn('Vue is a constructor and should be called with the `new` keyword')   }   this._init(options) }  initMixin(Vue) ...  export default Vue

也就是說,mixin只是對我們在初始化Vue實例時傳遞的配置對象的一個擴展。

就像上面官網實例寫的例子,我們在執行Vue.mixin方法時傳遞一個配置對象進去,對象里面有個created勾子函數,通過源碼我們可以看到這個傳遞進來的對象最終會和我們在初始化實例也就是new Vue(options)時的這個options合并(通過上面源碼中的mergeOptions方法),保存在option上。

使用場景:

當我們需要全局去注入一些methods,filter或者hooks時我們就可以使用mixin來做。 比如我們希望每一個Vue實例都有一個print方法,我們就可以這么做:

Vue.mixin({    methods: {      print() {        console.log(`我是一個通過mixin注入的方法!`)      }    }  })

或者我們想要去監聽在什么階段時什么組件被加載了,被卸載了等等,我們可以這么做:

Vue.mixin({    mounted() {      console.log(`${this.$route.name} component mounted!`)    },    destroyed() {      console.log(`${this.$route.name} component destroyed!`)    }  })

如果我們并不想給每一個組件實例都混入這些配置options,而只是個別的組件,最好不要使用mixin,它可能會影響到我們組件的性能。

Extend:

原理:

先來看看官網的介紹:

參數:{Object} options

用法:

使用基礎 Vue 構造器,創建一個“子類”。參數是一個包含組件選項的對象。

data 選項是特例,需要注意 - 在 Vue.extend() 中它必須是函數。

data必須是函數是為了防止各個實例的數據混亂,閉包的應用。

<div id="mount-point"></div>// 創建構造器var Profile = Vue.extend({ template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data: function () {  return {   firstName: 'Walter',   lastName: 'White',   alias: 'Heisenberg'  } }})// 創建 Profile 實例,并掛載到一個元素上。new Profile().$mount('#mount-point')

再來看看源碼里面關于Vue.extend的實現:

Vue.extend = function (extendOptions: Object): Function {  extendOptions = extendOptions || {}  const Super = this  const SuperId = Super.cid  const cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {})  if (cachedCtors[SuperId]) {   return cachedCtors[SuperId]  }  const name = extendOptions.name || Super.options.name  if (process.env.NODE_ENV !== 'production' && name) {   validateComponentName(name)  }  const Sub = function VueComponent (options) {   this._init(options)  }  Sub.prototype = Object.create(Super.prototype)  Sub.prototype.constructor = Sub  Sub.cid = cid++  Sub.options = mergeOptions(   Super.options,   extendOptions  )  Sub['super'] = Super  // For props and computed properties, we define the proxy getters on  // the Vue instances at extension time, on the extended prototype. This  // avoids Object.defineProperty calls for each instance created.  if (Sub.options.props) {   initProps(Sub)  }  if (Sub.options.computed) {   initComputed(Sub)  }  // allow further extension/mixin/plugin usage  Sub.extend = Super.extend  Sub.mixin = Super.mixin  Sub.use = Super.use  // create asset registers, so extended classes  // can have their private assets too.  ASSET_TYPES.forEach(function (type) {   Sub[type] = Super[type]  })  // enable recursive self-lookup  if (name) {   Sub.options.components[name] = Sub  }  // keep a reference to the super options at extension time.  // later at instantiation we can check if Super's options have  // been updated.  Sub.superOptions = Super.options  Sub.extendOptions = extendOptions  Sub.sealedOptions = extend({}, Sub.options)  // cache constructor  cachedCtors[SuperId] = Sub  return Sub }}

首先我們可以看到,extend方法返回的Sub其實是一個構造函數,而且繼承自Vue,也就是說extend方法返回的是Vue的一個子類。

Sub.prototype = Object.create(Super.prototype)  Sub.prototype.constructor = Sub

這兩行代碼其實就是實現Sub對Vue的繼承,源碼中有一行是

const Super = this

所以這里的Super指的就是Vue。

Sub.options = mergeOptions(   Super.options,   extendOptions)

我們注意到在extend中也會對傳進來的配置option和Vue原來的options做一個合并。

使用場景:

當我們不需要全局去混入一些配置,比如,我們想要獲得一個component。我們可以使用Vue.component(),也可以使用Vue.extend()。

const ChildVue = Vue.extend({  ...options})new ChildVue({  ...options})

注意extend得到的是一個Vue的子類,也就是構造函數。

區別:

mixin是對Vue類的options進行混入。所有Vue的實例對象都會具備混入進來的配置行為。

extend是產生一個繼承自Vue類的子類,只會影響這個子類的實例對象,不會對Vue類本身以及Vue類的實例對象產生影響。

總結

以上所述是小編給大家介紹的Vue中mixin和extend的區別和使用場景,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区二区大胆人体摄影专业网站| 欧美激情一区二区三级高清视频| 久久久久久久亚洲精品| 精品夜色国产国偷在线| 日韩中文有码在线视频| 久久偷看各类女兵18女厕嘘嘘| 日韩电影中文字幕av| 91精品免费久久久久久久久| 亚洲美女自拍视频| 色婷婷综合成人av| 国自产精品手机在线观看视频| 亚洲国产精品悠悠久久琪琪| 最新69国产成人精品视频免费| 日韩国产高清视频在线| 欧美亚洲成人免费| 亚洲欧美精品在线| 国产999精品视频| 亚洲电影免费在线观看| 国产精品免费久久久| 精品五月天久久| 日韩av在线看| 91九色在线视频| 日韩av黄色在线观看| 欧美性jizz18性欧美| 成人福利在线视频| 精品视频在线观看日韩| 国产91成人在在线播放| 最近2019中文字幕mv免费看| 992tv在线成人免费观看| 97碰碰碰免费色视频| 成人免费激情视频| 国产剧情日韩欧美| 亚洲欧美制服中文字幕| 91成人天堂久久成人| 国产一区二区三区视频免费| 国产日本欧美一区| 久久精品国产一区二区电影| 欧美日韩精品在线播放| 国产精品免费久久久久久| 91中文在线视频| 在线精品国产成人综合| 亚洲欧洲在线观看| 人妖精品videosex性欧美| 精品国产欧美一区二区三区成人| 91网站免费看| 最近2019年日本中文免费字幕| 免费99精品国产自在在线| 精品人伦一区二区三区蜜桃免费| 成人中文字幕在线观看| 欧美激情视频一区二区| 日本精品视频在线观看| 亚洲高清一区二| 久久久午夜视频| 日本久久久久久久久久久| 亚洲国产精品yw在线观看| 日韩精品免费看| 久久久久久久久久久人体| 久久视频在线观看免费| 亚洲日本aⅴ片在线观看香蕉| 成人写真视频福利网| 国产精品旅馆在线| 日韩美女视频中文字幕| 亲爱的老师9免费观看全集电视剧| 亚洲一区二区免费| 神马久久久久久| 欧美视频在线视频| 欧美丰满老妇厨房牲生活| 欧美午夜性色大片在线观看| 日本亚洲欧洲色α| 久99久在线视频| 亚洲视频一区二区三区| 91精品国产自产在线老师啪| 97在线观看视频| 日韩天堂在线视频| 国产成人涩涩涩视频在线观看| www.xxxx精品| 成人黄色短视频在线观看| 日韩av片电影专区| 国产精品香蕉av| 亚洲日本成人女熟在线观看| 欧美精品激情在线| 国产一区二区丝袜高跟鞋图片| 一本一本久久a久久精品牛牛影视| 欧美激情亚洲另类| 亚洲美女性视频| 欧美色图在线视频| 国产不卡视频在线| 91在线观看免费高清| 久久99久久久久久久噜噜| 久久亚洲精品一区二区| 日本a级片电影一区二区| 国产有码一区二区| 国内精品久久久久影院 日本资源| 91精品久久久久久久久久| 欧美日韩裸体免费视频| 91成品人片a无限观看| 亚洲欧洲国产一区| 国产精品三级久久久久久电影| 91美女片黄在线观| 亚洲最大的成人网| 国产亚洲精品久久| 色一区av在线| 欧美电影在线观看| 亚洲综合在线做性| 色狠狠av一区二区三区香蕉蜜桃| 国产成人精品电影久久久| 最近2019免费中文字幕视频三| 久久99精品久久久久久青青91| 亚洲色图17p| 久久在线免费观看视频| 欧美激情免费看| 91爱爱小视频k| 亚洲最新av在线网站| 欧美成人激情视频| 成人av色在线观看| 欧美国产精品日韩| 欧美日韩亚洲91| 久久久精品中文字幕| 精品综合久久久久久97| 欧美一级淫片aaaaaaa视频| 久久6免费高清热精品| 日韩精品福利在线| 午夜精品久久久久久久99热浪潮| 中文字幕日韩av综合精品| 日韩网站免费观看高清| 黄色一区二区三区| 中文字幕久久精品| 欧美情侣性视频| 美女999久久久精品视频| 91国内揄拍国内精品对白| 国产精品91在线| 国产一区二区三区日韩欧美| 91在线中文字幕| 亚洲日韩中文字幕| 国产精品爽爽ⅴa在线观看| 亚洲韩国日本中文字幕| 91亚洲午夜在线| 欧美成人性色生活仑片| 久久久精品免费| 波霸ol色综合久久| 成人在线播放av| 欧美激情视频一区| 久久视频中文字幕| 欧美精品在线播放| 亚洲精品自在久久| 亚洲欧美中文日韩v在线观看| 欧美亚洲激情视频| 伊人精品在线观看| 亚洲精品mp4| 亚洲精品免费一区二区三区| 成人精品久久av网站| 日韩在线观看av| 中文字幕精品视频| 成人国产在线激情| 在线中文字幕日韩| 欧美洲成人男女午夜视频| 久久久在线免费观看| 欧美日韩另类字幕中文| 亚洲福利视频在线| 38少妇精品导航| 欧美xxxx做受欧美| 亚洲国产精品人久久电影| 亚洲精品成人久久久| 狠狠躁天天躁日日躁欧美|