您现在的位置是:网站首页> 编程资料编程资料
如何全局重写小程序Page函数wx对象详解_javascript技巧_
2023-05-24
320人已围观
简介 如何全局重写小程序Page函数wx对象详解_javascript技巧_
背景
如果能够全局改写小程序的Page里的生命周期方法或wx里的函数,那么可以做很多有意思的事情。与其说是改写,不如说是代理或装饰。属于是设计模式中的代理模式或装饰器模式。
方案
重写Page函数
在app.js中调用:
Page = pageProxy(Page);
实现对Page里生命周期方法装饰。文章后面会继续聊怎么实现pageProxy。
重写wx对象
在app.js中调用:
wx = wxProxy(wx); 复制代码
实现对wx里函数的装饰。文章后面会继续聊怎么实现wxProxy。
注意事项
上面二者都是全局生效的。
- 在
app.js中调用Page = pageDecorator(Page);和wx = wxDecorator(wx);时,不要带var或const或let,因为带了后就只在本页面生效。不带才是全局生效。 - 必须在
app.js中调用,或在app.js中引用相关的文件中执行上面2个语句。如果在页面的js中调用,会来不及,那时候可能存在一些页面初始化用了旧的Page对象。 - 只能执行一次,多次执行会导致多次代理/装饰,不可取。
pageProxy
直接举个例子,比如要修改onLoad生命周期函数的行为。
function onLoadProxy(onLoad?: WechatMiniprogram.Page.ILifetime['onLoad']): WechatMiniprogram.Page.ILifetime['onLoad'] { return function newOnLoad(query) { doSomethingWith(query); // 可访问参数query,做一些事情,比如上报 if (onLoad) { // 如果开发者在Page中定义了onLoad,我们需要调用一下开发者定义的onLoad return onLoad.call(this, query); // 注意这里必须用call(this)。这里也可以把query换成个新对象,达到修改参数的目的。(不建议直接修改query,因为会把传入的数据给改掉,而业务开发者不知情) } }; } function pageProxy(Page: WechatMiniprogram.Page.Constructor): WechatMiniprogram.Page.Constructor { return function newPage(options) { const newOptions = { ...options }; newOptions.onLoad = onLoadProxy(options.onLoad); Page(newOptions); }; }关键点:重写方法时,务必使用call(this)保持this引用,否则会导致业务开发者写onLoad的函数体时,无法访问到符合预期的this。
wxProxy
举个例子,比如要修改wx.navigateTo导航函数的行为。
function navigateToProxy(navigateTo: WechatMiniprogram.Wx['navigateTo']): WechatMiniprogram.Wx['navigateTo'] { return function newNavigateTo(object) { doSomethingWith(object); // 可访问参数object,做一些事情,比如上报 // 这里可以直接把参数换个新对象,达到修改参数的目的 // 注意下面是浅拷贝,不建议直接修改原始options,因为会把传入的数据给改掉,而业务开发者不知情 return navigateTo({ ...object, }); }; } function wxProxy(wx: WechatMiniprogram.Wx): WechatMiniprogram.Wx { const newWx = { ...wx }; newWx.navigateTo = navigateToProxy(wx.navigateTo); return newWx; }总结
到此这篇关于如何全局重写小程序Page函数wx对象的文章就介绍到这了,更多相关重写小程序wx对象内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
您可能感兴趣的文章:
相关内容
- Vue计算属性与监视属性实现方法详解_vue.js_
- vue深度优先遍历多层数组对象方式(相当于多棵树、三级树)_vue.js_
- JS判断当前是否平板安卓并是否支持cordova方法的示例代码_javascript技巧_
- Vue常见报错整理大全(从此报错不害怕)_vue.js_
- vue 如何删除数组中的某一条数据_vue.js_
- vue中的循环遍历对象、数组和字符串_vue.js_
- 如何使用JavaScript快速创建一个1到100的数组_javascript技巧_
- vue中三种调用接口的方法_vue.js_
- vue 如何引入本地某个文件 require_vue.js_
- pm2与Verdaccio搭建私有npm库过程详解_node.js_
