微信小程序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 ...
随机推荐
- 虚拟机VMware12.0安装centos 6.5+VMware中虚拟机网络模式区分
之前的步骤一路next,有设置内存大小的根据机器的配置设置一下即可. 需要注意的地方, 下面是对于简化版进行设置的步骤 虚拟机网络模式 1.桥接模式 在桥接模式下,VMware虚拟机里的系统就像是 局 ...
- webDriver API——第15部分Expected conditions Support
class selenium.webdriver.support.expected_conditions.alert_is_present Bases: object Expect an alert ...
- 读-《c++设计新思维-泛型编程与设计模式之应用》经典记录(英文书名:《modern c++ design》)
1.以设计为目标的程序库都必须帮助使用者完毕静止的设计.以实现使用者自己的constraints,而不是实现预先定义好的constraints. 2.Anything that can be done ...
- 浅谈Volatile与多线程
标题:浅谈Volatile与多线程 2011-04-19 22:49:17 最近看的比较杂,摘了一些人的笔记!随着多核的日益普及,越来越多的程序将通过多线程并行化的方式来提升性能.然而,编写正 ...
- 04-spring-控制反转
使用myeclipse开发spring一个Demo. 第一步:新建一个web project. 第二步:安装spring开发的支持包. 安装后多了这几个东西 3,定义一个操作接口: package c ...
- JDBC数据库编程:PreparedStatement接口
使用PreparedStatement进行数据库的更新及查询操作. PreparedStatement PreparedStatement是statement子接口.属于预处理. 使用statemen ...
- HTML5&CSS3初学者指南
介绍 网络时代已经到来.现在对人们来说,每天上网冲浪已经成为一种最为常见的行为. 一个典型的网页是由文本.图像和链接组成的.除去内容上的差异,不同网站的网页也具有不同的外观和感受,以实现在网络上建立自 ...
- Latex插入项目列表符号
1. 关于 {itemize}里序号的形式 (这个在书里有介绍): latex默认生成的简单列表, 默认为一个小圆点,..... 而我们在写文章时可能想要一些不一样的列表符号, 比如 -, * 之类的 ...
- 【Android】Architecture Components最佳实践--Lifecycles
UI controllers (activities and fragments) 中代码越少越好,不应该自己去请求数据,而是用ViewModel来更新数据,并且监听LiveData来更新UI UI ...
- 【LeetCode-面试算法经典-Java实现】【101-Symmetric Tree(对称树)】
[101-Symmetric Tree(对称树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, check whether ...