uniapp实现主题切换功能实现第一种方式(scss变量+vuex)

news2025/1/19 23:13:06

随着用户端体验的不断提升,很多应用在上线的时候都要求做不同的主题,最基本的就是白天与夜间主题。

就像b站app主题切换,像这样的

uniapp因为能轻松实现多端发布而得到很多开发者的青睐,但每个端的实现也有可能不同,现我把已实现的功能一点点的大家分享给大家,须要的可以参考一下,可扫码看效果。

那么用uniapp如何实现多主题切换呢?

第一种实现方式:CSS变量 + Vuex

第一步:创建store\index.js

创建store,用来保存不同的变量

import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)
 
const store = new Vuex.Store({
	state: {
        // 写上默认皮肤的数据
		skin: `
			--nav-bg:#42b983;
			--nav-color:#ffffff;
		`
	},
	getters: {
 
	},
	mutations: {
		// 皮肤更换
		skinPeeler(state,skin = []){
			// 将皮肤配置JSON转为以 ; 分割的字符串(style 值)
			let style = skin.map((item,index)=>{
				return `${item.name}:${item.value}`
			}).join(";");
			state.skin = style;
		}
	}
})
 
export default store

第二步:main.js中引入store

import Vue from 'vue'
import App from './App'

// 引用 Vuex 文件
import store from './store'

Vue.config.productionTip = false

App.mpType = 'app'

const app = new Vue({
	// 使用 Vuex
	store,
    ...App,
})
app.$mount()

第三步:页面使用

利用css变量来更新皮肤

<template>
	<view :style="skin">
		<view class="nav-bar">换肤示例</view>
		<view style="padding: 100rpx;">
			<button type="default" hover-class="none" class="btn">按钮 - 页面中的元素</button>
		</view>
		<view class="card">
			<view style="padding-bottom: 20rpx;">请选择皮肤风格</view>
			<radio-group @change="radioChange">
				<label class="h-flex-x list-item" v-for="(item, index) in items" :key="index">
					<view>
						<radio :value="index.toString()" :checked="index === current" />
					</view>
					<view style="padding-left: 30rpx;">{{item.name}}</view>
				</label>
			</radio-group>
		</view>
	</view>
</template>
 
<script>
	export default {
		data() {
			return {
				items: [
					{
						value: [
							{name:'--nav-bg',value:'#42b983'},
							{name:'--nav-color',value:'#ffffff'}
						],
						name: '默认'
					},
					{
						value: [
							{name:'--nav-bg',value:'#12b7f5'},
							{name:'--nav-color',value:'#333'}
						],
						name: '手机QQ'
					},
					{
						value: [
							{name:'--nav-bg',value:'#ff5500'},
							{name:'--nav-color',value:'#F0E0DC'}
						],
						name: '淘宝'
					},
				],
				current: 0
			}
		},
		computed: {
			skin() {
				return this.$store.state.skin;
			}
		},
		methods: {
			radioChange: function(e) {
				let item = this.items[Number(e.detail.value)].value;
				this.$store.commit("skinPeeler",item);

				// 动态设置导航条颜色
				uni.setNavigationBarColor({
					frontColor:'#ffffff',
					backgroundColor:item[0].value
				});
				
				// 动态设置tabbar样式
				uni.setTabBarStyle({
					backgroundColor:item[0].value,
					color: '#FFF',
					selectedColor: '#FFF',
					borderStyle: 'white'
				});
			}
		}
	}
</script>
 
<style lang="scss">
	page {
		background-color: #fff;
		font-size: 28rpx;
	}
	
	.h-flex-x{
		display: flex;
		flex-direction: row;
		flex-wrap: nowrap;
		justify-content: flex-start;
		align-items: center;
		align-content: center;
	}
	.card{
		background-color: var(--nav-bg);
		color:var(--nav-color);
		padding: 30rpx;
	}
	.list-item{
		height: 90rpx;
		border-top: var(--nav-color) solid 1px;
	}
 
	.nav-bar {
		box-sizing: content-box;
		height: 44px;
		background-color: var(--nav-bg);
		padding-top: var(--status-bar-height);
		color: var(--nav-color);
		line-height: 44px;
		text-align: center;
		font-size: 16px;
	}
 
	.btn {
		background-color: var(--nav-bg) !important;
		color: var(--nav-color) !important;
	}
</style>

最后总结

