uniapp主题切换功能的第二种实现方式(scss变量+require)

news2025/1/20 4:35:10

在上一篇 “uniapp主题切换功能的第一种实现方式(scss变量+vuex)” 中介绍了第一种如何切换主题,但我们总结出一些不好的地方,例如扩展性不强,维护起来也困难等等,那么接下我再给大家介绍另外一种切换主题的方法“scss变量+require”的方式

在介绍如何使用前,先看下最后的效果,以便大家能更好的理解,下面是效果图:

除了图上的这个页面切换了外,整体项目都有主题色的切换,具体效果可扫码自行查看。

接下来详细介绍下第二种实现方式

实现原理

定义两套主题色(多套再自己加)theme-dark.scss、theme-light.scss,每套主题色维护着自己的颜色,通过require动态引入scss的形式引入当前主题,从而达到切换主题的目的

第一步:创建不同主题色

创建白天与夜晚模式

创建白天模式

common/theme/theme-dark.scss

/* 切换主题主要切换的是  整体背景色、区块背景色、文字颜色等 */

// 页面主题
.theme-page{
	background-color: #333 !important;
	// 文字颜色
	.theme-color{
		color: #FFF !important;
	}
	// 区块主题色
	.theme-block{
		background-color: #FFFFFF !important;
		.theme-color{
			color: #000 !important;
		}
	}
}

// 如果想单独给个人中心设置一个主题色
.theme-user-page{
	background-color: #1a1a1a !important;
	// 文字颜色
	.theme-color{
		color: #FFF !important;
	}
	// 区块主题色
	.theme-block{
		background-color: #FFFFFF !important;
		.theme-color{
			color: #000 !important;
		}
	}
}

创建夜间模式

common/theme/theme-light.scss

/* 切换主题主要切换的是  整体背景色、区块背景色、文字颜色等 */

// 页面主题
.theme-page{
	background-color: #FFF !important;
	// 文字颜色
	.theme-color{
		color: #333 !important;
	}
	// 区块主题色
	.theme-block{
		background-color: #999 !important;
		.theme-color{
			color: #333 !important;
		}
	}
}

// 如果想单独给个人中心设置一个主题色
.theme-user-page{
	background-color: #F2F2F2;
	// 文字颜色
	.theme-color{
		color: #666 !important;
	}
	// 区块主题色
	.theme-block{
		background-color: #999 !important;
		.theme-color{
			color: #000 !important;
		}
	}
}

东西多了的情况,例如有5套主题色,分开不是很好维护,所以

可以考虑把颜色值独立出去

改进:独立主题色

定义_theme.scss

$themes: (
	// 白天模式
    light:(
        page: (
            background-color: #fff,
            color: (
                color: #333,
            ),
            block: (
                background-color: #333,
                color: (
                    color: #fff,
                ),
            ),
        ),
        user-page: (
            background-color: #f2f2f2,
            color: (
                color: #666,
            ),
            block: (
                background-color: #999,
                color: (
                    color: #000,
                ),
            ),
        ),
    ),
	// 夜间模式
    dark:(
        page: (
            background-color: #333,
            color: (
                color: #fff,
            ),
            block: (
                background-color: #fff,
                color: (
                    color: #000,
                ),
            ),
        ),
        user-page: (
            background-color: #1a1a1a,
            color: (
                color: #fff,
            ),
            block: (
                background-color: #FFFFFF,
                color: (
                    color: #000,
                ),
            ),
        ),
    )
);

第二步:处理主题色

通过混入生成不同主题样式,代码如下

@mixin map-to-class($map, $divider: "-", $select: ".theme", $isRoot: false, $root-select: ".theme") {
    $select: if($select== "" and &, &, $select);
    @each $k, $v in $map {
        $currSelect: if($isRoot, #{$root-select}#{$divider}#{$k}, #{$select}#{$divider}#{$k});
        #{$currSelect} {
            @if type-of($v) ==map {
                @include map-to-class($v, $divider, "", true) {
                    @content;
                }
            } @else {
                @at-root #{$select} {
                    #{$k}: $v !important;
                }
            }
        }
    }
}

@each $key, $mode in $themes {
    @if $key== "light" {
        @include map-to-class($mode);
    }
}
// 或
@each $key, $mode in $themes {
    @if $key== "dark" {
        @include map-to-class($mode);
    }
}

大家可以用sass编辑器看一下最终的样式是什么样的

第三步:App.vue动态引入

在App.vue里面通过require动态引入主题,当前每次切换主题的时候要把当前主题数据进行保存。

onLaunch: function() {
    let theme = uni.getStorageSync('theme') || 'light';
    // import `@/common/theme/theme-${mode}.scss`;  //记住不能import哦
    require(`@/common/theme/theme-${theme}.scss`);
},
// ......

这样就实现了动态引入

以后只须要维护_theme.scss即可

最后测试

测试代码:

<template>
	<view class="tpf-page theme-page">
		<text class="theme-color">订单</text>
		<view class="theme-block block flex flex-align-center flex-pack-center">
			<text class="theme-color">板块里面的文本</text>	
		</view>
		<view class="flex flex-align-center flex-pack-justify change-theme">
			<text class="button" @tap="changeTheme('light')">白天模式</text>
			<text class="button dark" @tap="changeTheme('dark')">夜间模式</text>
		</view>	
	</view>
