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

首頁 > 編程 > JavaScript > 正文

如何在微信小程序中實現Mixins方案

2019-11-19 11:18:31
字體:
來源:轉載
供稿:網友

前言

在原生開發小程序的過程中,發現有多個頁面都使用了幾乎完全一樣的邏輯。由于小程序官方并沒有提供 Mixins 這種代碼復用機制,所以只能采用非常不優雅的復制粘貼的方式去“復用”代碼。隨著功能越來越復雜,靠復制粘貼來維護代碼顯然不科學,于是便尋思著如何在小程序里面實現 Mixins。

什么是 Mixins

Mixins 直譯過來是“混入”的意思,顧名思義就是把可復用的代碼混入當前的代碼里面。熟悉 VueJS 的同學應該清楚,它提供了更強大了代碼復用能力,解耦了重復的模塊,讓系統維護更加方便優雅。

先看看在 VueJS 中是怎么使用 Mixins 的。

// define a mixin objectvar myMixin = { created: function () { this.hello() }, methods: { hello: function () {  console.log('hello from mixin!') } }}// define a component that uses this mixinvar Component = Vue.extend({ mixins: [myMixin]})var component = new Component() // => "hello from mixin!"

在上述的代碼中,首先定義了一個名為 myMixin 的對象,里面定義了一些生命周期函數和方法。接著在一個新建的組件里面直接通過 mixins: [myMixin] 的方式注入,此時新建的組件便獲得了來自 myMixin 的方法了。

明白了什么是 Mixins 以后,便可開始著手在小程序里面實現了。

Mixins 的機制

Mixins 也有一些小小的細節需要注意的,就是關于生命周期事件的執行順序。在上一節的例子中,我們在 myMixin 里定義了一個 created() 方法,這是 VueJS 里面的一個生命周期事件。如果我們在新建組件 Component 里面也定義一個 created() 方法,那么執行結果會是如何呢?

var Component = Vue.extend({ mixins: [myMixin], created: function () { console.log('hello from Component!') }})var component = new Component()// =>// Hello from mixin!// Hello from Component!

可以看運行結果是先輸出了來自 Mixin 的 log,再輸出來自組件的 log。

除了生命周期函數以外,再看看對象屬性的混入結果:

// define a mixin objectconst myMixin = { data () { return {  mixinData: 'data from mixin' } }}// define a component that uses this mixinvar Component = Vue.extend({ mixins: [myMixin], data () { return {  componentData: 'data from component' } }, mounted () { console.log(this.$data) }})var component = new Component()


在 VueJS 中,會把來自 Mixins 和組件的對象屬性當中的內容(如 data, methods等)混合,以確保兩邊的數據都同時存在。

經過上述的驗證,我們可以得到 VueJS 中關于 Mixins 運行機制的結論:

  • 生命周期屬性,會優先執行來自 Mixins 當中的,后執行來自組件當中的。
  • 對象類型屬性,來自 Mixins 和來自組件中的會共存。

但是在小程序中,這套機制會和 VueJS 的有一點區別。在小程序中,自定義的方法是直接定義在 Page 的屬性當中的,既不屬于生命周期類型屬性,也不屬于對象類型屬性。為了不引入奇怪的問題,我們為小程序的 Mixins 運行機制多加一條:

  • 小程序中的自定義方法,優先級為 Page > Mixins,即 Page 中的自定義方法會覆蓋 Mixins 當中的。

代碼實現

在小程序中,每個頁面都由 Page(options) 函數定義,而 Mixins 則作用于這個函數當中的 options 對象。因此我們實現 Mixins 的思路就有了――劫持并改寫 Page 函數,最后再重新把它釋放出來。

新建一個 mixins.js 文件:

// 保存原生的 Page 函數const originPage = PagePage = (options) => { const mixins = options.mixins // mixins 必須為數組 if (Array.isArray(mixins)) { delete options.mixins // mixins 注入并執行相應邏輯 merge(mixins, options) } // 釋放原生 Page 函數 originPage(options)}

原理很簡單,關鍵的地方在于 merge() 函數。merge 函數即為小程序 Mixins 運行機制的具體實現,完全按照上一節總結的三條結論來進行。

// 定義小程序內置的屬性/方法const originProperties = ['data', 'properties', 'options']const originMethods = ['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload', 'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage', 'onPageScroll', 'onTabItemTap']function merge (mixins, options) { mixins.forEach((mixin) => { if (Object.prototype.toString.call(mixin) !== '[object Object]') {  throw new Error('mixin 類型必須為對象!') } // 遍歷 mixin 里面的所有屬性 for (let [key, value] of Object.entries(mixin)) {  if (originProperties.includes(key)) {  // 內置對象屬性混入  options[key] = { ...value, ...options[key] }  } else if (originMethods.includes(key)) {  // 內置方法屬性混入,優先執行混入的部分  const originFunc = options[key]  options[key] = function (...args) {   value.call(this, ...args)   return originFunc && originFunc.call(this, ...args)  }  } else {  // 自定義方法混入  options = { ...mixin, ...options }  } } })}

Mixins 使用

在小程序的 app.js 里引入 mixins.js

require('./mixins.js')

撰寫一個 myMixin.js

module.exports = { data: { someData: 'myMixin' }, onShow () { console.log('Log from mixin!') }}

在 page/index/index.js 中使用

Page({ mixins: [require('../../myMixin.js')]})

