微信小程序2 - 扩展Page参数

官方默认的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
  1 /**
  2  * 全局初始化界面函数,供页面调用
  3  * PageOption = {
  4  *  needLogin:false,  //是否需要登录
  5  *  loginReturnUrl: null  // 登录成功后,需要跳转回的页面,可以是function ,为空则返回默认页面
  6  * 
  7  * }
  8  * 
  9  */
 10 BasePageOptionClass.initPage = function (PageOption ) {
 11     var app = getApp();
 12     PageOption = PageOption || {};
 13  
 14         var actualOption = new BasePageOptionClass(PageOption.data);
 15         actualOption.PageOption = PageOption;
 16         var wxFunctions = {
 17             "onLoad": 1, "onReady": 1, "onShow": 1, "onHide": 1, "onUnload": 1, 
 18       "onPullDownRefresh": 1, "onReachBottom": 1 , "onShareAppMessage": 1, "onPageScroll": 1
 19         };
 20     for (var key in PageOption) {
 21       if (!wxFunctions[key]) {
 22         const functionKey = key;
 23         actualOption[functionKey] = actualOption.PageOption[functionKey]
 24       }
 25     }
 26 
 27         for (var functionKey in wxFunctions) {
 28       const key = functionKey;  // 这里要一个临时常量,否则执行的时候,functionKey永远是最后一个
 29       if (!PageOption[key]){  //如果 参数没有,而基类有,那么保持基类不变
 30         if (actualOption[key]) {  //目前只有 onShareAppMessage 是底层封装好的
 31           continue;
 32         }
 33       }
 34       //否则重写基类方法
 35       Object.defineProperty(actualOption, key, {
 36         configurable: true  ,
 37         enumerable: true  ,
 38         value: function () {
 39           var $target = this;  //这里的 $target 可以认为是  BasePageOptionClass实例, 实际上,在运行时,已经转变为 Page对象
 40           try { 
 41             //处理通知消息
 42             if("onLoad"==key){  //当页面第一次打开的时候,注册 以 当前页 route 为 name的通知事件,通知内部做了 获取未处理消息的机制,如果有未处理的消息,那么立即执行
 43               $target.addNotifyListener($target.getCurrentPageUrl());
 44             } else if ("onUnload" == key) {
 45               //页面销毁的时候,销毁所有已注册的通知
 46               $target.removeNotifyListener(); 
 47             }
 48             // 嵌入了 前置处理程序,如果注册了 , 必须有 返回值 true | false , 如 before_onLoad , 参数和 原始方法保持一致,类 拦截器,暂时未支持栈,只支持一个
 49             var canContinueRun = BasePageOptionClass.wrapPageLifeCircle(key, $target)
 50             if (!canContinueRun) {
 51               console.log("前置处理未通过,方法 " + currUrl + "  " + key)
 52               return;
 53             } 
 54             //这里要使用 actualOption ,不能用 $target ,在页面带有 component 时 , 会冲突掉 PageOption
 55             var func = actualOption.PageOption[key];
 56             if (func && func!=null) {
 57               console.log("初始化方法 " + key + " 执行 ")
 58               func.apply($target, arguments);
 59             }
 60           } catch (err) {
 61             console.log(key + "", err);
 62           }
 63         },
 64         writable:  false
 65       }); 
 66         }
 67     // console.log(actualOption)
 68   return actualOption;
 69 }
 70 
 71 
 72 
 73 BasePageOptionClass.wrapPageLifeCircle = function (LifeCircleFuncName, PageOption={}) {
 74     var canContinueRun = true;
 75   var app = getApp();
 76     // console.log(LifeCircleFuncName)
 77   
 78   if (PageOption.needLogin) {  //是否需要登录 
 79         // console.log("执行前置")
 80     if ("onLoad" == LifeCircleFuncName || "onShow" == LifeCircleFuncName) {  //在onload 事件之前做 登录判断
 81             var xgUserInfo = app.globalData.xgUserInfo;
 82             if (!xgUserInfo) {
 83         var loginReturnUrl = "/pages/my/index/index"
 84                 if (!PageOption.loginReturnUrl) {
 85             loginReturnUrl = PageOption.loginReturnUrl;
 86                 } else { 
 87                     if (typeof loginReturnUrl === "function") {
 88             loginReturnUrl = (loginReturnUrl)();
 89                     } else {
 90             loginReturnUrl = "/pages/my/index/index"
 91                     }
 92                 }
 93         wx.reLaunch({
 94           url: "/pages/my/register/index?returnUrl=" + loginReturnUrl
 95         });
 96                 canContinueRun = false;
 97             }
 98         } 
 99     } 
100   if (!canContinueRun) return canContinueRun;
101 
102   var func = "before_" + LifeCircleFuncName;
103   var pf = PageOption[func];
104   if (pf && pf!=null){ // 带有before_ 开头的对应的内置方法,作为前置判断 , 需要有返回值
105     var ret = pf.apply(PageOption, []);
106     if(ret!==undefined){
107       if (!ret) canContinueRun=false;
108     }
109   } 
110   // app.util.log("进入前置", LifeCircleFuncName)
111     return canContinueRun;
112 }

 