</template>

<script>
export default{
	data(){
		return {
			
		}
	},
	methods:{
		changeTheme(mode){
			uni.setStorageSync('theme',mode);
			setTimeout(()=>{
				location.reload();
			},200);
		}
	},
	onReady() {
		let theme = uni.getStorageSync('theme') || 'dark';
		if(theme == 'dark'){
			// 动态设置导航条颜色
			uni.setNavigationBarColor({
				frontColor:'#ffffff',
				backgroundColor:'#333333'
			});
			
			// 动态设置tabbar样式
			uni.setTabBarStyle({
				backgroundColor:'#333333',
				color: '#FFF',
				selectedColor: '#0BB640',
				borderStyle: 'white'
			});
		}else{
			// 动态设置导航条颜色
			uni.setNavigationBarColor({
				frontColor:'#000000',
				backgroundColor:'#FFFFFF'
			});
			
			// 动态设置tabbar样式
			uni.setTabBarStyle({
				backgroundColor:'#FFFFFF',
				color: '#333',
				selectedColor: '#0BB640',
				borderStyle: 'black'
			});
		}
	}
}
</script>

<style lang="scss" scoped>
.block{
	width: 710rpx;
	height: 300rpx;
	margin: 20rpx 0;
}
.change-theme{
	width: 400rpx;
}
.button{
	background-color:#FFF;
	color: #000;
	padding: 20rpx;
}
.dark{
		background-color: #000;
		color: #FFF;
}
</style>

在这里导航栏与tabbar都是通过手动设置的,因为必须是js操作,所以样式不能去读css,为了方便,我们也可以定义一个theme.js专门来维护导航栏与tabar样式

补充theme.js

theme.js定义主题案例代码:

const themes = {
	light:{
		navBar:{
			bgColor:'#000',
			color:'#FFF'
		},
		tabBar:{
			bgColor:'#000',
			color:'#FFF',
			borderStyle:'black'
		}	
	},
	dark:{
		navBar:{
			bgColor:'#FFF',
			color:'#000'
		},
		tabBar:{
			bgColor:'#f2f2f2',
			color:'#333',
			borderStyle:'white'
		}
	}
}

let mode = 'dark'

export default themes[mode];

页面就可以通过引入这个js,通过当前主题引入相关的配置即可。这样方便统一维护与管理 。

最后总结

scss变量+require的方式明显比第一种要好,减少了页面与主题的耦合度,维护起来也方便

但出于一些性能上的问题(官方回答),在某些平台或版本已经取消了require动态引入样式的功能,因此这个是有兼容问题的。

这就是我给大家介绍的第二种unippa主题切换的方式,有问题欢迎大家留言交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聊聊那些奇葩的代码规范 —— 滥用静态导入

因为有些要求感觉实是太过奇葩&#xff0c;收集下来娱乐下大家。 代码规范要求 要求如果代码可以静态导入的话&#xff0c;就必须要静态导入。 所有的代码如果不静态导入&#xff0c;就直接 PR 拒绝合并。 举例&#xff1a;equalsAnyIgnoreCase("test","tes…

总结894

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲遍&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff0…

chatgpt赋能python:Python怎么Import自己写的SEO文章

Python怎么Import自己写的SEO文章 如果你是一位Python开发人员&#xff0c;并且正在为SEO优化而努力编写文章&#xff0c;那么你可能会想知道如何将自己编写的SEO文章导入您的程序中以便更好的利用。 在这篇文章中&#xff0c;我们将介绍如何使用Python中的import语句将自己编…

UNIX网络编程卷一 学习笔记 第十九章 密钥管理套接字

随着IP安全体系结构&#xff08;IPsec&#xff09;的引入&#xff0c;密钥加密和认证密钥的管理越来越需要一套标准机制。RFC 2367介绍了一个通用密钥管理API&#xff0c;可用于IPsec和其他网络安全服务&#xff0c;该API创建了一个新协议族&#xff0c;即PF_KEY域&#xff0c;…

chatgpt赋能python:Python一行输入三个数:方便快捷,还能提高效率!

Python一行输入三个数&#xff1a;方便快捷&#xff0c;还能提高效率&#xff01; Python是一门非常流行的编程语言&#xff0c;不仅仅因为它简单易用&#xff0c;更因为它拥有丰富的生态系统和强大的库支持。但是&#xff0c;Python的输入方式却是许多人常常感到头疼的部分。…

学会使用“条件断点“来解放你的鼠标

&#xff08;PS&#xff1a;对调试较为熟悉却没有使用过条件断点的同学可以直接翻到文章底部看操作的GIF图~&#xff09; 一、背景 "Debug"想必大家在开发的过程中也是有经常使用的&#xff0c;这里简单的介绍一下浏览器"Debug"其中的两种方式。&#xff…

使用idea创建java web项目