大功告成!此時小程序已經具備 Mixins 的能力,對于代碼解耦與復用來說將會更加方便。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成人99网站| 91精品久久久久久久久久| 亚洲美女中文字幕| 奇米影视亚洲狠狠色| 国产精品高潮呻吟久久av黑人| 久久国内精品一国内精品| xxx一区二区| 亚洲免费伊人电影在线观看av| 久久久综合av| 精品久久久久久久久国产字幕| 久久国产精品网站| 久久久久久尹人网香蕉| 国产欧美精品久久久| 欧美在线视频免费播放| 4444欧美成人kkkk| 97视频免费在线看| 日韩美女在线观看一区| 国产精品精品视频一区二区三区| 久久精品欧美视频| 91牛牛免费视频| 欧美高清理论片| 国产精品久久久久高潮| 亚洲成人久久久| 日本精品视频在线播放| 日韩精品在线视频美女| 国产精品劲爆视频| 亚洲四色影视在线观看| 欧美激情亚洲国产| 国产精品美女久久久久av超清| 日韩一区二区福利| 日韩美女在线播放| 亚洲有声小说3d| 久久久精品一区二区三区| 成人久久精品视频| 久久久精品网站| 欧美激情国内偷拍| 国产a级全部精品| 亚洲xxx自由成熟| 国产视频精品va久久久久久| 国产成人精品免费久久久久| 亚洲午夜精品久久久久久性色| 日本在线观看天堂男亚洲| 欧美成人精品影院| 在线国产精品播放| 性欧美xxxx交| 欧美日韩国产999| 亚洲欧美色婷婷| 成人国产精品久久久久久亚洲| 中文字幕亚洲自拍| 日本亚洲精品在线观看| 欧美一级视频一区二区| 国产91在线播放九色快色| 午夜精品久久久久久久99黑人| 欧美日韩免费网站| 奇米4444一区二区三区| 欧美巨大黑人极品精男| 国内外成人免费激情在线视频网站| 国产欧美一区二区三区久久| 国产在线精品一区免费香蕉| 日本在线观看天堂男亚洲| 国产精品亚洲综合天堂夜夜| 精品久久在线播放| 97av在线视频免费播放| 欧美日韩中文在线| 成人福利在线观看| 成人在线视频网站| 精品中文字幕视频| 国产精品看片资源| 91精品国产色综合久久不卡98| 久久影院中文字幕| 久久国产精品久久久久| 亚洲香蕉在线观看| 最新国产成人av网站网址麻豆| 亚洲第一精品电影| 中文字幕亚洲欧美日韩在线不卡| 亚洲性av在线| 91天堂在线观看| 国产精品福利无圣光在线一区| 精品亚洲国产视频| 91免费国产网站| 欧美特级www| 亚洲欧洲国产精品| 日韩成人在线视频| 久久精品人人做人人爽| 国内精品小视频在线观看| 国产欧美在线视频| 国内精品免费午夜毛片| 亚洲曰本av电影| 91天堂在线视频| 中文字幕亚洲情99在线| 亚洲欧美一区二区三区久久| 欧美国产亚洲视频| 久久91亚洲人成电影网站| 亚洲欧美国产制服动漫| 日韩影视在线观看| 国产精品一区二区三区毛片淫片| 日韩欧美国产成人| 欧美性猛交xxx| 在线视频中文亚洲| 欧美电影在线免费观看网站| 在线日韩第一页| 精品久久久国产精品999| 欧美亚洲激情视频| 亚洲一区二区三区777| 精品久久久久久久久久ntr影视| 播播国产欧美激情| 一区二区三区回区在观看免费视频| 日韩视频中文字幕| 国产精品一区二区三区免费视频| 一区二区三区回区在观看免费视频| 日韩激情视频在线播放| 日本老师69xxx| 国产精品美女久久久久av超清| 欧美黑人巨大xxx极品| 亚洲精品v天堂中文字幕| 成人欧美一区二区三区黑人孕妇| 久久亚洲精品成人| 91免费精品视频| 中文字幕亚洲一区| 欧美高跟鞋交xxxxhd| 精品欧美激情精品一区| 欧美高清视频在线播放| 91久久精品国产91久久性色| 久久久久久久香蕉网| 亚洲黄页网在线观看| 日韩最新在线视频| 日韩精品一区二区三区第95| 最新亚洲国产精品| 91久久国产婷婷一区二区| 国产精品第一区| 成人福利视频在线观看| 97国产精品人人爽人人做| 色伦专区97中文字幕| 日韩中文字幕亚洲| 欧美久久精品一级黑人c片| 国产精品a久久久久久| 性色av一区二区咪爱| 日韩专区中文字幕| 精品国产999| 热久久免费视频精品| 亚洲国产精品女人久久久| 日韩欧美国产网站| 久久精品中文字幕| 国产日韩欧美一二三区| 精品久久久一区| 性色av一区二区三区| 热久久视久久精品18亚洲精品| 国产精品久久久| 亚洲国产另类久久精品| 亚洲人成电影网站色www| 国产一区欧美二区三区| 国产免费一区二区三区香蕉精| 日韩不卡在线观看| 成人网欧美在线视频| 深夜福利91大全| 国产精品视频1区| 日本道色综合久久影院| 91精品国产自产在线老师啪| 性色av一区二区咪爱| 国产亚洲激情视频在线| 国产精品老女人精品视频| 91精品国产乱码久久久久久蜜臀| 国产精品入口免费视频一| 亚洲а∨天堂久久精品喷水|