微信小程序如何重写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)
}
})();
微信小程序如何重写Page方法?以及重写Page方法给开发者带来的好处的更多相关文章
- 微信小程序:封装全局的promise异步调用方法
微信小程序:封装全局的promise异步调用方法 一:封装 function POST(url, params) { let promise = new Promise(function (resol ...
- 微信小程序开发—快速掌握组件及API的方法
微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...
- 微信小程序开发—快速掌握组件及API的方法---转载
微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...
- 微信小程序学习之navigate(1)navigateTo方法与navigateBack方法对于page生命周期不同的触发影响
小程序的每个页面都有一些生命周期,每个生命周期由分别有着不同的生命周期钩子函数.而我们的业务逻辑写在这些生命周期的钩子函数中,那么弄清楚那种情形下会触发那些生命周期钩子函数就非常重要了 先上一段代码 ...
- 关于微信小程序使用watch监听数据变化的方法
众所周知,Vue中,可以使用监听属性 watch来观察和响应 Vue 实例上的数据变化,那么小程序能不能实现这一点呢? 监听器的原理,是将data中需监听的数据写在watch对象中,并给其提供一个方法 ...
- 微信小程序代码快速转化为H5代码的方法!
1.把小程序html里面的如下标签对应改成小程序的标签,即可快速转化成H5的页面! 利用ctrl+H将下面的对应标签全部替换! html: <view === <div </view ...
- 微信小程序访问豆瓣api报403错误解决方法
通过豆瓣API可以获取很多电影.书籍的数据信息,今天在调用豆瓣正在上映电影接口的时候报403错误,原因是豆瓣设置了小程序的访问权限.如下: 解决方法是使用代理,将豆瓣API地址换成 https://d ...
- 微信小程序调用快递物流查询API的实现方法
一. 创建index.wxml.index.wxss.index.js 附上代码: <view class='container'> <input class='info' plac ...
- 微信小程序弹出可填写框两种方法
方法一: html页面: < view class = "container" class = "zn-uploadimg" > < butt ...
- 微信小程序实战:app主页面保存page页面实例
先上代码. app.js //app.js App({ onLaunch: function () { // 登录 wx.login({ success: res => { if (this.g ...
随机推荐
- $\text {FWT}$学习笔记
\(\text {FWT}\) 学习笔记 正常项的\(\text {FWT}\) 在\(\text {OI}\)中,我们经常会碰到这种问题: 给出一个长度为\(n\)的序列\(a_{1,2,...,n ...
- CF613D Kingdom and its Cities(虚树+贪心)
很休闲的一个题啊 其实一看到关于\(\sum k\)的限制,就知道是个虚树的题了 首先我们把虚树建出来,然后考虑怎么计算个数呢? 我们令\(f[x]\)表示以\(x\)的子树中,剩余了多少个还没有切断 ...
- Jenkins 进阶篇 - 单元测试覆盖率
我们做项目开发,肯定免不了要写单元测试,不管是 Java 项目.Python 项目.PHP 项目,甚至是 nodejs 项目,都应该要写单元测试,本小节就来介绍单元测试的覆盖率报告输出和展示,在后面的 ...
- 手摸手教你用 yapi-to-typescript生成Yapi的TypeScript数据类型
一 背景 现代社会比较重视效率,本着这个思想宗旨,能用工具自动高效做的事情,就不要低质量的勤奋.yapi-to-typescript就是一款自动生成接口请求与响应的typescript数据类型定义的工 ...
- Arthas 进阶教程
Arthas 进阶教程 启动math-game 下载demo-arthas-spring-boot.jar,再用java -jar命令启动: wget https://github.com/hengy ...
- 内网渗透DC-2靶场通关(CTF)
为了更好的阅读体验,请在pc端打开我的个人博客 DC系列共9个靶场,本次来试玩一下DC-2,共有5个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware ...
- 如何接入 K8s 持久化存储?K8s CSI 实现机制浅析
作者 王成,腾讯云研发工程师,Kubernetes contributor,从事数据库产品容器化.资源管控等工作,关注 Kubernetes.Go.云原生领域. 概述 进入 K8s 的世界,会发现有很 ...
- centOs7.6安装 mysql-8.0.27
1.下载mysql 2.连接服务器 3.通过 rpm -qa | grep mariadb 命令查看 mariadb 的安装包 4.通过 rpm -e mariadb-libs-5.5.68-1.el ...
- 『学了就忘』Linux基础 — 4、VMware安装
目录 1.VMware介绍 2.VMware主要特点 3.VMware建议配置 4.VMware安装 1.VMware介绍 VMware是一个虚拟PC的软件,可以在现有的操作系统上虚拟出一个新的硬件环 ...
- STM32 PWM功能在关闭时GPIO电平不确定的情况
刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况.在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确 ...