原理
重写小程序的Page
办法,合并Page
办法的默认参数中的属性、办法和生命周期等
准则
属性和办法会进行笼罩,以后页面申明的属性和办法会笼罩mixin
中的属性和办法,生命周期函数不会进行笼罩,执行程序为全局mixin
>独自mixin
>当前页生命周期函数
具体操作
- 创立一个
mixins.js
// 把原本的Page办法缓存下来const ori_page = Pageconst lifecycle = ['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload', 'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage', 'onPageScroll']let globalMixin = null // 全局混入// 全局mixin办法wx.mixin = config => { if (isType(config, 'object')) { globalMixin = config }}// 重写Page办法Page = config => { let mixins = config.mixins // 退出全局mixin,首先执行全局的 if(globalMixin) { (mixins || (mixins = [])).unshift(globalMixin) } if(isType(mixins, 'array') && mixins.length > 0) { // 删除config的mixins属性 Reflect.deleteProperty(config, 'mixins') // 把mixins中的货色,混入到config外面去 merge(mixins, config) } // 调用默认的Page办法进行初始化 ori_page(config)}function merge(mixins, config) { mixins.forEach(mixin => { if(isType(mixin, 'object')) { Object.keys(mixin).forEach(key => { if(key === 'data') { // 合并data config.data = Object.assign({},mixin[key],config[key]) }else if (lifecycle.includes(key)) { // 缓存以后页面的生命周期函数 let ori_lifecycle = config[key] config[key] = function() { // arguments对象转数组 let arg = Array.prototype.slice.call(arguments) // 执行minxin的生命周期函数 mixin[key].call(this, arg) // 执行当前页的生命周期函数 ori_lifecycle && ori_lifecycle.call(this, arg) } }else { // 合并methods config[key] = mixin[key] } }) } })}//判断类型函数function isType(target, type) { let targetType = Object.prototype.toString.call(target).slice(8, -1).toLowerCase() type = type.toLowerCase() return targetType === type}
- 引入
mixins.js
// aap.jsimport './mixins'
- 申明一个mixin
module.exports = { test: { data: { msg: 'Hello world' } }}
- 应用
import {test} from './someMixins'Page({ mixins: [test]})