官方默认的Page初始代码为

var option = {
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*
*/
onLoad: function (options) {
}
 // ... 其他生命周期函数,以及自定义 方法
}
Page(option);
其中: option中的函数,在运行期,this 指向 当前Page对象
 
扩展思路: 对Page页面提供的PageOption 再次包装
编码要求:
     option不再是一个独立定义的对象,而是经过方法创建
     整个创建过程,你可以认为类似 继承 , decorator包装器 等... , 创建类名称 /util/BasePageOptionClass.js
BasePageOptionClass 类中包含了微信小程序中所定义的所有生命周期函数的定义,并带有多个自定义的扩展函数
页面调用示例
let PageOption = {}
Page(app.BasePageOptionClass.initPage(PageOption));
核心函数 initPage
 /**
* 全局初始化界面函数,供页面调用
* 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;
}
这个方法的核心完成了2件事
1. 包装 Page中的PageOption内的生命周期函数(onLoad等), 使得 onLoad函数被作为 超类 onLoad 方法中的一个过程.
结构类似
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参数的更多相关文章

  1. 微信小程序:页面全局参数(注意不是小程序的全局变量globalData)

    为什么要使用页面全局参数:方便使用数据. 由于总页数需要再另外的一个方法中使用,所以要把总页数变成一个页面全局参数.因为取数据使用this.xxx即可,中间不用加data,给页面全局参数赋值页方便,直 ...

  2. 微信小程序 navigateTo 传对象参数

    当微信小程序navigateTo传入参数是个object时,请使用JSON.strtingify将object转化为字符串,代码如下: wx.navigateTo({ url: '../sendChe ...

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

    17,18年的时候,我当时主要开发小程序,那时候领导想看一下小程序的访问量,还有一些埋点的需求,于是我们的小程序就接入了阿拉丁统计. 阿拉丁的接入方式除了配置以外,主要就一行引入代码.官方要求将以下代 ...

  4. 微信小程序笔记<四>page.js —— 页面注册

    小程序的每个页面都是独立的,每个页面都必须有 page.js 和 page.wxhl 文件,page.json 和 page.wxss 文件非必要文件,注意如果创建 page.json 则至少保证有一 ...

  5. 微信小程序~页面注册page

    一 什么是page() page(),是一个函数,用来注册一个页面, 接受一个object参数, 指定页面的初始数据,生命周期函数,事件处理函数 等等 object参数说明: (1)data (obj ...

  6. 微信小程序怎么获取page/index/main后面的参数

    请求例子:page/index/main?id=123,如何获取123? mpvue框架在onLoad(options)函数里面获取options.id即可. 用的框架不同,onLoad的函数不同.原 ...

  7. 微信小程序1 - 扩展app.js

    常规的开发过程中, 每个Page的逻辑中,要使用 util.js   WapRequest.js, 需要在每个页面中书写 require('/utils/WapRequest'); 略繁琐 在app. ...

  8. 微信小程序:post请求参数放在请求体中还是拼接到URL中需要看后台是如何接收的

    前端发送post请求时,请求参数可以放在请求中,代码如下: function post(url, data, callback) { wx.request({ method: 'POST', url: ...

  9. 微信小程序navigateBack如何带参数

    wx.navigateBack({//返回 delta:1 })   方法如下: 一. var pages = getCurrentPages(); var prevPage = pages[page ...

随机推荐

  1. 如何在asp.net mvc框架及django框架下面避免CSRF

    CSRF 跨站伪造请求 不知CSRF为何物的,可以问下G哥. 在Asp.net MVC平台下,提供了Html.AntiForgeryToken() 方法,我们只需把其放在form的标签内,在浏览器端就 ...

  2. 会声会影X10 64位整合光盘V10.1.0.14简体中文版 下载

    http://xiazai.huishenghuiying.com.cn/wm/huishenghuiyingx10_64bit_wmqm.exe

  3. 区域设置 ID (LCID) 表, 及获取方法

    区域设置 ID (LCID) 表, 及获取方法 中国的区域设置 ID 是 2052, 如果经常打开微软软件的安装目录应该经常见到.获取很简单, 有现成的 API 函数: GetThreadLocale ...

  4. Lucene Spatial构建地理空间索引

    一.Maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  5. 在Lucene或Solr中实现高亮的策略

    一:功能背景 近期要做个高亮的搜索需求,曾经也搞过.所以没啥难度.仅仅只是原来用的是Lucene,如今要换成Solr而已,在Lucene4.x的时候,散仙在曾经的文章中也分析过怎样在搜索的时候实现高亮 ...

  6. One simple WPF & C# RayTracer

    What's this 这是一个软渲染光线追踪器,基于c#和wpf技术. How to use 这份代码的唯一参考书是Ray Tracing From The Ground Up,在学习和阅读本书过程 ...

  7. windows中修改catalina.sh上传到linux执行报错This file is needed to run this program解决

    windows中修改catalina.sh上传到linux执行报错This file is needed to run this program解决 一.发现问题 由于tomcat内存溢出,在wind ...

  8. python导入模块的两种方式

    第一种 from support import * 这种方式导入后可以直接调用(有命名冲突问题)命名冲突后定义的覆盖前定义的 如果在函数导入前定义 则导入函数覆盖 否则相反 if __name__ = ...

  9. 【ASP.NET MVC系列】详解View

    本篇文章内容属于ASP.NET MVC系列视图篇,主要讲解View,大致内容如下: 1.Views文件夹讲解 2.View种类 3.Razor语法 4.对视图的基本操作 一   Views文件夹 (一 ...

  10. 悟道—位IT高管20年的职场心经(读书笔记一)

    悟道--一位IT高管20年的职场心经 第一章  修炼! 修炼! 别跟我谈事业,先把工作做好. 别跟我说理想,先把饭碗端好: 志不可天天立.道必须日日修.没有实力,一切皆为妄谈. 修炼是硬道理. 1.1 ...