问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

微信小程序如何实现全局重新加载

发布网友 发布时间:2023-07-31 23:16

我来回答

1个回答

热心网友 时间:2024-03-11 19:47



背景:


随着业务的增加,我们服务器需要计算大量的用户数据,导致用户跟客服反应页面不能正常展示。反馈给开发后,我们一看,是服务器异常的错误。So,产品想看下我们到底有多少用户页面不能正常展示?


方案:

后端人员直接在阿里云后台去查哪些接口异常
前端做一个服务器报错页,这样产品在小程序后台能看到这个页面的PV,UV
技术方案


因为业务庞大,所以我们不可能区在每个页面加上重新加载的逻辑。所以初步考虑使用全局重新加载。


需要解决的问题都有哪些?

首先我们要有网络请求失败的全局控制权(要不然就需要在每个页面处理失败的情况)
需要定义好网络失败后是如何跳转到重载页(R)的(用wx.redirectTo,wx.reLaunch还是其他)
点击错误页的“重新加载”,如何返回或跳转到出错页(E)(用wx.redirectTo,wx.reLaunch还是其他)
跳转到出错页后,如何重新加载数据(把所有请求都放在Page.onShow()里面?)
那如果从出错页的上个界面(P)传到出错页(E)options,那重载页(R)又将如何处理?
点击重新加载跟返回,我们希望效果效果一样,又该如何操作?
实践的方式如下


第一个问题: 比较好解决,我们基于wx.request已经封装了为fetch(如果还在用wx.request的项目可以考虑封装下,好处多多)。基于fetch我们可以用res.statusCode来判断服务器是否出错。


第二个问题: 暂且先不说具体的跳转方式是怎样的,就跳转的url这个怎么定义也需要我们来讨论下。为什么这么说,因为我们的架构涉及到了分包。分包加载意味着我们的代码不仅仅是在pages下面,还放在了package下。


基于此,我们在跳转的时候,url能直接写成'../serverError/serverError'吗?在主包下面可以正常跳转,但是在分包下,路径是'package/serverError/serverError',这样跳肯定不行。url应该是根目录下的路径,所以'/pages/serverError/serverError'。


路径确认后,我们可以跳转了。如果是wx.redirectTo(关闭当前页面,跳转到应用内的某个页面),想象下关闭E跳转到R,点击重新加载,再关闭R跳转到E,这么跳转路径复杂,用户体验不好,并且options的参数需要逐级传递。wx.reLaunch类似。我们用所以我们选择wx.navigateTo。


第三个问题: 综合问题二的解释,跳回到E,我们用wx.navigateBack。


第四个问题: 如果从R用wx.navigateBack回到E的话,肯定会触发E.onShow()方法。但是有些请求我们除了写在Page.onShow()里,还有些是写在Page.onLoad()里的,所以我们必须想办法调起E.onLoad()。


大家对于getCurrentPages()这个方法肯定不陌生,官方定义是来获取当前页面栈,我们一般用它来获取当前页面路径。其实在这个过程中,我们是能拿到当前页面的实例的,并且实例里面有route(页面路径)options(页面传递参数)data(页面初始参数)以及各种function()等等。


利用previousPageClass()我们可以拿到E的实例,也就可以拿到E.options,当然我们也可以调E.onLoad()。


util.js
// 获取当前路径
function currentPagePath() {
let pageData = getCurrentPages()
if (pageData.length >= 1) {
let len = pageData.length - 1
let data = pageData[len]
return data.route
} else {
return ''
}
}
// 获取上个界面的实例
function previousPageClass() {
let pageData = getCurrentPages()
if (pageData.length >= 2) {
let len = pageData.length - 2
let preClass = pageData[len]
return preClass
} else {
return ''
}
}
mole.exports = {
currentPagePath,
previousPageClass
}
第五个问题: 基于问题的四的方案,我们可以调E.onLoad(E.options)来将我们的参数回传回去。


第六个问题: 点击返回,相当于页面卸载,也就是执行了R.onUnload(),这个时候我们只需要执行E.onLoad(E.options)这个方法,把options传过去,以及调用起E.onLoad()就OK了。


