小程序全局mixin方法 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 小程序相关 >

小程序全局mixin方法

发表时间:2021-1-4

发布人:葵宇科技

浏览次数:129

需求

最近接到一个需求,希望我这边可以后台配置微信小程序的导航栏颜色,但是目前小程序还不支持全局修改导航栏的颜色,只支持修改单个页面的导航栏颜色,所以我就想着能不能在所有的页面的onload函数中手动设置一下导航栏的颜色,但是这样一来就需要改每个页面,效率太低。我查了微信小程序的文档也没有提供全局混入onload的方法,所以想着能否实现一下小程序的混入功能。

问题

在vue当中我们可以使用mixin来混入全局的配置,方便我们进行业务开发。但是微信小程序并未提供类似的mixin功能,使得在某些全局修改的业务场景下,增加了我们的任务量。下面介绍一种可以小程序中使用的全局mixin方案。

原理

原理也很简单,通过修改Page函数来实现全局的mixin。因为微信小程序中创建页面是使用Page构造函数来创建的,如下:

Page({
  data: {
    text: "This is page data."
  },
  onLoad: function(options) {
    // Do some initialize when page load.
  },
  onShow: function() {
    // Do something when page show.
  },
  onReady: function() {
    // Do something when page ready.
  }
  //省略部分代码 ... ...
})
复制代码

那么我们可以将Page改为我们自定义的对象,通过下面的混入的方式,实现在不同的钩子函数中mixin我们的全局的配置。例如:我们想要在所有页面的onload事件中执行代码console.log('小程序全局mixin'),以下为参考代码

目录结构

page.js 文件
const page = Page;
import app from '../../app.js';

module.exports = (options = {}) => {
  const { onLoad, onShow, onReady, data } = options; // 解构传入的page数据
  const mountOptions = {
    data: {
      ...data
    },
    onLoad(...res) {
      // 在这里添加 onLoad 前mixin的代码 
      console.log('小程序全局mixin');
      
      const opts = res[0];
      const $opts = {};
      this.$opts = $opts;
      if (onLoad) {
        onLoad.apply(this, res);
      }

      // 在这里添加 onLoad 后mixin的代码 
    },
    onShow() {
      // onShow before
      if (onShow) {
        onShow.apply(this);
      }
      // onShow after
    },
    onReady() {
      if (onReady) {
        onReady.apply(this);
      }
    },
  };

  return page(Object.assign({}, options, mountOptions)); // 调用原生的Page构造函数
};

复制代码

编写统一的全局配置挂载函数

index.js 文件
const page = require('./page.js');

module.exports = {
  mount() {
    Page = page;
  },
};

复制代码

执行挂载函数,注意必须要在App()之前调用

app.js
//省略部分代码

require('./mixins/global/index.js').mount(); // 就是上面的index.js文件位置

App({

    //省略部分代码

})

复制代码

结果

同样的道理我们还可以添加组件全局Mixin的功能,同样也是要改写Component函数,这里只给一个思路,目前项目中还没有这样的业务场景

总结

微信小程序中App、Page和Component都是全局的对象,就像是浏览器环境中的window对象,我们可以对其进行扩展来满足业务的开发需求,但是要谨慎考虑清楚再改,不然会为日后的开发留下隐患

相关案例查看更多