对微信小程序的生命周期进行扩展 – Typescript 篇
最近利用业余时间倒腾了一个微信小程序,主要目的是横向比较一些业界小程序平台的架构和做法。因为有在其他平台长期的开发经验,对于小程序的一些机制做了一些辩证的思考。例如,小程序的页面,其实不是一个页面,而只是一个方法构造器,甚至整个应用也都只是一个方法而已。这样的情况下,我们以前学到的很多面向对象的经验,例如继承之类的,在这里通通就没有用武之地了。不可否认这样对于一些新手来说,可能是一个不错的设计。但对于我们这种老炮来说,总是有一种要去改造它的冲动。
于是,我也就开始思考,看看能否对所有的页面做一个通用的功能,而不是每次在每个页面中都去写一遍。例如,很显然几乎所有的小程序,都会有用户个性化的数据。这个数据其实需要到所有的页面,那么到底怎么加载这个数据呢?我们可以在App.OnLaunch中尝试去加载,但一般加载数据的过程都是异步的,又怎么通知到所有页面说数据加载成功了呢?
带着这样的问题,本着能用前人经验就不自己折腾的原则,我在网上搜了一下。下面这一篇文章真是跟我英雄所见略同啊。
https://developers.weixin.qq.com/community/develop/article/doc/000a42cdb744b0c00b99eaaba56813
利用上述文章提到的思路,基本上能实现我的目的。本文是写了一个Typescript的版本,但荣誉属于上面的这位Stephen同学。
我喜欢Typescript, 这不用多说了,至于如何用Typescript 进行微信小程序开发,请参考我的文章 https://www.cnblogs.com/chenxizhang/p/14265729.html
下面上代码,并交待一些用Typescript时特殊的地方。
- 默认情况下,Typescript版本中Page 构造器是不允许修改的,因为它定义时用的是const,你需要手工修改下面这个文件,将其修改为let

- 创建一个pagex.ts 文件,当然你可以起任何你想要的名字
const pagex = (Page: WechatMiniprogram.Page.Constructor): WechatMiniprogram.Page.Constructor => {
return (object: any) => {
const { onLoaded } = object
//由于我们需要重写onLoad这个默认方法,为了让具体页面还可以定义具体的Load逻辑,我们假定页面需要实现一个onLoaded方法
object.onLoad = function (_options: any) {
//读取用户数据
wx.getUserInfo({
success: res => {
if (typeof onLoaded === "function")
//如果用户定义了这个函数的话,就调用它
onLoaded.call(this, res.userInfo)
}
})
}
//重写所有页面的分享逻辑,这样不需要在页面中定义了
object.onShareAppMessage = () => {
return {
title: "转发标题"
}
}
return Page(object)
}
}
const original = Page
Page = pagex(original)
- 将这个扩展代码导入到应用中。这个很简单,只需要在App.ts中导入即可。

- 定义一个页面生命周期的扩展接口,以便提示页面,可以实现onLoaded这个函数

- 在具体页面代码中,用如下的方式实现一个自定义的页面构造器

