uniapp小程序实现主题切换功能多端适配

uniapp小程序实现主题切换功能

业务场景:小程序中切换主题,如:白天,夜间,暗夜等。实现常规版与老年版界面的切换。

思路

  1. 原理:通过css-var变量的方式实现主题切换
  2. 定义主题样式至vuex中,通过vuex的mutations封装函数改变主题样式
  3. 使用mixins混入全局组件中,注册主题样式
  4. 在页面使用变量:style={theme}引入
  5. 使用scss简化var变量写法

实现代码

1、store/index.js

css-var变量不支持rpx单位,需要通过uni.upx2px()方法转换为px

js 复制代码
// 页面路径:store/index.js 
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);//vue的插件机制

function rpxTopx(rpx) {
	return `${uni.upx2px(rpx)}px`;
}
//Vuex.Store 构造器选项
const store = new Vuex.Store({
	state: {
		themeName: uni.getStorageSync("theme"),
		themeStyle: {
			"nature": `--title-size:${rpxTopx(32)};--info-size:${rpxTopx(28)};
			`,
			"older": `--title-size:${rpxTopx(44)};--info-size:${rpxTopx(36)};
			`
		}
	},
	getters: {
		theme(state) {
			return state.themeStyle[state.themeName]
		}
	},
	mutations: {
    // 切换主题方法
		setTheme(state, themeName) {
			state.themeName = themeName
		}
	}
})
export default store

2、mixins/theme.js

每个页面都需要获取相应主题的var变量字符串,使用mixin进行简化写法

js 复制代码
import {
  mapState,
  mapGetters
} from 'vuex'
export default {
  install(Vue) {
    Vue.mixin({
      computed: {
        ...mapState({
          themeName: 'themeName'
        }),
        ...mapGetters({
          theme: "theme"
        })
      }
    })
  }
}

3、main.js中导入store与mixin

js 复制代码
import Vue from 'vue'
import App from './App'
import store from './store'
import mixin from '@/mixins/theme.js'
Vue.use(mixin)
App.mpType = 'app'
const app = new Vue({
  store,
  ...App,
  // 启用动态插槽名支持
  scopedSlotsCompiler: 'augmented'
})

4、uni.scss中使用var变量

scss 复制代码
$title-size :var(--title-size); //标题字体大小
$info-size:var(--info-size);

5、在页面中使用

html 复制代码
<template>
  <view :style="theme" class="page">
    <button @click="setTheme('nature')" class="btn">常规版</button>
    <button @click="setTheme('older')" class="btn">老年版</button>
  </view>
</template>
<script>
export default {
  data() {
    return {}
  },
  methods: {
    setTheme(theme) {
      this.$store.commit('setTheme', theme)
      uni.showToast({
        title: '切换成功',
        duration: 2000
      })
    }
  }
}
</script>
<style lang="scss" scoped>
  .tool_text {
    margin-top: 25rpx;
    font-size: $title-size;
    color: #ffffff;
    line-height: 48rpx;
  }
<style>

总结

实现有没难度,目前需要每个页面都引入style:{theme},小程序App.vue中不能书写视图,目前没有找到解决方法。

相关推荐
用户034187671386 小时前
用秒哒做了个拍照识餐小程序,上线两周踩的 4 个坑
微信小程序
李纲明9 小时前
微信小程序租赁归还说本来就坏或配件对不上:先核借还点验与随单存证,再查差异计价公示
微信小程序·devdiy·租赁点验·借还拍照·随单存证·差异计价·押金释放
李纲明1 天前
微信小程序次卡跨店对不上账或前台随手改余次:先核流水只增不改与统一日切,再查冲正权限与总部只读
微信小程序·devdiy·核销流水·跨店次卡·日切对账·冲正权限·总部只读
李纲明1 天前
微信小程序维修拆机后口头加价或未确认就开工:先核验机快照与报价确认,再查补充报价与取机核验
微信小程序·devdiy·维修验机·报价确认·报价快照·补充报价·取机核验
wx1qq1com1 天前
一桩带几台车:共享租赁桩位配比、取电与结算闭环设计
物联网·微信小程序·小程序
李纲明1 天前
微信小程序场地长租月底对不上或口头占场撞场:先核合约预约与核销流水出账,再查附加费与转租归属
微信小程序·devdiy·场地长租·月结账单·核销流水·附加费·转租归属
2401_879692511 天前
微信小程序照相与摄像功能实现——chooseImage 与 chooseVideo 详解
微信小程序·小程序·notepad++
律宏阔2 天前
微信小程序 + Taro + TDesign 去掉 [&&&],让普通 Tailwind 类接管局部样式
前端·微信小程序·taro
律宏阔2 天前
微信小程序 + Taro + 多语言实现与国际化检查实录
前端·微信小程序·taro
李纲明3 天前
微信小程序 getSystemInfo 提示已废弃、屏幕高度算错胶囊还对不齐?getWindowInfo 和 getDeviceInfo 怎么接才稳
javascript·微信小程序·小程序·小程序开发·devdiy