微信小程序如何重写Page方法?以及重写Page方法给开发者带来的好处

  17,18年的时候,我当时主要开发小程序,那时候领导想看一下小程序的访问量,还有一些埋点的需求,于是我们的小程序就接入了阿拉丁统计。

     阿拉丁的接入方式除了配置以外,主要就一行引入代码。官方要求将以下代码写在app.js第一行代码。

     

const ald = require('./utils/ald-stat.js')

    将代码放到app.js第一行代后,神奇的事情发生了,简简单单的一行代码,就可以统计到页面的访问量,分享量。而且每次触发分享都能在Network里面看到有接口请求。我出于好奇想知道它是怎么做到的,所以就扒了一下它的源代码,发现核心代码是通过重写Page方法实现的。

   切入这篇文章的正题,如何重写Page方法?首先我们先看一下新建一个Page,编辑器生成的代码

Page({
  /**
   * 页面的初始数据
   */
  data: {
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
  }
  /**
   *  其他生命周期 省略...
   */
})

 通过以上代码我们可以发现,Page实际上是一个全局的方法,参数是一个对象,该对象有一些data和其他的生命周期。我们如果要重写Page方法,一定要在小程序初始化最早的时期重新赋值Page方法为我们自己方法,且要将原来的Page方法保存以备未来调用。

(function(){
    // 小程序原来的Page方法
    let originalPage = Page;
    // 我们自定义的Page方法
    Page = (config) => {
        // todo 在这里我们可以给配置对象进行加工
        // 将配置对象继续想下传递给小程序原来的Page方法
        originalPage (config);
    }
})();

  将以上代码放到app.js顶部,即可实现了对Page对象的重写。

  然而对Page对象重写有什么好处呢?我简单的列举两条

  1) 可以实现全局页面的生命周期的监控和处理(埋点、分享统计、全局分享设置)

  2) 可以实现为所有的配置对象,增加函数和属性,来实现更好的封装。结果类似调用Vue的Vue.prototype。

  3) 可以统一处理扫小程序二维码,获取小程序二维码参数的逻辑 

  再举两个实际的业务场景例子

  1)实现一个ajax方法,挂载到所有的配置对象上,所有的页面调用this.ajax即可以请求接口

  2)  拦截所有的小程序分享,如果页面有设置分享信息,就用页面的分享信息,如果没有分享信息的话,就用全局统一的分享信息;且所有的链接后面追加分享人ID

  以下是实现代码,注意:需要将代码放到app.js顶部

(function(){
  // 小程序原来的Page方法
  let originalPage = Page;
  // 我们自定义的Page方法
  Page = (config) => {
    // 页面里可以通过this.ajax调用请求接口的方法
    config.ajax = function(){
      // 写wx.request的相关代码
    }
    // 默认分享信息
    let defaultShareInfo = {
      path: appendInviteId('/pages/index/index'),
      title: '全局设置的分享标题'
    }
    // 追加邀请人Id 参数: path(页面路径)
    function appendInviteId(path){
      // 分享人Id写成静态的 实际可能要读取缓存
      let inviteId = '9998877';
      // 路径是否包含inviteId 包含就返回路径
      if(path.includes('inviteId')){
        return path;
      // 路径不包含inviteId 则追加
      } else {
        return path.includes('?') ? `${path}&inviteId=${inviteId}` : `${path}?inviteId=${inviteId}`;
      }
    }
    // 重写onShareAppMessage方法
    let originalShareMethod = config.onShareAppMessage;
    config.onShareAppMessage = function(e) {
      // 配置对象有onShareAppMessage方法
      if( originalShareMethod ){
        // 配置对象实际返回的分享信息
        let returnVal =  originalShareMethod.call(this, e)
        // 如果有返回信息
        if(returnVal) {
          // 页面的分享信息没有邀请人id 则追加
          returnVal.path  = appendInviteId(returnVal.path)
          return returnVal
        // 如果页面对象没有返回信息
        } else {
          return defaultShareInfo
        }
      // 配置对象没有onShareAppMessage方法 直接返回默认的分享信息
      } else {
        return defaultShareInfo
      }
    }
    // 将配置对象继续想下传递给小程序原来的Page方法
    originalPage (config)
  }
})();

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
微信小程序中,我们可以选择使用原生的Page来编写页面逻辑,也可以选择重写Page来自定义页面的行为和交互。 重写Page就是使用原生的Page对象,并针对特定需求进行二次封装或功能扩展。我们可以通过重写Page来实现以下几个方面的功能: 1. 页面生命周期的控制:通过重写Page,我们可以对页面的生命周期进行自定义操作,比如在onLoad中进行数据的初始化、在onShow中更新页面展示等等。这样能够更加精确地控制页面的行为和展示效果。 2. 数据和方法的封装:通过重写Page,我们可以将页面所涉及的数据和方法进行封装,以方便在页面内部和外部进行调用。这样能够使页面更加模块化,有助于提高代码的可维护性和可复用性。 3. 页面跳转和导航的控制:通过重写Page,我们可以自定义页面之间的跳转和导航行为。比如在点击某个按钮时,我们可以通过自定义的方法进行页面跳转,并在跳转之前进行一些特定的逻辑判断或处理操作。 4. 页面动画和效果的实现:通过重写Page,我们可以对页面的动画和效果进行自定义。比如在页面展示时添加一些过渡动画效果,或者在页面某个元素上实现特定的交互效果。 总之,通过重写Page,我们可以更加灵活地控制小程序页面的行为和交互,实现更加个性化的功能和展示效果。这种方式适用于那些需要对页面的某些特定逻辑进行处理或功能扩展的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

短暂又灿烂的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值