『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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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),可用于后…