『uniapp』onThemeChange監聽主題樣式,動態主題不正確生效,樣式被覆蓋的坑

目錄

    • 問題示例代碼
    • 解決思路1(缺點影響顯示效果有延遲)
    • 解決思路2——通過路由刷新頁面(缺點只適用于部分網頁)
    • 解決思路3——vuex(沒學會~)
    • 總結


歡迎關注 『uniapp』 專欄,持續更新中
歡迎關注 『uniapp』 專欄,持續更新中

問題示例代碼

我這個業務場景是在跟隨系統主題(深色/淺色模式)的情況下 用戶在設置中修改了主題后app自動適應主題。

開啟了主題監聽

			uni.onThemeChange(({theme}) => {console.log('onThemeChange', theme)uni.setStorageSync('sys_theme', theme)if (uni.getStorageSync('theme_isAuto')) {uni.setStorageSync('theme_mode', theme)}})

在onshow中根據讀取的主題設置顏色樣式

				this.theme_mode = uni.getStorageSync('theme_mode')//設置頂部導航背景顏色this.navbarBackground = {background: this.theme_mode === 'dark' ? this.themeConfig.dark.navBgColor : this.themeConfig.light.navBgColor};//頂部導航字體顏色this.navTxtStyle = this.theme_mode === 'dark' ? this.themeConfig.dark.navTxtStyle : this.themeConfig.light.navTxtStyle;console.log('ok', this.theme)

排查了半天bug最后發現輸出日志的結果

'ok', this.theme
'theme_mode', theme

也就是我們的onshow都執行完畢了,onThemeChange才姍姍來遲,當然無法成功渲染頁面。


解決思路1(缺點影響顯示效果有延遲)

