Uniapp打包H5端弱网络环境下存在页面UI渲染错乱问题方案实现

ops/2025/3/10 4:36:32/

一.需求

  • uniapp打包的H5项目,首页模块的业务逻辑偏多,调用的接口数量庞大,在弱网络的情况下切换了页面或者网络较好但是页面的UI未渲染完成的情况下快速地切换了页面会出现UI渲染错乱的问题,针对该问题个人从两个方面来进行处理;
  • 切换页面时 取消对网络的请求 显示UI的渲染;保证首页渲染结束之前,限制底部tab的切换;

二.代码实现

2.1.网络请求框架选型

  • 基于Uview的http进行的封装,主动取消网络需要借助下方getTask中的task;
    在这里插入图片描述

  • 封装的网络请求代码如下,包含两个js文件,httpRequest.js和service.js:

  • httpRequest.js

//httpRequest.js
// 引入基路径
import {baseURL
} from "@/config/index.js"// 此vm参数为Vue 实例 或 页面实例 ,可以通过它引用vuex中的变量
module.exports = (vm) => {// 初始化请求配置uni.$u.http.setConfig((config) => {/* config 为默认全局配置*/config.baseURL = baseURLconfig.loadingText = '加载中...'config.header = {'Content-Type': 'application/json',Authorization: Authorization}return config})// 请求拦截uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作//根据需求自行改动======================================================var token = uni.getStorageSync('access_token') || vm.vuex_token || nullif (config?.custom?.auth == undefined) {if (token != null && token != '' && token != undefined) {config.header["Authorization"] = "Bearer " + token;} else {vm.$u.toast("您尚未登录,请先登录");uni.clearStorageSync();setTimeout(() => {//跳转到登录页面}, 1500);return false;}}// 这一步就是给baseUrl重新赋值 !!!if (config?.custom?.changeBaseUrl != undefined) {config.baseURL = baseURL}// 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}config.data = config.data || {}if (config.data && config.data.header) {config.header["content-type"] = config.data.header["content-type"];}//根据需求自行改动======================================================return config}, config => { // 可使用async await 做异步操作return Promise.reject(config)})// 响应拦截uni.$u.http.interceptors.response.use((response) => {/* 对响应成功做点什么 可使用async await 做异步操作*/const data = response.data//根据需求自行改动======================================================// 自定义参数const custom = response.config?.customif (data.code !== 200) {if (data.code == 401) { //token过期或者token为空if (custom?.tokenExpire) {return Promise.reject(data)} else {vm.$u.toast("您尚未登录,请先登录");uni.clearStorageSync();setTimeout(() => {//跳转到登录页面}, 1500);return false;}} else if (data.code == 444) { //账号在其它位置登录if (custom?.tokenExpire) {return Promise.reject(data)}}if (custom.toast !== false && data.msg != undefined && data.msg != '') {uni.$u.toast(data.msg)}// 如果需要catch返回,则进行rejectif (custom?.catch) {return Promise.reject(data)} else {// 否则返回一个pending中的promise,请求不会进入catch中return new Promise(() => {})}}//特殊处理if (custom?.defaultStructure === true) {return data === undefined ? {} : data} else {return data.data === undefined ? {} : data.data}//根据需求自行改动======================================================}, (response) => {// 对响应错误做点什么 (statusCode !== 200)return Promise.reject(response)})
}
  • service.js
// 引入基路径
import {baseURL
} from "@/config/index.js"let baseInfo2 = "service/baseInfo"
export const baseInfo = (config = {}) => http.post(baseInfo2, config)
  • 页面中逻辑,引入service文件,定义baseInfo方法,onHide声明周期方法中调用取消网络请求
async getBaseInfo() {
await baseInfo({getTask: (task, options) => {that.requestTask = task//定义变量console.log("personInfo requestTask")},}).then((res) => {//省略//渲染UI逻辑})
}onHide() {if (requestTask != null && requestTask.abort) {requestTask.abort()}
},async onShow() {await this.getBaseInfo()uni.showTabBar(); // 显示底部 tabBar
},

2.2.保证首页渲染结束之前,限制底部tab的切换

onLoad() {// 隐藏底部 tabBaruni.hideTabBar();
},

三.总结

  • 通过以上两个方面的处理,弱网络环境下出现的页面UI渲染错乱问题有个较好的解决。

http://www.ppmy.cn/ops/164562.html

相关文章

美颜SDK架构揭秘:人脸美型API的底层实现与优化策略

在短视频、直播和社交娱乐行业的快速发展下,美颜SDK已成为各大应用的重要组成部分。其中,人脸美型API作为核心功能,决定了最终的美颜效果和用户体验。本文将深入探讨美颜SDK的人脸美型API的底层实现,并分享优化策略,帮…

【Linux网络】NAT技术、DNS系统、五种IO模型

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、NAT2、代理服务器3、内网穿透4、DNS 和 ICMP5、五种IO模型 1、NAT NAT (网络地址转换)技术主要解决 I…

嵌入式学习笔记-卡尔曼滤波,PID,MicroPython

文章目录 卡尔曼滤波卡尔曼滤波的核心思想卡尔曼滤波的数学模型1. 状态转移模型(预测系统状态)2. 观测模型(预测测量值) 卡尔曼滤波的五个关键步骤1. 预测状态2. 预测误差协方差3. 计算卡尔曼增益4. 更新状态5. 更新误差协方差 卡…

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…

godot在_process()函数实现非阻塞延时触发逻辑

extends Node2D# 用于累加 delta 的变量 var elapsed_time 0 # 设定计时周期,单位为秒 var interval 3func _process(delta):# 累加 delta 到 elapsed_timeelapsed_time delta# 检查是否达到了设定的时间间隔if elapsed_time > interval:# 执行每 3 秒要做的逻…

rabbitmq-amqp事务消息+消费失败重试机制+prefetch限流

1. 安装和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

【每日学点HarmonyOS Next知识】Web跨域资源、Web长按菜单、Web拦截请求、禁止录屏、Base64图片宽高

1、HarmonyOS Web组件本地资源跨域问题&#xff1f; 关于资源跨域问题的解决&#xff0c;可以参考以下官网文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/web-cross-origin-V5 方法一 为了使Web组件能够成功访问跨域资源&#xff0c;开…

第5章 使用OSSEC进行监控(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第5章开始进入主机安全&#xff08;HIDS&#xff09;领域了&#xff0c;2022年的时候有幸做过终端安全一段时间&a…