uni 主题配置

配置核心

vue3-inset-loader + page-meta标签

  • vue3-inset-loader 可以将组件全局放进页面中
  • page-meta 页面属性配置节点

page-meta内配置好page-style,再封装成组件,使用vue3-inset-loader全局都注册这个组件,就完成了主题配置。

目录结构以及文件

  -components
		-global-theme/global-theme.vue(主题组件)
  -utils
    -auth.ts(本地缓存)
  -store
    -theme.ts(主题store)
  -theme
    -orange.ts(主题文件)
    -red.ts(主题文件)
  -hooks
    -useTheme.ts
components/global-theme/global-theme.vue
<template>
	<page-meta :page-style="currentTheme" />
</template>
<script setup lang="ts">
import { useTheme } from '@/hooks/useTheme'
import { computed } from "vue";
const { themeData } = useTheme();

function objectToCssString(obj: any) {
	let cssString = "";
	for (let key in obj) {
		if (obj.hasOwnProperty(key)) {
			// 添加冒号、值,并在末尾添加分号(除了最后一个属性)
			cssString += key + ": " + obj[key] + ";";
		}
	}
	return cssString;
}
const currentTheme = computed(() => {
	return objectToCssString(themeData);
});
</script>
<script lang="ts">
export default {
	options: {
		// 微信小程序中 options 选项,自定义组件不生成父级标签
		multipleSlots: true,
		styleIsolation: "shared",
		addGlobalClass: true,
		virtualHost: true,
	}
};
</script>
utils/auth.ts
export const getTheme = () => {
  return uni.getStorageSync('THEME')
}
export const setTheme = (theme: string) => {
  uni.setStorageSync('THEME', theme)
}

store/theme.ts
import {
	defineStore
} from 'pinia'
import orangeTheme from '@/theme/orange'
import redTheme from '@/theme/red'
import { setTheme, getTheme } from '@/utils/auth'

type ThemeType = 'orange'
type ThemeDataVO = typeof orangeTheme

interface ThemeStateVO {
	themeName: ThemeType
	orange: ThemeDataVO, // 橙色主题
	red: ThemeDataVO, // 红色主题
}
export const useThemeStore = defineStore('theme', {
	state: () : ThemeStateVO => {
		return {
      // 默认橙色主题
			themeName: getTheme() || 'orange',
			orange: {
				...orangeTheme
			},
		}
	},
	getters: {
		getThemeData(state) {
			return state[state.themeName]
		}
	},
	actions: {
		setTheme(type: ThemeType) {
			this.themeName = type
			setTheme(type)
		}
	}
})
theme/orange.ts
const theme = {
	/** 主题色 start*/
	'--theme-color': '#FF611E', // 橘色
	/** 主题色 end*/

	/** 辅助色 start*/
	'--secondary-color': '#FF924C', // 浅橘色
	/** 辅助色 end*/

  '--color-1': '#FFF'
  // ...其他色
}
export default theme
hooks/useTheme.ts
import {
  useThemeStore
} from '@/store/theme'
import { storeToRefs } from 'pinia'

const themeStore = useThemeStore()

export const useTheme = () => {
  const { getThemeData } = storeToRefs(themeStore)
  // const getThemeData = computed(() => themeStore)
  return {
    themeData: getThemeData,
    /** 主色 */
    themeColor: computed(() => getThemeData.value['--theme-color']),
    /** 辅助色 */
    secondaryColor: computed(() => getThemeData.value['--secondary-color']),
  }
}

使用颜色

// js中获取这个颜色
const { themeData } = useTheme();
themeData['--color-1']
// css中使用颜色 
color: var(--color-1);
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值