但是点击重新加载,我们是调的wx.navigateBack(),这个方法也会走R.onUnload()。这是时候可能有些苦恼了,我们隐藏掉返回按钮?发现官方并没有提供此方法。禁用R.onUnload(),好像也不行。因为R.onUnload()是在点击重新加载后才执行的,所以我们可以记录下用户是否点击了重新加载的行为。然后我们通过记录的行为,即便用户点击了重新加载,然后触发了R.onUnload(),我们不去执行E.onLoad(E.options)就OK了。


// pages/serverError/serverError.js
import { previousPageClass } from '../../utils/util.js'
let isClickReload = false
Page({
onLoad: function (options) {
isClickReload = false
},
onUnload: function () {
if(!isClickReload) {
this.callbackParams()
}
},
/**
* 点击事件
*/
clickReload: function (e) {
isClickReload = true
wx.navigateBack()
this.callbackParams()
},
// 点击返回,参数回传
callbackParams: function () {
let preOptions = previousPageClass().options
previousPageClass().onLoad(preOptions)
}
})
至此所有问题,基本都已解决。


Demo代码附上,欢迎参考。

总结

微信小程序如何实现全局重新加载

首先我们要有网络请求失败的全局控制权(要不然就需要在每个页面处理失败的情况) 需要定义好网络失败后是如何跳转到重载页(R)的(用wx.redirectTo,wx.reLaunch还是其他) 点击错误页的“重新加载”,如何返回或跳转到出错页(E)(用wx.redirectTo,wx.reLaunch还是其他) 跳转到出错页后,如何重新加载数...

原生微信小程序如何做全局状态管理

首要需求是创建一个全局数据存储,微信小程序的globalData充当这个角色,它是一个可以在所有页面间共享的JavaScript对象,适合存储用户信息和应用状态。在app.js中初始化globalData,可以简化页面间的数据传递。其次,使用Proxy技术来代理globalData,当在全局数据上进行修改时,自动触发相应页面的setData方法,实现...

微信小程序点击按钮重新加载页面?

1,微信小程序有提供一个下拉刷新的功能2,点击按钮重新加载页面没有任何意义,因为如果你要改变页面显示数据,可以直接(请求接口)改变data数据他会自动重新加载,或者重新调用onLoad里面的方法(一般我们把请求数据都放在onLoad里面),不会像网页那样需要刷新页面3,如果你硬是要那种效果你可以用页面跳转api...

微信小程序怎么实现自动刷新

打开微信小程序开发工具,扫码二维码登录,新建或打开项目 在对应的wxml文件中,插入view标签并绑定变量 在对应界面的JavaScript文件中,data对象里初始化变量num 在生命周期函数onLoad中,调用定时器函数setInterval,修改变量num 保存代码并查看左侧的模拟器,结果对应的值没有变化 检查代码发现,没有获取到变...

微信小程序怎么重新授权 微信小程序如何重新授权

1、首先打开【微信】,点开界面下方的【发现】,在众多选项中选择【小程序】,选中界面右上角的【搜索】,搜索想要重新授权的小程序,点击进入小程序,选择界面右上角的【三点】图标。2、在弹出的窗口中,选中【设置】,点开【用户信息】,选择【授权用户信息】旁边的按钮,使其由绿色变为灰色,点击...

微信小程序如何刷新当前界面的实现方法

下面介绍一下微信小程序刷新当前界面的几种方法。方法一:this.onLoad()使用方法:在操作函数中调用this.onLoad()或that.onLoad()(有时候this的作用域不够的时候需要定义that = this)。适用场景:本次操作对页面onLoad函数所携带的各种参数没有影响。这时候我们在页面第一次执行onLoad函数的时候可以定义...

微信小程序怎么重启?

很简单,打开小程序之后点击分享按钮,重新进入小程序就是重启。 操作流程如下,我以微信8.0.28版本演示一遍: 1、打开微信后向下滑动微信主界面 2、点击【小程序】,找不到可以点击更多或者搜素 3、进入小程序之后点击右上角【...】 4、点击【重新进入小程序】即可 1 评论 分享 举报 水月...

微信小程序如何重新开始玩?