这个方法的核心完成了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);
     
}                    

 

 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/jifsu/p/7850811.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信小程序page-container是一个页面容器组件,用于包含页面的内容。它可以帮助开发者更好地管理页面的结构和布局,提高页面的可维护性和可扩展性。在使用page-container时,开发者可以通过设置不同的属性来控制页面的样式和行为,例如设置页面的背景色、滚动条的显示方式、页面的标题等。同时,page-container还提供了一些事件,可以让开发者在页面加载、滚动等不同的场景下进行相应的处理。总之,page-container是一个非常实用的小程序组件,可以帮助开发者更好地构建小程序页面。 ### 回答2: 微信小程序 Page-Container 是微信开发者工具提供的一个页面容器组件,用于实现多页面应用。 Page-Container 是一个页面的容器,用户可以在其中添加多个页面,实现一个小程序内的多个页面的切换。它提供了分页、上拉加载、下拉刷新等功能,让用户能够更加方便地浏览小程序的内容。 Page-Container 组件的使用非常简单。用户只需要在相应小程序页面的 json 文件中添加引用即可。在使用 Page-Container 的过程中,用户可以设置选项卡的样式、选项卡的数量、每个选项卡对应的页面等等。并且 Page-Container 组件还支持上拉加载、下拉刷新等操作,方便用户更加方便的浏览多页面中的内容。 总的来说,Page-Container 是一个非常有用的小程序组件,可以很方便地实现多页面的切换,为用户提供更加舒适的小程序使用体验。对于开发者而言,使用 Page-Container 也可以让小程序开发更加简单高效,减小代码维护难度。 ### 回答3: 微信小程序是一种基于微信平台的应用程序,其中小程序的界面框架为page-container。page-container是微信小程序架构的核心组件之一,主要用于承载小程序页面的容器。 page-container提供了小程序的页面切换、渲染和嵌套等功能,是小程序页面加载流程的重要组成部分。通过page-container,小程序可以方便地进行页面的切换,实现快速的响应速度和用户体验。 在使用page-container时,小程序开发者需要定义好小程序的页面结构和对应的路由方案,并将这些信息配置到page-container中。这样,当用户点击小程序的某个链接或者菜单时,page-container就会根据路由方案自动地加载相应的页面,并在页面之间进行切换。 除了上述主要功能,page-container还支持小程序的多个扩展功能。例如,小程序可以在page-container中设置页面切换时的动画效果,或者在页面切换完成后自动执行一些特定操作等。 综上所述,微信小程序page-container是一种非常重要的框架组件,它提供了小程序的页面切换、渲染和嵌套等多种功能,帮助小程序实现更加高效、灵活和优秀的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值