uniapp启动页面鉴权页面闪烁问题

在使用uni-app开发app 打包完成后如果没有token,那么就在onLaunch生命周期里面判断用户是否登录并跳转至登录页。 但是在app中页面会先进入首页然后再跳转至登录页,十分影响体验。

处理方法:

使用plus.navigator.closeSplashscreen()

官网文档地址 app-splashscreen

勾选“等待首页渲染完毕后再关闭Splash图”,表示需要等待首页渲染完成后再关闭启动界面

不勾选“等待首页渲染完毕后再关闭Splash图”,则表示首页加载完成后就会关闭启动界面,此时首页可能没有完成渲染,在部分设备可能会闪一下白屏,不推荐使用。

根据官网配置启动项后在onLaunch声明周期中配置

属性类型默认值描述
alwaysShowBeforeRenderBooleantrue是否等待首页渲染完毕后再关闭启动界面
autocloseBooleantrue是否自动关闭启动界面,仅当alwaysShowBeforeRender设置为false时生效,如果需要手动关闭启动界面,需将 alwaysShowBeforeRender 及 autoclose 均设置为 false
waitingBooleantrue是否在启动界面显示等待雪花

代码控制关闭启动界面 App启动后不会自动关闭启动界面,需要在代码中调用plus.navigator.closeSplashscreen关闭启动界面

源码视图

"app-plus" : {
    "splashscreen" : {
        "alwaysShowBeforeRender" : false,
        "autoclose" : false,
    }
}

 App.vue中

       const store = useMainStore()
       if(!store.token){
		   uni.reLaunch({
			   url:'/pages/login/login',
			   success:()=>{
				   plus.navigator.closeSplashscreen();
			   }
		   })
        }else{
			plus.navigator.closeSplashscreen();
		}

### 解决 UniApp 微信小程序 Token 登录时短暂显示登录页面问题 为了防止在用户已经登录的情况下仍然看到登录页面的短暂闪现现象,可以采取以下措施: #### 1. 使用缓存机制优化用户体验 当应用启动时,在 `onLaunch` 方法中立即检查本地存储中的 token 是否存在以及是否有效。如果 token 存在,则跳过登录页直接进入首页;反之则引导至登录界面。 ```javascript // App.vue 中 onLaunch 函数内实现逻辑判断 export default { onLaunch() { const hasToken = uni.getStorageSync('token'); if (hasToken) { // 验证 token 的有效性 verifyToken(hasToken).then((isValid) => { if (isValid) { // 如果 token 合法就重定向到主页或其他受保护路由 uni.reLaunch({ url: '/pages/index/index' }); } else { // 若不合法清除旧数据并重新加载 app 或者转到登录页 uni.removeStorage({ key: 'token' }); uni.redirectTo({ url: '/pages/login/login' }); } }).catch(() => { // 处理异常情况下的错误提示或操作 console.error("Failed to validate the token."); }); } else { // 当前无 token 则正常展示登录页面 uni.navigateTo({ url: '/pages/login/login' }); } function verifyToken(token){ return new Promise((resolve, reject)=>{ uni.request({ url: `${baseUrl}/verify`, method:'POST', data:{token}, success(res){ resolve(res.data.success); }, fail(err){ reject(err); } }) }) } } } ``` 此方法能够减少不必要的页面切换次数,从而降低视觉上出现空白或重复页面的可能性[^1]。 #### 2. 增加全局 loading 层遮罩 可以在整个应用程序之上添加一层透明度较高的灰色半透明层作为加载指示器,在每次发起网络请求特别是涉及身份验证的操作期间将其显示出来。一旦响应成功收到即刻隐藏该层,这样即使有瞬间的延迟也不会让用户察觉到底层发生了什么变化。 ```html <!-- 在 pages/json 文件夹下创建 globalLoading.json --> { "usingComponents": {}, "styleIsolation": "isolated" } <!-- 创建 components/GlobalLoading.wxml 组件用于渲染 Loading UI --> <view class="global-loading-mask" wx:if="{{show}}"> <image src="/static/images/loading.gif"></image> </view> /* 添加样式 */ .global-loading-mask { position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0, 0, 0, .5); z-index: 9998; /* 确保它覆盖其他所有元素 */ display: flex; justify-content: center; align-items: center; } ``` 接着修改原有的 API 请求函数来控制这个组件的状态: ```javascript function requestWithLoading(url,param={}){ showGlobalLoading(); // 显示全局loading return uni.request({ url, data:param, complete(){ hideGlobalLoading(); // 不管成功与否都关闭loading } }); } ``` 这种方法不仅解决了瞬态问题还提升了整体交互体验[^2]. #### 3. 调整页面初始化顺序 调整页面加载优先级,先让非敏感区域的内容尽快呈现给用户查看,而把那些依赖于服务器端反馈才能决定如何处理的部分推迟到最后才去执行。比如对于需要访问的应用来说,可以让公共部分先行展现,待确认用户限后再填充个性化信息。 通过上述三种方式之一或多样的组合运用,应该能有效地缓解甚至消除由于异步通信造成的短时间内的视图闪烁问题[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值