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

一.需求

  • 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 = baseURL
		config.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 || null
		if (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?.custom

		if (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返回,则进行reject
			if (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() {
	// 隐藏底部 tabBar
	uni.hideTabBar();
},

三.总结

  • 通过以上两个方面的处理,弱网络环境下出现的页面UI渲染错乱问题有个较好的解决。
<think>好的,我需要帮助用户解决关于UniApp开发框架的使用说明或错误解决的问题。首先,根据用户提供的引用内容,我需要整理相关的信息,并按照用户的要求组织回答结构。 首先,用户的问题是关于UniApp的使用说明或错误解决。根据引用[1],UniApp是一个使用Vue.js的多开发框架,可以发布到多个平台。引用[2]、[3]、[4]提到了具体的框架如unibest和uni-plus,以及搭建步骤和UI组件库uview。需要将这些信息整合起来,提供清晰的步骤说明和常见错误解决。 接下来,我需要按照用户的要求,回答结构清晰,分步骤解决问题,并保证真实可靠。同时,需要生成相关问题,并在引用处添加标识。要注意使用中文回答,行内公式用$...$,独立公式用$$...$$,但根据用户的问题,可能数学公式较少,但如果有的话要正确应用。 然后,我需要检查是否有需要纠正或补充的地方。例如,用户引用的内容中提到unibest和uni-plus框架,可能需要简要介绍它们的优势和特点。此外,错误解决部分需要涵盖常见错误如环境配置、跨兼容、API调用、UI组件和打包问题,并给出解决方法,同时引用对应的参考资料。 最后,生成相关问题,确保问题UniApp开发相关,并覆盖用户可能感兴趣的方面,如性能优化、跨平台兼容、UI库选择、调试技巧等。 总结步骤: 1. UniApp框架简介和核心功能 2. 快速搭建步骤(参考引用4) 3. 推荐开发框架(unibest和uni-plus,引用2、3) 4. 常见错误及解决方法 5. 生成相关问题 需要确保每个部分都有对应的引用标注,语言简洁,结构清晰。</think>### UniApp 开发框架使用说明及常见错误解决 #### 1. UniApp 框架简介 UniApp 是由 DCloud 公司开发的跨应用框架,基于 Vue.js 语法,支持一套代码编译到 iOS、Android、Web、小程序等平台[^1]。其核心优势在于**高效开发**和**多兼容**,开发者无需为不同平台重复编写代码。 --- #### 2. 快速搭建步骤(以官方模板为例) **步骤 1:环境准备** - 安装 Hbuilder X 编辑器(官方推荐开发工具)[^4]。 - 确保 Node.js 环境已配置。 **步骤 2:创建项目** 1. 打开 Hbuilder X,选择 `新建项目` -> `uni-app`,选择默认模板。 2. 安装依赖:通过 npm 或 Hbuilder X 内置包管理器安装必要插件。 **步骤 3:集成 UI 组件库** 推荐使用 `uview` 或 `UniUI`: ```javascript // 在 main.js 中引入 uview import uView from 'uview-ui'; Vue.use(uView); ``` 引用标识: --- #### 3. 推荐开发框架 为提高开发效率,可基于以下优化框架: - **unibest**:集成 Vue3 + TS + Vite4 + UnoCss,提供代码片段、自动格式化等功能,适合复杂项目[^2]。 - **uni-plus**:内置 Pinia 状态管理、WotUi 组件库,配备 Echarts 图表和权限控制案例,适合快速原型开发[^3]。 --- #### 4. 常见错误及解决方法 **错误 1:环境配置问题** - **现象**:编译时报错 `模块未找到`。 - **解决**: 1. 检查 `node_modules` 是否完整,删除后重新执行 `npm install`。 2. 确认 Hbuilder X 的插件(如 Sass 编译插件)已安装。 **错误 2:跨兼容性问题** - **现象**:H5 正常,小程序样式错乱- **解决**: - 使用条件编译: ```javascript // #ifdef H5 console.log('仅H5生效'); // #endif ``` - 避免使用 `px`,改用 `rpx` 适配不同屏幕。 **错误 3:API 调用失败** - **现象**:`uni.request` 返回 `404`。 - **解决**: - 检查请求域名是否在小程序后台配置白名单。 - 使用代理解决开发环境跨域: ```javascript // vite.config.js proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true } } ``` 引用标识: **错误 4:UI 组件渲染异常** - **现象**:`uview` 组件未显示。 - **解决**: 1. 在 `uni.scss` 中引入组件样式文件。 2. 重启 Hbuilder X 并清理缓存(菜单栏 `运行` -> `清理缓存并重启`)。 **错误 5:打包体积过大** - **优化方案**: - 使用 Vite 按需编译(需 unibest 框架支持)[^2]。 - 启用 `代码压缩` 和 `图片压缩` 插件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值