很多事情都是因为你想去做它,然后你就做到了。不要停止思考和尝试。
对微信小程序的生命周期进行扩展 – Typescript 篇的更多相关文章
- 微信小程序之生命周期(三)
[未经作者本人同意,请勿以任何形式转载] 上一篇介绍微信小程序开发工具使用和项目目录结构. 这一章节介绍微信小程序的生命周期,什么是生命周期呢? 通俗的讲,生命周期就是指一个对象的生老病死. 从软件的 ...
- 教你理解微信小程序的生命周期和运行原理
转自:http://blog.csdn.net/tsr106/article/details/53052879 写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君 ...
- [转] 微信小程序之生命周期
本篇文章介绍小程序的生命周期,由于小程序分为应用和页面两个部分,所以小程序的生命周期就涉及到三个部分,分别是: 应用的生命周期 页面的生命周期 应用的生命周期对页面生命周期的影响 一.应用的生命周期 ...
- 理解微信小程序的生命周期和运行原理
写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君公众号带你学习小程序的生命周期和运行原理. 小程序由两大线程组成:负责界面的线程(view thread)和服务线 ...
- 微信小程序-APP生命周期与运行机制
QQ讨论群:785071190 开发微信小程序之前需要先了解微信小程序运行机制以及其生命周期,小程序APP生命周期需要先从app.js这个文件开始. 阅读过"微信小程序-代码构成" ...
- 微信小程序APP生命周期
小程序APP生命周期需要先从app.js这个文件开始,App() 必须在 app.js 中调用,必须调用且只能调用一次,app.js中定义了一些应用的生命周期函数 onLaunch----当小程序初始 ...
- 微信小程序的生命周期和APP对象的使用
1.生命周期和APP对象的使用: //app.js App({ onLaunch: function () { //调用API从本地缓存中获取数据 var logs = wx.getStorageSy ...
- 微信小程序-Page生命周期
QQ讨论群:785071190 微信小程序开发之前我们还需认识一下小程序页面的生命周期,丛"微信小程序-代码构成"一文中我们可以了解到小程序页面中有一个.js的文件,这篇博文我们来 ...
- 原生微信小程序的生命周期
小程序的生命周期函数:onLaunch:function(){当启动小程序时触发小程序只会启动1次,一般为初次打开时一般只会触发一次},onShow:function(){当小程序从后台切入到前台时触 ...
随机推荐
- EF CodeFirst多个数据摸型映射到一张表与各一张表
1. 多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 我们通常有这样的需求,如:同一基类派生出的不同数据 ...
- Spring中毒太深,离开Spring我居然连最基本的接口都不会写了
前言 随着 Spring 的崛起以及其功能的完善,现在可能绝大部分项目的开发都是使用 Spring(全家桶) 来进行开发,Spring也确实和其名字一样,是开发者的春天,Spring 解放了程序员的双 ...
- 使用Swiper快速实现3D效果轮播
最近经常接到轮播图3D效果的需求, 特在此记录一下以备之后使用. 具体实现效果如下: 在这里介绍两种使用方式, 一种原生的html+php后端渲染, 一种是使用vue. 原生实现 引入 首先我们介绍原 ...
- 算法(Java实现)—— KMP算法
KMP算法 应用场景 字符串匹配问题 有一个字符串str1 = " hello hello llo hhello lloh helo" 一个子串str2 = "hello ...
- VSCode + PYQT5 搭建图形化界面
1,安装依赖 pip install -i https://mirrors.aliyun.com/pypi/simple/ PyQt5 pip install -i https://mirrors.a ...
- Python-其他-round()保留小数位时遇到的问题
最近有一个需求,原有整数计算,改成小数计算,保留一位小数. 于是按照需求,将数据结构由 int 改为 float ,计算时采用round()方法来保留小数位. 第一版代码如下: a = 0.10000 ...
- Unity 2017 Scene界面与Game界面显示不同/过于灰暗的解决办法
场景界面的显示过于灰暗,严重影响工作心情. 切换到游戏界面时的颜色. 只要将场景中全部摄像机的[Allow HDR]取消勾选即可.
- Linux下登录Oracle命令行时删除键^H解决方法
Linux下登录Oracle命令行时删除键^H解决方法 在linux服务器下登录oracle的控制台,如果输入错误,想用删除键删除时却不能删除,输出的是^H的字符. 方法 用如下的命令可以使删除键生效 ...
- checkBox判断是否选中的方法
这里可以分为两种情况:JQuery对象和DOM对象: 通常我们用JQuery判断元素的属性的时候喜欢用 attr("attrName"); 但是尝试过的同学可能都知道,这种方法判断 ...
- springboot项目中使用jsp
在pom文件中 1.方法一 <!-- 引入tomcate内嵌的jsp解析包--> <dependency> <groupId>org.apache.tomcat.e ...