第一步:vuex中创建store文件目录index.js文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
	state: {
		// 写上默认皮肤的数据
		skin: '#6aa6ff'
	},
	//计算属性state的值改变过后的值更新
	getters: {
		skin: state => state.skin
	},
	mutations: {
		// 皮肤更换
		setSKIN(state, data) {
			if (data) {
			//防止vuex刷新丢失,存入到本地
				uni.setStorageSync('skin_key', data);
				state.skin = data;
			} 

		}
	}
})

第二步 创建一个 mixin 文件 因为每个页面都是用 mapGetters 方式获取值

import {mapGetters} from 'vuex'
export default {
	install(Vue) {
		Vue.mixin({
			computed: {
				...mapGetters(['skin'])
			}
		})
	}
}

第三步直接在main.js 中引入

//引入自行更换路径
import store from '@/store/index.js'
//每个页面引入换肤的计算属性
import mixin from '@/store/mixin .js'
Vue.use(mixin)
const app = new Vue({
	store,
	...App
})

第四步页面使用 因为在main.js 中引入了公共的 mapGetters 所以在页面就不用单独引用了

在最外层的div中加入 :style="{'--skin':skin}"
//在使用颜色变量的地方使用
	.text {
		color:var(--skin);
	}

第五步在切换颜色页面的方法

    	<!-- 切换皮肤的颜色 -->
			<view class="card">
				<view class="titleText">请选择皮肤风格</view>
				<radio-group @change="radioChange" name="current" class="radioStyle">
					<label class="h-flex-x list-item" v-for="(item, index) in items" :key="index">
						<view>
							<radio :value="item.id"  :checked="item.id=== current" />
						</view>
						<view>{{item.name}}</view>
					</label>
				</radio-group>
			</view>

           data(){
             return{
             items: [{
				 	 id:'0',
				 	 name:'默认',
				 	 setColor:'#6aa6ff',
				 	checked:true
				 },
				 {
				 	 id:'1',
				 	 name:'红色',
				 	 setColor:'#c02c38'
				 },
				{
					 id:'2',
					 name:'绿色',
					 setColor:'#1dbfab'
				}],
				current:'0'
             }
},
 // 选中的radio赋值
	onReady() {
			this.current=uni.getStorageSync('radio_key')?uni.getStorageSync('radio_key'):'0';
		},
   methods:{
     radioChange(e) {
				this.current = e.detail.value;
				var skinItem = this.items[this.current].setColor;
				uni.setStorageSync('radio_key',this.current);
				this.$store.commit("setSKIN", skinItem);
			},
}
				

第六步,因为们每次进来app都是上次选中的颜色,所以在app.vue 文件中增加

created() {
			this.$store.commit('setSKIN',uni.getStorageSync('skin_key'))
		}

最后差不多功能就做完了,有不足的地方请多多指教
借鉴博客地址:https://zhuanlan.zhihu.com/p/635051054

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