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

就像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

uniapp主题切换功能的第一种实现方式(scss变量+vuex)的更多相关文章

  1. 使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  2. 基于.NetCore开发博客项目 StarBlog - (14) 实现主题切换功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  3. Android的Fragment的第一种声明方式

    Android的Frangment的第一种声明方式 实际效果图如下: 项目结构图如下: fragment1: package com.demo.fragementfirst; import andro ...

  4. iOS 清理缓存功能实现第一种方法

    添加一个提示框效果导入第三方MBProgressHUD #import "MBProgressHUD+MJ.h" /** * 清理缓存第一种方法 */ -(void)clearCa ...

  5. ANDROID_MARS学习笔记_S02_007_Animation第一种使用方式:代码

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  6. iOS开发之App主题切换完整解决方案(Swift版)

    本篇博客就来介绍一下iOS App中主题切换的常规做法,当然本篇博客中只是提到了一种主题切换的方法,当然还有其他方法,在此就不做过多赘述了.本篇博客中所涉及的Demo完全使用Swift3.0编写完成, ...

  7. Android主题切换—夜间/白天模式探究

    现在市面上众多阅读类App都提供了两种主题:白天or夜间. 上述两幅图片,正是两款App的夜间模式效果,所以,依据这个功能,来看看切换主题到底是怎么实现的(当然现在github有好多PluginThe ...

  8. 使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  9. Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)

    勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...

  10. iSCSI存储的3种连接方式

    我们分析了iSCSI存储的系统结构,下面来看iSCSI是如何与服务器.工作站等主机设备来连接的,也就是我们如何建立一个iSCSI网络存储系统. iSCSI设备的主机接口一般默认都是IP接口,可以直接与 ...

随机推荐

  1. boss直聘自动化爬取招聘信息

    自己百度下载一个scrpy(爬虫框架) 不知博客园咋传文件 百度网盘 永久访问 链接:https://pan.baidu.com/s/1_-5lnnTj_qs9d_jtWkFgcA 提取码:x3ur

  2. Midjourney AI绘画使用指南

    ​上图有Midjourney生成,提示语为:24-year-old Chinese woman with long hair and a Tedd Midjourney是一款基于Prompt设计和CL ...

  3. Go 语言 new 和 make 关键字的区别

    原文链接: Go 语言 new 和 make 关键字的区别 本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的.那就是 new 和 make 这两个内置函数的区别. ...

  4. Docker常用软件安装

    jdk dockere pull openjdk:11 docker run -d -t --name java-11 openjdk:11 MySQL 可以从docker hup中查找自己想要安装的 ...

  5. [软件工程]TO B型IT软件企业在工程管理角度所存在的诸多问题

    组织架构与分工? 各子组织的职责.边界是否明确? (安装.升级)部署规范? 必须有部署文档. 各个模块/组件部署在哪台服务器?哪个路径下? 一切非正式启用的任务.文件(夹).安装资料必须依据实际用途以 ...

  6. python数据类型、变量以及编码和字符串、格式化

    1.数据类型包括整型.浮点型.字符串.布尔型. 整数如果位数太多可以用_隔开,浮点数可以用科学记数法表示,字符串要用单引号或者双引号括起来,布尔型的值只能为True和False 2.变量可以由数字.字 ...

  7. 从0到1手把手教你ASP.NET Core Web API项目配置接口文档Swagger(一)

    一.创建ASP.NET Core Web API项目(若项目已创建,则可跳过本节内容) 1.双击打开VS2022. 2.单击"创建新项目",如下图. 3.选择"ASP.N ...

  8. 让SQL起飞(优化)

    最近博主看完了<SQL进阶教程>这本书,看完后给博主打开了SQL世界的新大门,对于 SQL 的理解不在局限于以前的常规用法.借用其他读者的评论, ❝ 读完醍醐灌顶,对SQL做到了知其然更能 ...

  9. HDCTF_2023

    pwnner 附件 有后门函数,seed是一个固定值, //伪随机数 #include <stdio.h> #include <stdlib.h> int main() { i ...

  10. Go中的有限状态机FSM的详细介绍

    1.FSM简介 1.1 有限状态机的定义 有限状态机(Finite State Machine,FSM)是一种数学模型,用于描述系统在不同状态下的行为和转移条件. 状态机有三个组成部分:状态(Stat ...