延遲執行,雖然很low,但是一步到位。(我最后才想到這個辦法~)最關鍵的是之前試了沒有成功,一直以為不可行,后來發現是因為沒有把this.theme_mode = uni.getStorageSync('theme_mode')放到setTimeout里面。

			setTimeout(() => {this.theme_mode = uni.getStorageSync('theme_mode')//設置頂部導航背景顏色this.navbarBackground = {background: this.theme_mode === 'dark' ? this.themeConfig.dark.navBgColor : this.themeConfig.light.navBgColor};//頂部導航字體顏色this.navTxtStyle = this.theme_mode === 'dark' ? this.themeConfig.dark.navTxtStyle : this.themeConfig.light.navTxtStyle;}, 100);

解決思路2——通過路由刷新頁面(缺點只適用于部分網頁)

本質是用uni.reLaunch 頁面跳轉,而且會導致你無法跳轉回原來的網頁

在app.vue的onLaunch中

  onLaunch() {uni.onThemeChange(({ theme }) => {console.log('onThemeChange', theme);// 觸發路由刷新this.refreshPageRoute();});},

在app.vue的methods中

// 觸發路由刷新的方法
refreshPageRoute() {// 獲取當前頁面路由路徑const pages = getCurrentPages();const currentPage = pages[pages.length - 1];const route = currentPage.route;console.log(`/${route}`); // 注意使用反引號(`)來實現字符串插值// 使用 uni.reLaunch 方法刷新當前頁面uni.reLaunch({url: `/${route}`});
} 

解決思路3——vuex(沒學會~)

使用 Vuex 管理狀態: 如果你的應用使用了 Vuex 來管理全局狀態,你可以在主題變化時更新一個全局狀態,然后在需要更新的頁面中監聽這個狀態的變化,在變化時手動調用 onShow 方法。


總結

大家喜歡的話,給個👍,點個關注!給大家分享更多計算機專業學生的求學之路!

版權聲明:

發現你走遠了@mzh原創作品,轉載必須標注原文鏈接

Copyright 2024 mzh

Crated:2024-4-1

歡迎關注 『uniapp』 專欄,持續更新中
歡迎關注 『uniapp』 專欄,持續更新中
『未完待續』


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

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

相關文章

LeetCode 高頻 SQL 50 題(基礎版)【題解】合集

點擊下方標題可跳轉至對應部分: LeetCode 高頻 SQL 50 題(基礎版)之 【查詢】部分 LeetCode 高頻 SQL 50 題(基礎版)之 【連接】部分 上 LeetCode 高頻 SQL 50 題(基礎版)之 【連接】部分 下…

Jenkins 全面深入學習目錄

Jenkins 全面深入學習目錄 第一部分:Jenkins 基礎入門 Jenkins 概述 持續集成/持續交付(CI/CD)概念Jenkins 的歷史與發展Jenkins 與其他 CI/CD 工具的比較 Jenkins 安裝與配置 系統要求與環境準備不同操作系統下的安裝方法初始配置與安全設置插件管理系統 Jenkins…

安裝laravel11和laravel12的一些報錯問題解決

前言 今天在安裝laravel的過程中遇到一些報錯問題,記錄一下。 laravel 12 Root composer.json requires laravel/tinker ^2.10.1, found laravel/tinker[2.x-dev] but it does not match your minimum-stability laravel/framework[v12.0.0, ..., v12.15.0] requ…

Oracle21cR3之客戶端安裝錯誤及處理方法

文章目錄 Oracle21cR3客戶端安裝1. 下載2. 安裝解壓到指定位置,如下:2. 安裝 3. 常見錯誤1. 無法將 JINSHENGYUAN\jinshengyuan 安裝用戶添加到 %2% 組。1. 問題原因分析2. 處理方法 Oracle21cR3客戶端安裝 1. 下載 官網下載 2. 安裝 解壓到指定位置…

web3 資訊網址

1. 新聞 幣圈導航| 區塊鏈導航| WEB3導航 | 聚合幣圈交易所、行情工具、空投資訊、DeFi入口及行業動態,一站式區塊鏈資源門戶網站 2.github位置 https://github.com/itgoyo/awesome-crypto

【C++】簡單商品價格計算程序練習

相信你是最棒噠!!! 文章目錄 一、題目代碼 二、題目解析 1.解析版 2.簡潔版 總結 一、題目代碼 構建一個類book,其中含有兩個私有數據成員qu和price,將price初始化為qu的10倍,建立一個有5個元素的數組對象,將qu初始化為6~10。要求通過對象指針訪問對象數組,按相反的順序…

現代數據工程實踐:基于Dagster的ETL架構設計與實現

在當今數據驅動的世界中,有效的數據處理流程至關重要。本文將帶您通過一個完整的教程,學習如何使用Dagster構建一個功能強大的ETL(提取、轉換、加載)管道。無論您是數據工程師、分析師還是對數據流水線感興趣的技術愛好者,本教程都將為您提供…

golang-linux環境配置

下載源碼包 :All releases - The Go Programming Language 解壓文件 sudo tar -zxvf go1.24.4.linux-amd64.tar.gz -C /usr/local/ 配置環境 vim ~/.bashrc 在配置文件最后加上下面三行: # 設置GO語言的路徑 export GOROOT/usr/local/go # 當前go…

【模擬 貪心】B4207 [常州市賽 2021] 戰士|普及+

B4207 [常州市賽 2021] 戰士 題目背景 搬運自 http://czoj.com.cn/p/443。數據為民間數據。 題目描述 小 X \text X X 在玩一款操控戰士和怪物戰斗的游戲。戰士初始生命值為 iH \text{iH} iH 、初始攻擊力為 iA \text{iA} iA 。怪物只有一個,初始生命值為 H…

37-Oracle 23 ai Shrink Tablespace(一鍵收縮表空間)

小伙伴們有沒有經歷過,超大表和超大數據的導入后,數據被刪除了,然而空間遲遲不釋放,存儲添置又跟不上,業務空間告警的時候。收縮就很必須了,然而收縮需謹慎,數據大過天。DBMS_SPACE.SHRINK_TABL…

我自己動手寫了一個MySQL自動化備份腳本,基于docker

MySQL自動化備份Docker方案 該方案僅需通過 Docker Compose 就能輕松完成部署。你可以自由配置數據庫連接信息,無論是遠程數據庫,還是本地數據庫,都能實現無縫對接。在備份頻率設置上,支持按固定秒數間隔執行備份任務&#xff0c…

leetcode23-合并K個升序鏈表

leetcode 23 思路 遍歷所有鏈表收集節點:將每個鏈表的節點斷開其 next 指針后存入數組對數組進行排序:使用 JavaScript 的內置 sort 方法對節點數組按值排序重新連接排序后的節點:遍歷排序后的數組,依次連接每個節點形成新鏈表…

(十六)GRU 與 LSTM 的門控奧秘:長期依賴捕捉中的遺忘 - 更新機制對比

1 長期依賴捕捉能力的核心差異 1.1 信息傳遞路徑:細胞狀態 vs 單一隱藏狀態 LSTM的“信息高速公路”機制 LSTM通過獨立的細胞狀態(Cell State) 傳遞長期信息,該狀態可視為“直接通路”,允許信息跨越多個時間步而不被中…

HTTP 請求報文 方法

在 HTTP 請求報文 中,方法(Method) 是用來說明客戶端希望對服務器資源執行的操作。它出現在 HTTP 報文的第一行,稱為 請求行,格式如下: METHOD Request-URI HTTP-Version例如: GET /index.h…

【深度解析】Java高級并發模式與實踐:從ThreadLocal到無鎖編程,全面避坑指南!

🔍 一、ThreadLocal:線程隔離的利器與內存泄露陷阱 底層原理揭秘: 每個線程內部維護ThreadLocalMap,Key為弱引用的ThreadLocal對象,Value為存儲的值。這種設計導致了經典內存泄露場景: // 典型應用&#…

使用存儲型 XSS 竊取 cookie 并發送到你控制的服務器

🧪 第一步:準備監聽服務接收 cookie 在你的本機(非容器)或 DVWA 所在主機運行以下 Python 監聽代碼,用于接收竊取的 cookie: 啟動 HTTP 接收服務 # 在本機終端運行,監聽 8081 端口&#xff0…

WebDebugX和多工具組合的移動端調試流程構建:一個混合App項目的實踐案例

前段時間參與了一個跨平臺的醫療服務 App 項目,整體架構采用 Flutter 封裝原生模塊,部分功能模塊嵌套 WebView 加載 H5 頁面。開發過程中我們頻繁遇到 Web 頁面在移動端表現異常的問題,比如樣式錯亂、請求失敗、性能延遲等,而這些…

圖形編輯器基于Paper.js教程29:基于圖層的所有矢量圖元的填充規則實現

背景 在lightburn中,對于填充圖層,有這樣一個隱藏的邏輯,那就是,在加工時,填充規則是以填充圖層的所有元素進行計算的,什么意思那? 如果你在填充圖層中畫了兩個圖形,一個圓&#xf…

Python 函數實戰指南:提升編程效率的實用技巧

在 Python 編程的世界里,函數是構建高效代碼的基石。掌握實用的函數技巧不僅能讓代碼更加簡潔優雅,還能顯著提升開發效率。我們一起將結合實際案例,深入剖析 Python 函數的使用技巧,幫助開發者在日常開發中事半功倍。 一、基礎函數…

OPenCV CUDA模塊圖形變換----構建透視變換映射表函數buildWarpPerspectiveMaps()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 該函數用于構建一個透視變換(Perspective Transform)的映射表(xmap / ymap),可用于后…