uniapp 实现动态切换全局主题色

需求:实现开发的应用中切换主题色

如果只是需要一个主题色没有切换的需要 完全可以使用uniapp里面uni.scss文件文档

思路:预先在一个公共css中定义你需要的主题颜色,这里只是示例定义了两种颜色

  • 参考文档 从中获得思路可以通过动态设置data-xx从而配合css属性选择器来动态改变主题色
  • 本来是想通过mixin直接混入一个变量来达到全局控住主题色,忽略了minxi的data需要是一个函数 所以返回的值在每个页面之间是不关联的,从而使用vuex,也可以定义一个全局变量uni里面使用全局变量
  • 使用store的原因是潘佳辰大佬使用store实现动态路由以及头部栏的固定
  • 上图真机为红米k30ultra 安卓10

实现

  • 涉及到的知识点为uniappp vuex(这里我使用了store的模块化)
  • 全局css在app.vue里面引入
[data-theme='pink'] {
	background-color: pink;
	color: #fff;
}

[data-theme='blue'] {
	background-color: blue;
	color: #fff;
}
  • 我们可以在vuex中定义一个appTheme全局主题变量,并且写入一个函数以此来修改主题变量
const state = {
	appTheme: 'pink'
};
const mutations = {
	TOGGLE_APP_THEME(state, color = 'pink') { //你可以传入一个颜色参数(需要上面公共css中含有,如果不传入默认为粉色)
		console.log(color)
		state.appTheme = color
	}

}
const getters = {}
const actions = {};
export default {
	state,
	actions,
	mutations,
	getters,
	namespaced: true
}

//getters中的数据(这里的getters是单个文件)
appTheme(state) {
		return state.setting.appTheme
}
  • 在单页面中给你所需要设置主题色的dom添加date-them属性
//html
<text :data-theme="appTheme" @tap="toggleAppTheme('pink')">切换主题色</text>
//js
import { mapGetters } from 'vuex';
computed: {
		...mapGetters(['appTheme'])
}
  • 为了省事我直接在main.js使用mixin混入了toggleAppTheme函数
Vue.mixin({
	methods: {
		toggleAppTheme(color = 'blue') {
			this.$store.commit('setting/TOGGLE_APP_THEME', color);
		}
	}
})
感觉这种方式挺麻烦的,期望大佬出现
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
UniApp的国际化语言包支持一键全局切换语言的功能。以下是具体步骤: 1. 在UniApp项目中创建一个lang文件夹,用于存放语言包。 2. 在lang文件夹中创建一个index.js文件,用于定义语言包和默认语言。 3. 在index.js文件中定义语言包,例如: ``` export default { en: { hello: 'Hello', world: 'World' }, zh: { hello: '你好', world: '世界' } } ``` 4. 在index.js文件中定义默认语言: ``` export const DEFAULT_LANG = 'en'; ``` 5. 在App.vue中引入语言包和默认语言: ``` <template> <div> <p>{{ $t('hello') }}</p> <p>{{ $t('world') }}</p> </div> </template> <script> import lang from '@/lang'; import { DEFAULT_LANG } from '@/lang/index'; export default { computed: { lang() { return lang[this.$store.state.lang || DEFAULT_LANG]; } }, methods: { setLang(lang) { this.$store.commit('setLang', lang); uni.setStorageSync('lang', lang); } }, watch: { '$store.state.lang'(newVal) { uni.setNavigationBarTitle({ title: this.lang.title }); } }, created() { this.$store.commit('initLang', uni.getStorageSync('lang')); } } </script> ``` 6. 在main.js中定义语言切换方法: ``` import Vue from 'vue' import App from './App' import store from './store' import lang from '@/lang' import { DEFAULT_LANG } from '@/lang/index' Vue.config.productionTip = false Vue.prototype.$t = function(key) { const langType = store.state.lang || uni.getStorageSync('lang') || DEFAULT_LANG; const value = lang[langType][key] || lang[DEFAULT_LANG][key] || ''; return value; } App.mpType = 'app' const app = new Vue({ store, ...App }) app.$mount() ``` 7. 在store.js中定义语言切换方法: ``` import Vue from 'vue' import Vuex from 'vuex' import { DEFAULT_LANG } from '@/lang/index' Vue.use(Vuex) export default new Vuex.Store({ state: { lang: '' }, mutations: { initLang(state, lang) { state.lang = lang || DEFAULT_LANG; }, setLang(state, lang) { state.lang = lang; } }, actions: {}, modules: {} }) ``` 8. 在页面中添加语言切换按钮: ``` <template> <div> <button @click="setLang('en')">English</button> <button @click="setLang('zh')">中文</button> </div> </template> <script> export default { methods: { setLang(lang) { this.$store.commit('setLang', lang); uni.setStorageSync('lang', lang); } } } </script> ``` 这样就可以实现UniApp的国际化语言包一键全局切换语言的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值