前面我已经给大家介绍了两种主题切换的方式,每种方式各有自己的优势与缺点,例如“scss变量+vuex”方式兼容好但不好维护与扩展,“scss变量+require”方式好维护但兼容不好,还不清楚的可点下面链接直达了解一下

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

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

理解了这些才能更好的理解我接下来给大家总结的。

最后做的这个能兼容所有平台的主题切换效果,大家可以微信扫码一睹为快,切换功能在”个人中心“那里(模仿的b站),目前分白天与夜间模式

接下来就给大家介绍一下如何做一个兼容好,又好维护的主题切换功能

解决思路

uniapp应用在做开发的时候,拆分页面其实就分两大部分,主体部分+导航栏与tabbar

为什么要这么分,因为主体部分的样式通常是普通css代码控制的,而导航栏+tabBar(例如原生的情况)须要通过api去修改。而css与js目前还不能完全互通。

因此要做全平台兼容同样须要维护主体部分的样式(纯css)与导航栏+tabBar部分的样式(js),明白了原理,接下来就上代码

第一部分:全局“主体部分”主题样式

这样其实就是之前讲过的,上代码

定义common/css/_theme.scss

  1. $themes: (
  2. // 白天模式
  3. light:(
  4. page: (
  5. background-color: #fff,
  6. color: (
  7. color: #333,
  8. ),
  9. block: (
  10. background-color: #333,
  11. color: (
  12. color: #fff,
  13. ),
  14. ),
  15. ),
  16. user-page: (
  17. background-color: #f2f2f2,
  18. color: (
  19. color: #666,
  20. ),
  21. block: (
  22. background-color: #999,
  23. color: (
  24. color: #000,
  25. ),
  26. ),
  27. ),
  28. ),
  29. // 夜间模式
  30. dark:(
  31. page: (
  32. background-color: #333,
  33. color: (
  34. color: #fff,
  35. ),
  36. block: (
  37. background-color: #fff,
  38. color: (
  39. color: #000,
  40. ),
  41. ),
  42. ),
  43. user-page: (
  44. background-color: #1a1a1a,
  45. color: (
  46. color: #fff,
  47. ),
  48. block: (
  49. background-color: #FFFFFF,
  50. color: (
  51. color: #000,
  52. ),
  53. ),
  54. ),
  55. )
  56. );

生成主题样式

  1. @mixin map-to-class($map, $divider: "-", $select: ".theme", $isRoot: false, $root-select: ".theme") {
  2. $select: if($select== "" and &, &, $select);
  3. @each $k, $v in $map {
  4. $currSelect: if($isRoot, #{$root-select}#{$divider}#{$k}, #{$select}#{$divider}#{$k});
  5. #{$currSelect} {
  6. @if type-of($v) ==map {
  7. @include map-to-class($v, $divider, "", true) {
  8. @content;
  9. }
  10. } @else {
  11. @at-root #{$select} {
  12. #{$k}: $v !important;
  13. }
  14. }
  15. }
  16. }
  17. }
  18. @each $key, $mode in $themes {
  19. @if $key== "light" {
  20. @include map-to-class($mode);
  21. }
  22. }
  23. // 或
  24. @each $key, $mode in $themes {
  25. @if $key== "dark" {
  26. @include map-to-class($mode);
  27. }
  28. }

其实可以循环一次性输出,这个交给你们了。。。

页面使用

  1. <template>
  2. <view class="tpf-page theme-page">
  3. <text class="theme-color">订单</text>
  4. <view class="theme-block block flex flex-align-center flex-pack-center">
  5. <text class="theme-color">板块里面的文本</text>
  6. </view>
  7. <view class="flex flex-align-center flex-pack-justify change-theme">
  8. <text class="button" @tap="changeTheme('light')">白天模式</text>
  9. <text class="button dark" @tap="changeTheme('dark')">夜间模式</text>
  10. </view>
  11. </view>
  12. </template>

这里主要通过加theme前缀(你自己可以改成想要的)的类theme-pagetheme-colortheme-block等等等的方式给内容块加背景,给字体加颜色等