创建web项目有很多方法&#xff0c;就说一个最简单的方法吧。 创建一个java项目&#xff0c;点击创建右击项目选择添加框架支持。勾选上web应用程序&#xff0c;点击确定。 再点击当前文件&#xff0c;编辑配置 点击加号&#xff0c;选择Tomcat服务器&#xff08;本地&#xf…

【连续介质力学】变形梯度

变形梯度 简介 本节讨论两个不同质点P和Q的之间的相对运动变化 拉伸比和相对伸长 d X ⃗ d\vec X dX : 在参考构形连接质点P和Q的向量&#xff0c;线单元 M ^ \hat M M^: d X ⃗ d\vec X dX 方向的单位向量 d x ⃗ d\vec x dx : 在当前构形连接质点P’和Q‘的向量&#xff…

对象存储分布式代理-go初学者的开源练手项目

最近写了一个go语言练手项目osproxy和osproxy-grpc&#xff0c;代码已完全开源到github。 相信不少接触go语言的读者&#xff0c;都是被它"极简协程"&#xff0c;“高并发”&#xff0c;"高性能"的特性所吸引&#xff0c;我也不例外&#xff0c;想着学完之…

基于MATLAB涡度通量数据处理技术应用

点击查看原文 本文基于MATLAB语言、以实践案例为主&#xff0c;提供代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例&#xff1a;基于MATLAB开展上机操作 2、涡度通量观测基本概况&#xff1a;观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1…

第3章 需求分析(上)

第3章 需求分析&#xff08;上&#xff09; 3.1 需求分析任务 3.1.1 确定对系统的综合要求 1. 功能需求 通过需求分析应该划分出必须完成的所有功能。 2. 性能需求 性能需求指定系统必须满足的定时约束或容量约束 3. 可靠性和可用性需求 可靠性需求定量地指定系统的可靠…

二叉树的最近公共祖先LCA

一、什么是最近公共祖先 LCA为最近公共祖先&#xff08;Lowest Common Ancestor&#xff09;的缩写。 对于一棵有根树T的两个节点u,v,最近公共祖先LCA(T,u,v)代表一个节点x。 LCA(5,6) 2 LCA(7,12) 3 LCA(2,1)1 二、公共祖先的朴素解法 两个节点先调整到相同的深度每一次…

Qt6使用cmake创建项目

目录 创建普通项目 创建qt项目 创建具有资源文件的qt项目 在QT6中&#xff0c;官方推荐在新的项目中使用CMake。 在Qt Creator中使用CMake构建系统时&#xff0c;与往常的qmake有一些不一样&#xff0c;因此写一篇文章来记录一下。 创建普通项目 我们先写一个最简单的项目…

chatgpt赋能python:Python的Unicode编码介绍

Python的Unicode编码介绍 什么是Unicode Unicode是一个字符集&#xff0c;它定义了世界上几乎所有的字符&#xff0c;包括字母、数字、符号和标点。Unicode使用唯一的数字编码来表示每个字符&#xff0c;这使得在不同的操作系统和编程语言中展示和处理字符非常方便。在Python…

chatgpt赋能python:Python怎样完成更新?

Python怎样完成更新&#xff1f; Python是一种非常流行的编程语言&#xff0c;由于它的简单易学和广泛的应用领域&#xff0c;许多程序员选择使用Python编写程序。但是&#xff0c;随着时间的推移和技术的不停发展&#xff0c;Python需要不断更新以保持全球开发者的使用体验。…

ES 如何重建索引

场景&#xff1a; ES索引中&#xff0c;为了效率和存储空间&#xff0c;有些字段可以设定为不被索引&#xff0c;然后某一天又需要改成能索引&#xff0c;此时就需要对ES进行重建索引&#xff0c;操作如下 1、修改 ES 索引模板文件 cd /data/elk/logstash/es-template/ vim e…

JavaSE笔记(七)

Java反射和注解 **注意&#xff1a;**本章节涉及到JVM相关底层原理&#xff0c;难度会有一些大。 反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类所有的属性和方法&#xff0c;对于任意一个对象…

几十款游戏的简单分析

文章目录 一、 介绍二、 影响游戏体验的因素三、 游戏能爆火的因素1.影响游戏爆火因素的排名2.玩游戏的两种经典心理3.经典案例分析Qq农场植物大战僵尸水果忍者召唤神龙羊了个羊 4.游戏公司可借鉴的经验5.未来游戏面对的诸多挑战 四、 几十款游戏的多方面分析FC红白游戏机十二人…

chatgpt赋能python:Python中的import使用详解

Python中的import使用详解 介绍 在Python中&#xff0c;import是将一个模块引入到当前脚本中使用的关键字。Python中的模块是指一个包含所有定义、函数和变量等的Python文件&#xff0c;也可以包含其他模块&#xff0c;从而构成一个Python程序。在Python中&#xff0c;有很多…

spark相关理论

系列文章目录 ubuntu虚拟机下搭建zookeeper集群&#xff0c;安装jdk压缩包&#xff0c;搭建Hadoop集群与spark集群的搭建【上篇】_ubuntu搭建zookeeper集群 ubuntu虚拟机下搭建zookeeper集群&#xff0c;安装jdk压缩包&#xff0c;搭建Hadoop集群与spark集群的搭建【下篇】 …