这就是主题切换的第一种实现

它的好处就是:能实时更换显示主题

但也有不足的地方

不足点:

  • 每个页面样式都维护着主题,耦合度高
  • 一套主题下实现不同页面区别化不方便
  • 增加变量后修改的地方多
  • … 更多不足大家补充

还有不懂的地方可以看b站视频:https://www.bilibili.com/video/BV1av4y1K74j/?p=18

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

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

相关文章

NLP学习笔记四-word embeding

NLP学习笔记四-word embeding word embeding就是一块重头戏了&#xff0c;因为这里做完&#xff0c;我们的数据处理部分也基本上收尾了。 下面我们附上一张图&#xff1a; 如上图&#xff0c;word embeding实在我们one-hot word之后才可以进行的&#xff0c;每一步处理技术都是…

NVM安装(管理Node.js版本)

NVM可以在一台电脑上安装多个版本Node.js&#xff0c;并且可以一条指令随时下载或切换版本 下载安装 github下载地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases 一路next&#xff0c;注意修改安装路径即可&#xff08;不要安装在有中文名称的目录下&am…

Latex图表制作:关于EPS文件转PDF文件及PDF裁剪自动化的Shell脚本制作

关于EPS文件转PDF文件及PDF裁剪自动化的Shell脚本制作 前言一、EPS文件转PDF文件1. 过去的科研绘图方案2. 未来的科研绘图方案 二、使用步骤1. 单例操作a. 安装epstoolb. 切除EPS文件白边并保存临时EPS文件d. 将EPS文件转换为PDF文件 2. 批处理操作a. Shell 脚本b. 使用说明 参…

贝叶斯公式的理解与推导(简单版本)

院子里面有条狗&#xff0c;过去几十年中&#xff0c;平均100天狗会叫50天&#xff0c;平均100天被偷盗一次&#xff0c;偷盗时有90%概率狗会叫&#xff0c;请问当狗叫的时候&#xff0c;是小偷入侵的概率有多大&#xff1f; 分析&#xff1a; 狗叫为独立事件A&#xff0c;偷盗…

chatgpt赋能python:Python如何将PDF转换为Word文档

Python如何将PDF转换为Word文档 在现代电脑使用的日常工作中&#xff0c;PDF格式的文档已经变得很普遍。这种文件格式十分方便&#xff0c;但是有时候可能需要将PDF文件转换为Word文档。幸运的是&#xff0c;Python提供了多种方法来实现这个目标。 为什么要将PDF转换为Word&a…

6. 常见的文件编码方式及查看网页源码的编码方式

6. 常见的文件编码方式及查看网页源码的编码方式 文章目录 6. 常见的文件编码方式及查看网页源码的编码方式1. 编码的由来2. 编码的作用3. 常见的编码方式4. ASCII码5. Unicode符号集6. UTF-87. GB23128. GBK9. ISO-8859-110. 文件编码查看方式11. 网页编码查看方式12. 留言 1.…

【学习日记2023.6.9】之 SpringCloud入门

文章目录 SpringCloud1. 认识微服务1.1 单体架构1.2 分布式架构1.3 微服务1.4 SpringCloud1.5 总结 2. 服务拆分和远程调用2.1 服务拆分原则2.2 服务拆分示例2.2.1 导入Sql语句2.2.2 导入demo工程 2.3 实现远程调用案例2.3.1 案例需求&#xff1a;2.3.2 注册RestTemplate2.3.3 …

计算机组成原理——总线,输入输出系统

文章目录 **一 总线概述****1 总线基本概念****1.1 定义****1.2 总线设备****1.3 总线特性** **2 总线的分类****2.1 片内总线****2.2 系统总线****2.3 I/O总线****2.4 通信总线** **3 系统总线的结构****3.1 单总线结构****3.2 双总线结构****3.3 三总线结构** **4 常见的总线…

TextDiffuser: Diffusion Models as Text Painters

TextDiffuser: Diffusion Models as Text Painters (Paper reading) Jingye Chen, HKUST, HK, arXiv2023, Cited: 0, Code, Paper 1. 前言 扩散模型因其出色的生成能力而受到越来越多的关注&#xff0c;但目前在生成准确连贯的文本方面仍存在困难。为了解决这个问题&#xf…

chatgpt赋能python:Python怎么进行302跳转以提高SEO

