微信小程序2 - 扩展Page参数
官方默认的Page初始代码为
/**
* 全局初始化界面函数,供页面调用
* PageOption = {
* needLogin:false, //是否需要登录
* loginReturnUrl: null // 登录成功后,需要跳转回的页面,可以是function ,为空则返回默认页面
*
* }
*
*/
BasePageOptionClass.initPage = function (PageOption ) {
var app = getApp();
PageOption = PageOption || {}; var actualOption = new BasePageOptionClass(PageOption.data);
actualOption.PageOption = PageOption;
var wxFunctions = {
"onLoad": 1, "onReady": 1, "onShow": 1, "onHide": 1, "onUnload": 1,
"onPullDownRefresh": 1, "onReachBottom": 1 , "onShareAppMessage": 1, "onPageScroll": 1
};
for (var key in PageOption) {
if (!wxFunctions[key]) {
const functionKey = key;
actualOption[functionKey] = actualOption.PageOption[functionKey]
}
} for (var functionKey in wxFunctions) {
const key = functionKey; // 这里要一个临时常量,否则执行的时候,functionKey永远是最后一个
if (!PageOption[key]){ //如果 参数没有,而基类有,那么保持基类不变
if (actualOption[key]) { //目前只有 onShareAppMessage 是底层封装好的
continue;
}
}
//否则重写基类方法
Object.defineProperty(actualOption, key, {
configurable: true ,
enumerable: true ,
value: function () {
var $target = this; //这里的 $target 可以认为是 BasePageOptionClass实例, 实际上,在运行时,已经转变为 Page对象
try {
//处理通知消息
if("onLoad"==key){ //当页面第一次打开的时候,注册 以 当前页 route 为 name的通知事件,通知内部做了 获取未处理消息的机制,如果有未处理的消息,那么立即执行
$target.addNotifyListener($target.getCurrentPageUrl());
} else if ("onUnload" == key) {
//页面销毁的时候,销毁所有已注册的通知
$target.removeNotifyListener();
}
// 嵌入了 前置处理程序,如果注册了 , 必须有 返回值 true | false , 如 before_onLoad , 参数和 原始方法保持一致,类 拦截器,暂时未支持栈,只支持一个
var canContinueRun = BasePageOptionClass.wrapPageLifeCircle(key, $target)
if (!canContinueRun) {
console.log("前置处理未通过,方法 " + currUrl + " " + key)
return;
}
//这里要使用 actualOption ,不能用 $target ,在页面带有 component 时 , 会冲突掉 PageOption
var func = actualOption.PageOption[key];
if (func && func!=null) {
console.log("初始化方法 " + key + " 执行 ")
func.apply($target, arguments);
}
} catch (err) {
console.log(key + "", err);
}
},
writable: false
});
}
// console.log(actualOption)
return actualOption;
} BasePageOptionClass.wrapPageLifeCircle = function (LifeCircleFuncName, PageOption={}) {
var canContinueRun = true;
var app = getApp();
// console.log(LifeCircleFuncName) if (PageOption.needLogin) { //是否需要登录
// console.log("执行前置")
if ("onLoad" == LifeCircleFuncName || "onShow" == LifeCircleFuncName) { //在onload 事件之前做 登录判断
var xgUserInfo = app.globalData.xgUserInfo;
if (!xgUserInfo) {
var loginReturnUrl = "/pages/my/index/index"
if (!PageOption.loginReturnUrl) {
loginReturnUrl = PageOption.loginReturnUrl;
} else {
if (typeof loginReturnUrl === "function") {
loginReturnUrl = (loginReturnUrl)();
} else {
loginReturnUrl = "/pages/my/index/index"
}
}
wx.reLaunch({
url: "/pages/my/register/index?returnUrl=" + loginReturnUrl
});
canContinueRun = false;
}
}
}
if (!canContinueRun) return canContinueRun; var func = "before_" + LifeCircleFuncName;
var pf = PageOption[func];
if (pf && pf!=null){ // 带有before_ 开头的对应的内置方法,作为前置判断 , 需要有返回值
var ret = pf.apply(PageOption, []);
if(ret!==undefined){
if (!ret) canContinueRun=false;
}
}
// app.util.log("进入前置", LifeCircleFuncName)
return canContinueRun;
}
BasePageOptionClass.onLoad=function(options){
//一些逻辑
//固定前置拦截器 逻辑
PageOption.onLoad(options);
}
BasePageOptionClass.onLoad 最终作为生命周期函数传递给Page对象
2. 增加 固定模式的前置拦截器
这里的处理较简单, 只是增加了单个 以 before_ 开头,以生命周期函数名为结尾的函数,作为拦截器,return true | false
BasePageOptionClass.onLoad=function(options){
//一些逻辑
//固定前置拦截器 逻辑 伪代码
if(PageOption.before_onLoad){
//这里就是拦截器逻辑
var ret = PageOption.before_onLoad(option)
if(!ret){
return;
}
}
PageOption.onLoad(options);
}
微信小程序2 - 扩展Page参数的更多相关文章
- 微信小程序:页面全局参数(注意不是小程序的全局变量globalData)
为什么要使用页面全局参数:方便使用数据. 由于总页数需要再另外的一个方法中使用,所以要把总页数变成一个页面全局参数.因为取数据使用this.xxx即可,中间不用加data,给页面全局参数赋值页方便,直 ...
- 微信小程序 navigateTo 传对象参数
当微信小程序navigateTo传入参数是个object时,请使用JSON.strtingify将object转化为字符串,代码如下: wx.navigateTo({ url: '../sendChe ...
- 微信小程序如何重写Page方法?以及重写Page方法给开发者带来的好处
17,18年的时候,我当时主要开发小程序,那时候领导想看一下小程序的访问量,还有一些埋点的需求,于是我们的小程序就接入了阿拉丁统计. 阿拉丁的接入方式除了配置以外,主要就一行引入代码.官方要求将以下代 ...
- 微信小程序笔记<四>page.js —— 页面注册
小程序的每个页面都是独立的,每个页面都必须有 page.js 和 page.wxhl 文件,page.json 和 page.wxss 文件非必要文件,注意如果创建 page.json 则至少保证有一 ...
- 微信小程序~页面注册page
一 什么是page() page(),是一个函数,用来注册一个页面, 接受一个object参数, 指定页面的初始数据,生命周期函数,事件处理函数 等等 object参数说明: (1)data (obj ...
- 微信小程序怎么获取page/index/main后面的参数
请求例子:page/index/main?id=123,如何获取123? mpvue框架在onLoad(options)函数里面获取options.id即可. 用的框架不同,onLoad的函数不同.原 ...
- 微信小程序1 - 扩展app.js
常规的开发过程中, 每个Page的逻辑中,要使用 util.js WapRequest.js, 需要在每个页面中书写 require('/utils/WapRequest'); 略繁琐 在app. ...
- 微信小程序:post请求参数放在请求体中还是拼接到URL中需要看后台是如何接收的
前端发送post请求时,请求参数可以放在请求中,代码如下: function post(url, data, callback) { wx.request({ method: 'POST', url: ...
- 微信小程序navigateBack如何带参数
wx.navigateBack({//返回 delta:1 }) 方法如下: 一. var pages = getCurrentPages(); var prevPage = pages[page ...
随机推荐
- SVN配置常见错误
1.svnserve.conf:12: Option expected 为什么会出现这个错误呢,就是因为subversion读取配置文件svnserve.conf时,无法识别有前置空格的配置文件,如 ...
- [Algorithm] Find Max Items and Max Height of a Completely Balanced Binary Tree
A balanced binary tree is something that is used very commonly in analysis of computer science algor ...
- 利用Referer请求头阻止"盗链"
转自:http://wisdomsong2007.blog.163.com/blog/static/47783725200882523820664/ 前言 有一些站点自己没有提供下载空间,但是为了吸引 ...
- 畅通project(杭电1232)
畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- 创业之前 ——Paul Graham 最新博文
原文:Paul Graham 译者:李智维 /LeanCloudproject师 2014年10月 (这篇文章是我在斯坦福大学举办的Sam Altman创业课堂上的嘉宾演讲稿.本意是写给大学生的,但当 ...
- WinKawaks如何载入游戏
1 把下载的游戏放入roms目录 2 运行Kawaks,点击载入游戏,勾选"仅存在的",点击扫描所有游戏.然后会出现所有名字正确的游戏.你下载的zip如果有中文或者名字不对,都是无 ...
- 网页图表控件Highcharts选项配置参数
Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...
- hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- OTU_Network&calc_otu
# -*- coding: utf-8 -*- # __author__ = 'JieYap' from biocluster.agent import Agent from biocluster.t ...
- windowsclient开发--怎样測量一个字符串显示的物理长度
首先须要说明的是,我所说的字符串的长度,不是string的length,也不是string的size.我指的是显示的长度.即物理长度. 缘由: 之所以要提到这个.是由于遇到了一些问题. 再使用duil ...