摘要:明白了什么是以后,便可開始著手在小程序里面實現(xiàn)了。但是在小程序中,這套機(jī)制會和的有一點區(qū)別。代碼實現(xiàn)在小程序中,每個頁面都由函數(shù)定義,而則作用于這個函數(shù)當(dāng)中的對象。函數(shù)即為小程序運行機(jī)制的具體實現(xiàn),完全按照上一節(jié)總結(jié)的三條結(jié)論來進(jìn)行。
原文來自我的博客:https://jrainlau.github.io/#/...
在原生開發(fā)小程序的過程中,發(fā)現(xiàn)有多個頁面都使用了幾乎完全一樣的邏輯。由于小程序官方并沒有提供 Mixins 這種代碼復(fù)用機(jī)制,所以只能采用非常不優(yōu)雅的復(fù)制粘貼的方式去“復(fù)用”代碼。隨著功能越來越復(fù)雜,靠復(fù)制粘貼來維護(hù)代碼顯然不科學(xué),于是便尋思著如何在小程序里面實現(xiàn) Mixins。
什么是 MixinsMixins 直譯過來是“混入”的意思,顧名思義就是把可復(fù)用的代碼混入當(dāng)前的代碼里面。熟悉 VueJS 的同學(xué)應(yīng)該清楚,它提供了更強(qiáng)大了代碼復(fù)用能力,解耦了重復(fù)的模塊,讓系統(tǒng)維護(hù)更加方便優(yōu)雅。
先看看在 VueJS 中是怎么使用 Mixins 的。
// define a mixin object var myMixin = { created: function () { this.hello() }, methods: { hello: function () { console.log("hello from mixin!") } } } // define a component that uses this mixin var Component = Vue.extend({ mixins: [myMixin] }) var component = new Component() // => "hello from mixin!"
在上述的代碼中,首先定義了一個名為 myMixin 的對象,里面定義了一些生命周期函數(shù)和方法。接著在一個新建的組件里面直接通過 mixins: [myMixin] 的方式注入,此時新建的組件便獲得了來自 myMixin 的方法了。
明白了什么是 Mixins 以后,便可開始著手在小程序里面實現(xiàn)了。
Mixins 的機(jī)制Mixins 也有一些小小的細(xì)節(jié)需要注意的,就是關(guān)于生命周期事件的執(zhí)行順序。在上一節(jié)的例子中,我們在 myMixin 里定義了一個 created() 方法,這是 VueJS 里面的一個生命周期事件。如果我們在新建組件 Component 里面也定義一個 created() 方法,那么執(zhí)行結(jié)果會是如何呢?
var Component = Vue.extend({ mixins: [myMixin], created: function () { console.log("hello from Component!") } }) var component = new Component() // => // Hello from mixin! // Hello from Component!
可以看運行結(jié)果是先輸出了來自 Mixin 的 log,再輸出來自組件的 log。
除了生命周期函數(shù)以外,再看看對象屬性的混入結(jié)果:
// define a mixin object const myMixin = { data () { return { mixinData: "data from mixin" } } } // define a component that uses this mixin var Component = Vue.extend({ mixins: [myMixin], data () { return { componentData: "data from component" } }, mounted () { console.log(this.$data) } }) var component = new Component()
在 VueJS 中,會把來自 Mixins 和組件的對象屬性當(dāng)中的內(nèi)容(如 data, methods等)混合,以確保兩邊的數(shù)據(jù)都同時存在。
經(jīng)過上述的驗證,我們可以得到 VueJS 中關(guān)于 Mixins 運行機(jī)制的結(jié)論:
生命周期屬性,會優(yōu)先執(zhí)行來自 Mixins 當(dāng)中的,后執(zhí)行來自組件當(dāng)中的。
對象類型屬性,來自 Mixins 和來自組件中的會共存。
但是在小程序中,這套機(jī)制會和 VueJS 的有一點區(qū)別。在小程序中,自定義的方法是直接定義在 Page 的屬性當(dāng)中的,既不屬于生命周期類型屬性,也不屬于對象類型屬性。為了不引入奇怪的問題,我們?yōu)樾〕绦虻?Mixins 運行機(jī)制多加一條:
小程序中的自定義方法,優(yōu)先級為 Page > Mixins,即 Page 中的自定義方法會覆蓋 Mixins 當(dāng)中的。
代碼實現(xiàn)在小程序中,每個頁面都由 Page(options) 函數(shù)定義,而 Mixins 則作用于這個函數(shù)當(dāng)中的 options 對象。因此我們實現(xiàn) Mixins 的思路就有了——劫持并改寫 Page 函數(shù),最后再重新把它釋放出來。
新建一個 mixins.js 文件:
// 保存原生的 Page 函數(shù) const originPage = Page Page = (options) => { const mixins = options.mixins // mixins 必須為數(shù)組 if (Array.isArray(mixins)) { delete options.mixins // mixins 注入并執(zhí)行相應(yīng)邏輯 options = merge(mixins, options) } // 釋放原生 Page 函數(shù) originPage(options) }
原理很簡單,關(guān)鍵的地方在于 merge() 函數(shù)。merge 函數(shù)即為小程序 Mixins 運行機(jī)制的具體實現(xiàn),完全按照上一節(jié)總結(jié)的三條結(jié)論來進(jìn)行。
// 定義小程序內(nèi)置的屬性/方法 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)) { // 內(nèi)置對象屬性混入 options[key] = { ...value, ...options[key] } } else if (originMethods.includes(key)) { // 內(nèi)置方法屬性混入,優(yōu)先執(zhí)行混入的部分 const originFunc = options[key] options[key] = function (...args) { value.call(this, ...args) return originFunc && originFunc.call(this, ...args) } } else { // 自定義方法混入 options = { ...mixin, ...options } } } }) return 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")] })
大功告成!此時小程序已經(jīng)具備 Mixins 的能力,對于代碼解耦與復(fù)用來說將會更加方便。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104845.html
摘要:監(jiān)聽點贊事件廣播重點在這里我的動態(tài)頁面收到點贊變化通知進(jìn)行更新操作監(jiān)聽發(fā)布事件廣播重點在這里我的動態(tài)頁面收到發(fā)布動態(tài)通知進(jìn)行更新操作重點在這里至此,我們在小程序中完美的實現(xiàn)了跨頁面組件多頁面數(shù)據(jù)同步。 導(dǎo)語:本文主要介紹在小程序中,多頁面之間如何保持?jǐn)?shù)據(jù)同步 在很多的產(chǎn)品中,都會存在跨頁面間需要數(shù)據(jù)同步,如下示例: showImg(https://user-gold-cdn.xitu.io...
摘要:傳統(tǒng)的網(wǎng)頁編程采用的三劍客來實現(xiàn),在微信小程序中同樣有三劍客。觀察者模式不難實現(xiàn),重點是如何在微信小程序中搭配其特有的生命周期來使用。交互事件傳統(tǒng)的事件傳遞類型有冒泡型與捕獲型,微信小程序中自然也有。 本文由作者鄒永勝授權(quán)網(wǎng)易云社區(qū)發(fā)布。 簡介為了更好的展示我們即時通訊SDK強(qiáng)悍的能力,網(wǎng)易云信IM SDK微信小程序DEMO的開發(fā)就提上了日程。用產(chǎn)品的話說就是: 云信 IM 小程序 S...
其實我們本篇文章主要講述的就是需要將采集的數(shù)據(jù)積累下來,變成企業(yè)的數(shù)字資產(chǎn)。 積累數(shù)據(jù)最好的方式就是把數(shù)據(jù)存入數(shù)據(jù)庫,低碼工具除了有可視化編程的便利外,不僅如此還有提供了線上的文檔型數(shù)據(jù)庫。文檔數(shù)據(jù)庫相比傳統(tǒng)數(shù)據(jù)庫,文檔數(shù)據(jù)庫的返回結(jié)構(gòu)是JSON格式,直接就可以在前端進(jìn)行渲染。關(guān)系型數(shù)據(jù)庫還得通過代碼進(jìn)行轉(zhuǎn)譯。 我們現(xiàn)在還講另外一個方面是文檔數(shù)據(jù)庫的類型更豐富,有附件、富文本、自動編號、數(shù)...
過去十年中,瀏覽器已經(jīng)發(fā)展成為一個強(qiáng)大的工具。這是一個緩慢的過程,伴隨著許多成長之痛。現(xiàn)在,增強(qiáng)型布局控件、3D圖形和游戲,甚至是音樂都可以在小而古老的瀏覽器中實現(xiàn)。客戶端數(shù)據(jù)存儲是一個更加令人興奮的特性。 瀏覽Web的經(jīng)典過程從一開始就沒有變過:瀏覽器請求一個URL,Web服務(wù)器返回請求的內(nèi)容,然后瀏覽器請求更多的內(nèi)容,而服務(wù)器返回更多的內(nèi)容。瀏覽器似乎很健忘,它知道的所有東西都必須從服務(wù)器獲得...
閱讀 2277·2023-04-26 02:14
閱讀 2939·2021-09-30 09:46
閱讀 2113·2021-09-24 09:48
閱讀 976·2021-09-24 09:47
閱讀 3262·2019-08-30 15:44
閱讀 1889·2019-08-30 15:44
閱讀 3292·2019-08-30 14:18
閱讀 1962·2019-08-30 12:58