共计 2774 个字符,预计需要花费 7 分钟才能阅读完成。
随着用户端体验的一直晋升,很多利用在上线的时候都要求做不同的主题,最根本的就是白天与夜间主题。
就像 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
正文完