uni-app小程序登錄后…

前情

最近新接了一個全新項目,是類似商城的小程序項目,我負責從0開始搭建小程序,我選用的技術棧是uni-app技術棧,其中就有一個用戶登錄功能,小程序部分頁面是需要登錄才可以查看的,對于未登錄的用戶需要引導用戶去登錄頁面,再back回來重新渲染當前頁面,以讓用戶正常使用

思考

問題也不復雜,就是判斷登錄狀態而已,需要登錄的頁面沒登錄就引導去登錄再回來,回來后再重新渲染頁面數據即可

這里有二個動作:一個是判斷登錄態,一個是重新渲染頁面數據,有動作就有觸發時機,對于判斷登錄態,我們是在跳轉前判斷,還是在跳轉進需要登錄的頁面再判斷,對于重新渲染數據當然是進入頁面的時候再重新渲染,但是怎么去實現重新渲染了,對于小程序我們第一時間想到的是通過生命鉤子來做,那當然就是onShow了

解決方案

基于上述的思考,我想到如下二種解決方案:

請添加圖片描述

應該能解決的方案應該有很多,這只是我在實現這個需求的時候想到的二種方案

場景方案1:跳轉進需要登錄的頁面再判斷是否是登錄態,同時登錄回來后通過onShow生命鉤子重新渲染頁面

此方案優點:就是判斷登錄態你不需要特定代碼去判斷,在服務端接口這一塊做下處理即可,如果返回狀態碼是401或者是你和服務端溝通好的錯誤碼時再引導去登錄頁,這樣全局做請求攔截就行,項目中我就是有做這一塊的處理,使用的是我封裝好的工具方法:常用工具方法 - DCloud 插件市場已分享到插件市場,歡迎使用

此方案的缺點:在未登錄的狀態下,用戶會看到明顯的頁面跳轉,跳轉到一個空白頁面,突然又跳轉到登錄頁,用戶體驗不是特別好,同時在onShow生命周期鉤子里做數據重新渲染會有一個問題,這樣會造成過多的網絡請求,如果用戶量不小的話會對于服務器造成一些壓力

場景方案2:跳轉進需要登錄的頁面前判斷登錄態,并記錄正在跳轉的頁面,登錄后重定向到前面已經記錄的跳轉頁面

此方案優點:避免了onShow頻繁觸發導致服務器渲染浪費的問題,缺點就是你需要在每一個跳轉需要登錄的頁面前做登錄態判斷,會導致代碼冗余工作量增加,后期維護不是特別好

方案選擇

我選擇的是場景方案2

二種方案都有優缺點,方案1有一點是用戶感受最直接的,就是閃跳的用戶體驗那一點,至于onShow會導致接口頻繁請求問題是有方法解決的,后面會提到;方案2只要想辦法解決代碼冗余的問題即可

方案實現細節

解決代碼冗余問題,我們使用uni-app的攔截api來做下路由攔截即可,根據跳轉的URL和當前登錄態判斷要不要先跳登錄頁做登錄,在main.js中增加路由攔截,關鍵代碼如下:

.../*** 需要登錄才能跳轉的頁面*/
const needLoginPages = ['/orders/detail/detail','/orders/orderList/orderList',...
]// 要攔截的路由方法
const interceptors = ['navigateTo', 'reLaunch', 'redirectTo']
const globalStoreInstance = globalStore(pinia);// 路由攔截
interceptors.forEach(interceptor => {uni.addInterceptor(interceptor, {invoke(e) {// 判斷當前頁面是否是要需要登錄才能跳轉的頁面里const needLogin = needLoginPages.findIndex(item => e.url.includes(item)) !== -1;if (needLogin && !storage.get(TOKEN)) {// 記錄要跳轉的頁面globalStoreInstance.setNeedLoginBackPage(e.url);uni.navigateTo({url: '/other/login/login'})return false}return true}})
})...

我在寫這篇博客的時候,我發現這里代碼其實有一個可優化點,你發現了嗎?歡迎留言👀討論

同時在登錄頁登錄成功后需要做一下跳轉邏輯,關鍵代碼如下:

...
// 解決登錄后跳轉的問題
if (globalStoreInstance.needLoginBackPage) {uni.redirectTo({url: globalStoreInstance.needLoginBackPage,complete: () => {globalStoreInstance.setNeedLoginBackPage('');}})
} else {// 解決登錄回去頁面數據丟失的問題const pages = getCurrentPages();if (pages.length >= 2) {// 獲取前一個頁面實例const prevPage = pages[pages.length - 2];// 調用前一個頁面的onLoad方法if (prevPage?.onLoad) {prevPage.onLoad(prevPage.options || {}); // 傳遞原始參數}}uni.navigateBack();
}...

看代碼除了跳轉還處理了back,這一段back邏輯也是我在實現的時候發現它可以解決方案1的onShow問題,也就是說方案1也就是只有一個體驗問題,所以二種方案我覺得都是可行的,同時我提供方案1接口攔截的代碼:

import { Request, storage } from '@/uni_modules/hbxw-utils/js_sdk/hbxw-utils.js';
import { BASE_URL } from '@/config/http';
import { TOKEN } from '@/config/common';const request = new Request({isLogin: true,
});request.baseUrl = BASE_URL;/*** 請求攔截,可以通過add方法添加多個* 參數為請求配置,可以對請求參數做一些特殊處理*/
request.requestIntercept.add((requestConfig) => {// 如果有傳就用傳的,沒有就去取,為了解決登錄默認tokenconsole.log('---- requestConfig ----:', requestConfig)if (!requestConfig.header) {requestConfig.header = {}}// 如果header中沒有Accept,則設置為application/jsonif (!requestConfig.header?.Accept) {requestConfig.header.Accept = 'application/json';}if (!requestConfig.header?.Authorization) {let Authorization = ''try {Authorization  = storage.get(TOKEN) || '';} catch (err) {console.log(err)}// 添加Authorization到header中用于服務端登錄判斷if (Authorization) {if (!requestConfig.header) {requestConfig.header = {}}requestConfig.header.Authorization = Authorization;}}// 如果返回true則請求會中斷// return true;
});/*** 響應攔截,可以通過add方法添加多個* 第一個參數為請求響應體* 第二個參數為請求配置信息*/
request.responIntercept.add((response, requestConfig) => {console.log('---- response ----:', response)// 如果接狀態碼為401,而且當前接口是需要判斷登錄狀態的if (response.statusCode == 401 && requestConfig.isLogin) {uni.navigateTo({url: '/other/login/login'})// 返回true 中斷后面處理return true;}// 通用錯誤處理if (response.statusCode !== 200 || response.data.code !== 200) {uni.showToast({title: response.data.message || '請求失敗,請稍后再試',icon: 'none'})return true;}
});export default request;

期望

解決問題的方法千千萬,上述是我是解決登錄跳轉邏輯的處理方案,如果在上面二種方案中,你會選擇哪一種了?聰明的你也一定有別的更好的方案,期待你的分享和留言👀,共同進步。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83559.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83559.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通識:計算機網絡基礎知識

目錄 計算機網絡的基本組成 計算機網絡的主要分類 計算機網絡的功能 計算機網絡的關鍵技術 IP地址簡介 IP地址的版本 IP地址的分類 公有與私有IP地址 ?編輯 子網掩碼 計算機網絡基礎 IPv4與IPv6對比分析 IP地址分類簡化版 公有與私有IP地址 計算機網絡是指將地理…

三層固定實體架構:高效實現圖上的檢索增強生成(RAG)

知識圖譜正在成為跨各個領域組織和檢索信息的強大工具。它們越來越多地與機器學習和自然語言處理技術相結合,以增強信息檢索和推理能力。在本文中,我介紹了一種用于構建知識圖譜的三層架構,結合了固定本體實體、文檔片段和提取的命名實體。通過利用嵌入和余弦相似度,這種方…

ArcGIS Pro地塊圖斑順序編號(手繪線順序快速編號)-004

ArcGIS全系列實戰視頻教程——9個單一課程組合系列直播回放_arcgis初學者使用視頻-CSDN博客 4大遙感軟件!遙感影像解譯!ArcGISENVIErdaseCognition_遙感解譯軟件-CSDN博客 今天介紹一下在ArcGIS Pro地塊圖斑順序編號(手繪線順序快速編號&am…

Vue百日學習計劃Day21-23天詳細計劃-Gemini版

總目標: 在 Day 21-23 完成 Vue.js 的介紹學習、環境搭建,并成功運行第一個 Vue 3 項目,理解其基本結構。 Day 21: Vue.js 介紹與概念理解 (~3 小時) 本日目標: 理解 Vue.js 是什么、漸進式框架的概念以及選擇 Vue 的原因。初步了解 Vite 是什么及其作用…

uniapp-商城-60-后臺 新增商品(屬性的選中和頁面顯示,數組join 的使用)

前面添加了屬性,添加屬性的子級項目。也分析了如何回顯,但是在添加新的商品的時,我們也同樣需要進行選擇,還要能正常的顯示在界面上。下面對頁面的顯示進行分析。 1、界面情況回顧 屬性顯示其實是個一嵌套的數據顯示。 2、選中的…

Vue框架

Vue 概況: Vue是一款用于構建用戶界面的漸進式的JavaScript框架。(官方;https:://cn.vuejs.org/) 框架:就是一套完整的項目解決方案,用于快速構建項目。 優點:大大提升前端項目的開發效率。 缺點:需要理解記憶框架的使用規則。&#xff…

解讀RTOS 第七篇 · 驅動框架與中間件集成

1. 引言 在面向生產環境的 RTOS 系統中,硬件驅動框架與中間件層是連接底層外設與上層應用的橋梁。一個模塊化、可擴展的驅動框架能夠簡化外設管理,提升代碼可維護性;而豐富的中間件生態則為網絡通信、文件系統、圖形界面、安全加密等功能提供開箱即用的支持。本章將從驅動模…

JavaScript防抖與節流全解析

文章目錄 前言:為什么需要防抖和節流基本概念與區別防抖(Debounce)節流(Throttle)關鍵區別防抖(Debounce)詳解1. 基本防抖函數實現2. 防抖函數的使用3. 防抖函數的工作流程4. 防抖函數進階 - 立即執行選項節流(Throttle)詳解1. 基本節流函數實現時間戳法(第一次會立即執行)定…

JavaScript入門【3】面向對象

1.對象: 1.概述: 在js中除了5中基本類型之外,剩下得都是對象Object類型(引用類型),他們的頂級父類是Object;2.形式: 在js中,對象類型的格式為key-value形式,key表示屬性,value表示屬性的值3.創建對象的方式: 方式1:通過new關鍵字創建(不常用) let person new Object();// 添…

oracle主備切換參考

主備正常切換操作參考:RAC兩節點->單機 (rac和單機的操作區別:就是關閉其它節點,剩一個節點操作即可) 1.主庫準備 檢查狀態 SQL> select inst_id,database_role,OPEN_MODE from gv$database; INST_ID DATA…

端到端自動駕駛系統實戰指南:從Comma.ai架構到PyTorch部署

引言:端到端自動駕駛的技術革命 在自動駕駛技術演進歷程中,端到端(End-to-End)架構正引領新一輪技術革命。不同于傳統分模塊處理感知、規劃、控制的方案,端到端系統通過深度神經網絡直接建立傳感器原始數據到車輛控制…

使用 Kotlin 和 Jetpack Compose 開發 Wear OS 應用的完整指南

環境配置與項目搭建 1. Gradle 依賴配置 // build.gradle (Module) android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3"} }dependencies {def wear_compose_version "1.2.0"implementation "androidx.…

應用層協議簡介:以 HTTP 和 MQTT 為例

文章目錄 應用層協議簡介:什么是應用層協議?為什么需要應用層協議?什么是應用層協議?為什么需要應用層協議? HTTP 協議詳解HTTP 協議特點HTTP 工作的基本原理HTTP 請求與響應示例為什么 Web 應用基于 HTTP 請求&#x…

Kafka快速安裝與使用

引言 這篇文章是一篇Ubuntu(Linux)環境下的Kafka安裝與使用教程,通過本文,你可以非常快速搭建一個kafka的小單元進行日常開發與調測。 安裝步驟 下載與解壓安裝 首先我們需要下載一下Kafka,這里筆者采用wget指令: wget https:…

PD 分離推理的加速大招,百度智能云網絡基礎設施和通信組件的優化實踐

為了適應 PD 分離式推理部署架構,百度智能云從物理網絡層面的「4us 端到端低時延」HPN 集群建設,到網絡流量層面的設備配置和管理,再到通信組件和算子層面的優化,顯著提升了上層推理服務的整體性能。 百度智能云在大規模 PD 分離…

flutter Stream 有哪兩種訂閱模式。

Flutter 中的 Stream 有兩種訂閱模式: ?單訂閱模式 (Single Subscription)?? 只能有一個訂閱者(listen 只能調用一次),后續調用會拋出異常。數據僅在訂閱后開始傳遞,適用于點對點通信場景(如文件讀取流…

Python爬蟲實戰:研究JavaScript 環境補全逆向解密

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,大量有價值的數據被發布在各種網站上。然而,為了保護數據安全和商業利益,許多網站采用了 JavaScript 加密技術對敏感數據進行保護。這些加密技術使得傳統的爬蟲技術難以直接獲取和解析數據,給數據采集工作帶來了巨大挑戰…

[system-design] ByteByteGo_Note Summary

目錄 通信協議 REST API 與 GraphQL gRPC 如何工作? 什么是Webhook? 如何提高應用程序接口的性能? HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0 -> HTTP 3.0 (QUIC) SOAP vs REST vs GraphQL vs RPC 代碼優先與應用程序接口優先 HTT…

Linux中的進程

進程控制 fork 函數 fork 函數從已存在的進程中創建新的進程,已存在進程為父進程,新創建進程為子進程 fork 的常規用法 一個父進程希望復制自己,使父子進程同時執行不同的代碼段。例如,父進程等待客戶端請求,生成子…

EDR與XDR如何選擇適合您的網絡安全解決方案

1. 什么是EDR? 端點檢測與響應(EDR) 專注于保護端點設備(如電腦、服務器、移動設備)。通過在端點安裝代理軟件,EDR實時監控設備活動,檢測威脅并快速響應。 EDR核心功能 實時監控:…