这样页面是不是就很好维护,不同颜色的页面,你只须要在_theme.scss主题里面进行添加或修改后,在页面添加回应的theme-xxx类即可。

这样就处理了主体部分的样式主题切换问题。

第二部分:全部“导航栏+tabBar”主题样式

因为这部分涉及到原生操作,须要用到api,所以必须是js来维护主题样式

定义theme.js

  1. // 定义导航栏 与 tabbar 主题色
  2. const themes = {
  3. light:{
  4. navBar:{
  5. backgroundColor:'#FFF',
  6. frontColor:"#000000"
  7. },
  8. tabBar:{
  9. backgroundColor:'#FFF',
  10. color:'#333',
  11. selectedColor:'#0BB640',
  12. borderStyle:'white'
  13. }
  14. },
  15. dark:{
  16. navBar:{
  17. backgroundColor:'#333',
  18. frontColor:"#ffffff"
  19. },
  20. tabBar:{
  21. backgroundColor:'#333',
  22. color:'#fff',
  23. selectedColor:'#0BB640',
  24. borderStyle:'black'
  25. }
  26. }
  27. }
  28. export default themes;

第一种使用方式vue.prototype的全局挂载(不推荐)

不推荐的原因:::有兼容问题!!!

mian.js

  1. //引入主题
  2. import themes from '@/common/theme/theme.js';
  3. ....
  4. //全局挂载
  5. Vue.prototype.$themes = themes;

第二种使用方式:Vuex / globalData

为什么使用这两种,因为他们是目前官方兼容所有平台的,这里我只介绍Vuex的方式

创建store.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. // 引入主题
  4. import themes from '@/common/theme/theme.js';
  5. Vue.use(Vuex);
  6. const store = new Vuex.Store({
  7. state: {
  8. theme:themes[uni.getStorageSync('theme') || 'light']
  9. },
  10. getters: {
  11. },
  12. mutations: {
  13. updateTheme(state,mode = 'light'){
  14. state.theme = themes[mode];
  15. }
  16. }
  17. })
  18. export default store

页面使用

创建好store之后,就可以在页面里面动态设置导航栏与tabBar了,具体大家自己去根据喜好封装。

  1. onReady(){
  2. //Vuex的方式
  3. // 设置导航条
  4. uni.setNavigationBarColor(this.$store.state.theme.navBar);
  5. // 设置tabbar
  6. uni.setTabBarStyle(this.$store.state.theme.tabBar);
  7. },

如何实现切换

更新就是更改store的状态,因为他是全局的,所有页面都能应用到

  1. this.$store.commit("updateTheme",mode);
  2. // 设置导航条
  3. uni.setNavigationBarColor(this.$store.state.theme.navBar);
  4. // 设置tabbar
  5. uni.setTabBarStyle(this.$store.state.theme.tabBar);

最后总结

要想实现全端兼容,肯定所有的代码都要考虑到兼容所有平台,因为做的时候要就考虑到。

主题切换对于应用来说是一个大工程,原理给大家说了,实现部署还须要大家好好的思考,其中扩展性,可维护性等都必须事先考虑的,不然项目肯定做不大。

想看我做的最终成品怎么样,可以扫码看看

有什么做得不好的,或没有考虑到位的,欢迎大家留言讨论交流,共同学习进步。