Python怎么进行302跳转以提高SEO 在进行搜索引擎优化时&#xff0c;重点是提高网站的排名和流量。其中一个关键的因素就是网页的重定向。在Python中&#xff0c;使用302重定向可以为您的网页提供更好的SEO效果。 什么是302跳转&#xff1f; 302跳转指的是HTTP状态码302 Foun…

chatgpt赋能python:Python教程:如何使用Python在U盘上新建文件?

Python教程&#xff1a;如何使用Python在U盘上新建文件&#xff1f; 如果您是一名经验丰富的Python开发人员&#xff0c;那么您可能已经使用Python进行过很多任务。但是&#xff0c;您是否曾经问过自己如何在U盘上使用Python来新建文件&#xff1f;这篇文章将带您逐步了解如何…

chatgpt赋能python:Python中如何使用正弦函数进行数学计算

Python中如何使用正弦函数进行数学计算 正弦函数是数学中经常使用的一种三角函数&#xff0c;可用于测量角度和距离等。Python是一种可以跨平台使用的高级编程语言&#xff0c;它具有许多内置函数来进行数学计算。在Python中使用正弦函数&#xff0c;可以通过输入角度或弧度来…

【AI】Ubuntu20.04安装cuda、cuDNN、Anacodna、PyTorch

1、版本选择 1)选择PyTorch版本:2.0.1 2)对应的CUDA版本:11.7或者11.8,选择较新的11.8 3)确定显卡是否支持,使用命令nvidia-smi查看显卡驱动版本及支持的CUDA最高的版本,本人的为12 4)cuDNN版本 选择和CUDA版本对应的最新版本v8.9.1 2、下载 2.1 下载CUDA 各个…

力扣高频SQL50题(基础版)——第九天

力扣高频SQL50题(基础版)——第九天 1 销售分析Ⅲ 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 1.2 示例sql语句 # 找到不在春季销售的产品 然后不是这些的就是符合条件的 # QUARTER 返回日期是第几季度的 SELECT product_id,product_name F…

AJAX:

目录 AJAX简介&#xff1a; 特点&#xff1a; 优点&#xff1a; 缺点&#xff1a; http请求报文和响应报文&#xff1a; AJAX代码实现&#xff1a; 发送get请求&#xff1a; 发送post请求&#xff1a; ​服务器响应json数据&#xff1a; ​AJAX的问题处理&#xff1a…

从零开始:如何用Python建立你的第一个人工智能模型

1. 摘要&#xff1a; 在这篇文章中&#xff0c;我们将介绍如何从零开始使用Python建立你的第一个人工智能模型。无论你是刚接触编程的新手&#xff0c;还是有经验的开发者想进一步探索人工智能领域&#xff0c;这篇文章都将为你提供清晰、详细的指南。我们将一步步探索数据预处…

[分布式锁]:Redis与Redisson

文章目录 1 分布式锁1.1 为什么需要分布式锁&#xff1f;1.1.1 引入业务场景1.1..2 本地锁与分布式锁 1.2 分布式锁核心思想1.3 基于Redis实现分布式锁1.3.1 基于Redis实现分布式锁问题1.3.2 问题时间线分析 2 Redisson入门2.1 Redisson快速实现2.2 开门狗机制2.3 加锁的实现原…

Python手写数字识别

神经网络是手写数字识别中常用的机器学习模型。它由许多神经元组成&#xff0c;每个神经元接收输入并生成输出。在前向传递过程中&#xff0c;神经元计算一些权重和偏移量的线性组合&#xff0c;并将其输入到一个非线性的激活函数中&#xff0c;从而生成神经元的输出。输出层通…

6道常见hadoop面试题及答案解析

Q1.什么是Hadoop&#xff1f;   Hadoop是一个开源软件框架&#xff0c;用于存储大量数据&#xff0c;并发处理/查询在具有多个商用硬件&#xff08;即低成本硬件&#xff09;节点的集群上的那些数据。总之&#xff0c;Hadoop包括以下内容&#xff1a;   HDFS&#xff08;Ha…

Scrum经验性过程

软件开发是一个复杂的活动&#xff0c; 在软件产品开发的过程中不仅存在着需求的不确定性&#xff0c;也存在着技术的不确定性&#xff0c;再加上参与软件开发的主体通常是由多人组成的软件开发团队&#xff0c;加上人的因素&#xff0c;就让整个软件开发的活动变得非常复杂。如…