操作手机:iPhone12操作系统:IOS15.5微信小游戏重新开始玩的步骤如下:1、打开微信,点击“我”的,再点击设置。2、在设置页面,点击通用。3、在通用页面,点击存储空间。4、进入页面,找到缓存,点击清理。人们喜欢微信小游戏的原因如下:1、无需下载和安装。APP的移动游戏必须先下载和安装,然后才能...

微信小程序如何使用全局js

1.要注意的是必须要用module.exports导出要调用属性或方法;2.使用的时候用var api = require('../../utils/api.js'); 加载代码,然后使用api.SYNC_TABLE_URL 直接调用 3.调用方法也差不多。

微信小程序如何重新授权?

重新授权微信小程序的方法是:在微信中打开“设置”页面,选择“隐私”选项,点击“授权管理”,找到并选择相关的小程序,点击“解除授权”后再重新授权。以下是详细步骤和 首先,用户需要打开微信并进入“我”的页面。在这个页面中,用户可以找到并点击“设置”选项。在“设置”页面中,用户需要找到“隐私...

微信小程序全局样式 微信小程序全局状态管理 微信小程序全局数据 微信小程序加载 微信如何设置小程序 微信小程序全局配置文件 微信小程序全局函数 微信小程序全局变量 微信小程序修改全局变量
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...但银行贷款没下来,请问我可以用信用卡刷卡两万买东西吗 一直三角形60度对边(直边)长2.3Cm求另一直边? 秦朝御史大夫和西汉时刺史代表中央行使的权力相同的是 [ ] A、监察... 两汉时的刺史与秦朝的什么官职权相近 ( ) A 御史大夫&n... 联想电脑投诉监督电话-不要联想官方电话,我要找能够监督联想电脑的部门... 《绝地求生》背后的科技:是什么力量造就了吃鸡? 和人私信如何删除记录!在百度问问里 ...初三的一位学生,我想问一下,中考音乐特长舞蹈,声乐各加多少分... 初三中考艺考舞蹈生加多少分? lec识别法指的是 中国象棋等级分最新排名 象棋怎么摆怎么玩 3426开头的身份证是哪里的 已经交房后被别人住进去了是违法的吧 房子被别人强行入住怎么办 手表小表盘是什么意思 乐橙监控app怎样添加摄像机? 高考最后的冲刺要做到哪几点? “员工请假被拒绝在工厂自杀身亡。”你对此如何看法”你对此如何看法... 怎么看待员工请假被拒,在工厂自杀身亡? 员工请假被拒在工厂自杀身亡,工厂只愿赔三万,钱少了吗? 员工请假被拒在工厂自杀身亡,家属索赔200万,工厂该不该赔? 楼顶水箱有几根管子供水 屋顶消防水箱排水管可以屋顶开洞吗 买全民社保的人50岁意外死亡保险公司何理赔? 买了全民社保的人意外死亡保险公司有退还本金吗? c语言编程下述函数需要从输入的字符串 中提取出文件的标题,然后存入输 ... c 语言 编程练习题 标题: 马虎的算式 小明是个急性子,上小学的时候经常... 标题编程时数码管赋值段码和位码的顺序有要求吗? 编程语言取一个标题中包含两种关键字时怎么表达 男生耍酷经典名言有哪些?多多益善 最经典的QQ说说:眉毛上的汗水和眉毛下的泪水,你总得选一样 销售150000万成本126000一般纳税人企业,增值税和所得税算出要缴... 为什么说酶的活性部位是酶行使催化功能的结构基础? 胃肠湿热如何调理 助跑跳高80cm难度有多大一般人 1吨货梯哪家好 2吨货梯厂家 公益爱心活动主持人串词 公益慈善活动主持人串词范本 东华大学夏令营入营名单 东华大学夏令营的报名条件理学院 东华大学管理学院专硕夏令营是投了就能进吗 东华大学夏令营国际商务专业怎么样 有没有那种装修服务价格透明,过程中不增项的家装公司? 请问在深圳,有哪家装修公司的收费是透明呢? 家乡新天地800字以上 一道初二数学判断题。关于平方根 初二数学上册问题。。。很悲催我数学差的没底,求帮助 初二上册数学问题,希望能得到正确答案,这题我想了半天: 已知一个正 ... 新集镇的文化教育