uniapp主题切换功能的方式终结篇(全平台兼容)的更多相关文章

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

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

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

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

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

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

  4. 基于 Flutter 以两种方式实现App主题切换

    概述 App主题切换已经成为了一种流行的用户体验,丰富了应用整体UI视觉效果.例如,白天夜间模式切换.实现该功能的思想其实不难,就是将涉及主题的资源文件进行全局替换更新.说到这里,我想你肯定能联想到一 ...

  5. CI框架主题切换的功能

    CI框架主题切换的功能 本人接触到这个框架不就,属于菜鸟 , 公司现在用CI框架做项目 ,老大要做一个主题切换的功能,说明功能的要求我的脑子里瞬间有几个想法. 脑子里最简单的就是设置全局变量 如 : ...

  6. jQuery实现无刷新切换主题皮肤功能

    主题皮肤切换功能在很多网站和系统中应用,用户可以根据此功能设置自己喜欢的主题颜色风格,增强了用户体验.本文将围绕如何使用jQuery实现点击无刷新切换主题皮肤功能. 查看演示DEMO:https:// ...

  7. JS组件系列——表格组件神器:bootstrap table(三:终结篇,最后的干货福利)

    前言:前面介绍了两篇关于bootstrap table的基础用法,这章我们继续来看看它比较常用的一些功能,来个终结篇吧,毛爷爷告诉我们做事要有始有终~~bootstrap table这东西要想所有功能 ...

  8. JavaScript中的正则表达式(终结篇)

    JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScri ...

  9. WPF自定义控件与样式(15)-终结篇 & 系列文章索引 & 源码共享

    系列文章目录  WPF自定义控件与样式(1)-矢量字体图标(iconfont) WPF自定义控件与样式(2)-自定义按钮FButton WPF自定义控件与样式(3)-TextBox & Ric ...

  10. windows phone主题切换(换肤)

    之前项目做了个主题切换的功能,最后客户没来得及出第二套界面给放弃了,默哀中... 为了不让它就这样流产了,就放博客共享吧. 首先说明下原理:这个切换是通过重写资源字典里指定的样式,在运行的过程中加载指 ...

随机推荐

  1. golang pprof 监控系列(1) —— go trace 统计原理与使用

    golang pprof 监控系列(1) -- go trace 统计原理与使用 服务监控系列文章 服务监控系列视频 关于go tool trace的使用,网上有相当多的资料,但拿我之前初学golan ...

  2. hta--Windows运行html的桌面应用程序(HTML应用程序)

    HTA(HTML Application)-- HTML应用程序 作为前端开发,我们能熟练使用html实现各种效果,但是如果要实现一个简单的桌面应用程序那么应该怎么做呢,答案很简单,只需要把html文 ...

  3. 超详细!新手如何创建一个Vue项目

    目录 一.在官网下载Vue.js 二.使用<script>标签直接引入本地的vue.js 三.使用CDN引入Vue.js 四.验证是否安装成功 五.安装Vue Devtools浏览器调试插 ...

  4. 方差分析2——双因素方差分析(R语言)

    双因素方差分析(Double factor variance analysis) 有两种类型:一个是无交互作用的双因素方差分析,它假定因素A和因素B的效应之间是相互独立的,不存在相互关系:另一个是有交 ...

  5. python之爬虫二

    10正则表达式 正则表达式(regular expression)是一种字符串匹配模式或者规则,它可以用来检索.替换那些符合特定规则的文本.正则表达式几乎适用于所有编程语言,无论是前端语言 JavaS ...

  6. Github 添加贪吃蛇动画

    前言 我们都知道,对于Github来说,当你选择你的账户时,可以看到自己的提交记录. 于是就有大神动脑筋了,这些commit记录都是一些豆,如果弄一条蛇来,不就可以搞个贪吃蛇了吗? 有道理有道理,本文 ...

  7. ABPvNext-微服务框架基础入门

    ABPvNext-微服务框架基础入门 本文使用的是ABPvNext商业版 最新稳定版本7.0.2为演示基础的,后续如果更新,会单独写一篇最新版本的,此文为零基础入门教程,后续相关代码会同步更新到git ...

  8. C#模拟C++模板特化对类型的值的支持

    概述 C++的模板相比于C#,有很多地方都更加的灵活(虽然代价是降低了编译速度),比如C++支持变长参数模板.支持枚举.int等类型的值作为模板参数. C++支持枚举.int等类型的值作为模板参数,为 ...

  9. React 组件进入和退出动画实现

    在实现一个React中的弹框组件时,想给组件加个进入和退出动画,但发现React没有Vue3那样现成的api,因此需要自己设计. 主要思路为给组件添加一个state来选择className,不同的cl ...

  10. C# 从0到实战 变量的定义与使用

    变量的定义 变量本质是一种内存的占位符,使得我们可以轻松操作计算机.C#的变量声明格式是: 类型 名称 = 值: 1 //.... 2 3 int val = 0; //定义并赋值 4 5 Conso ...