路由拦截、埋点
场景:大部分页面内接口需要登录拿到 token,一般登录是需要跳转到一个统一的登录页,登录后返回之前页面。小程序没有全局的路由拦截,需要在页面 onLoad onShow 生命周期内判断是否登录过,未登录跳转到登录页,实现起来不方便统一管理且容易遗漏。
实现:
重写 Page 方法
app.js
const routerBeforeEach = (next) => {
const token = wx.getStorageSync('token');
if (token) {
next();
return;
}
if (!token && !getApp().globalData.isInLogin) {
getApp().globalData.isInLogin = true
wx.navigateTo({
url: '/pages/login/index'
})
return
}
next()
}
const OldPage = Page;
Page = function (options) {
const oldLoad = options.onLoad
const oldShow = options.onShow
options.onLoad = function () {
routerBeforeEach(() => {
oldLoad.apply(this, arguments)
console.log('new onLoad')
// 小程序页面 uv 埋点
})
}
options.onShow = function () {
routerBeforeEach(() => {
oldShow.apply(this, arguments)
console.log('new onShow')
// 小程序页面 pv 埋点
})
}
OldPage(options)
}
扩展
- 重写
onShareAppMessage方面,分享时可以统一处理分享需要带出的公共数据 - 重写
onLoad方法,统一解析onLoad的参数方便页面使用 - 重写
AppPageComponent方法,重写三个方法传入options内部的生命周期,点击事件绑定的方法等实现埋点功能
全局公共组件
场景:广告弹框、浮窗
实现:创建一个全局的 pageWrap 组件,整个页面用作为 pageWrap 的插槽使用。
components/pageWrap/index
<view class="page-wrap">
<!-- 页面 -->
<block>
<slot></slot>
</block>
<!-- 广告弹框 -->
<van-dialog title="广告弹框">
<image src="https://img2.baidu.com/it/u=1728522718,1340994382&fm=26&fmt=auto&gp=0.jpg" />
</van-dialog>
<!-- 浮窗 -->
<view class="flow-window"></view>
</view>
app.json
"usingComponents": {
"page-wrap": "/components/pageWrap/index",
},
pages/home/index.wxml
<page-wrap>
<view>home</view>
</page-wrap>