From 1aecf0eb876c07dc91ef2fb05dbdbe14b6bfdde4 Mon Sep 17 00:00:00 2001 From: mrayi <1078464063@qq.com> Date: Tue, 5 Sep 2023 16:02:56 +0800 Subject: [PATCH] refactor(configprovider): move common logic to common file (#2540) --- .../__snapshots__/configprovider.spec.ts.snap | 8 +- .../__tests__/configprovider.spec.ts | 7 + src/packages/__VUE/configprovider/common.ts | 80 +++++++++ src/packages/__VUE/configprovider/demo.vue | 162 ++++++++---------- .../__VUE/configprovider/index.taro.vue | 72 +------- src/packages/__VUE/configprovider/index.vue | 74 +------- 6 files changed, 171 insertions(+), 232 deletions(-) create mode 100644 src/packages/__VUE/configprovider/common.ts diff --git a/src/packages/__VUE/configprovider/__tests__/__snapshots__/configprovider.spec.ts.snap b/src/packages/__VUE/configprovider/__tests__/__snapshots__/configprovider.spec.ts.snap index 9842cbf7dd..3c63022fd3 100644 --- a/src/packages/__VUE/configprovider/__tests__/__snapshots__/configprovider.spec.ts.snap +++ b/src/packages/__VUE/configprovider/__tests__/__snapshots__/configprovider.spec.ts.snap @@ -1,7 +1,13 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`ConfigProvider: props themeVars 1`] = ` -"
+"
+ +
" +`; + +exports[`ConfigProvider: props themeVars 2`] = ` +"
" `; diff --git a/src/packages/__VUE/configprovider/__tests__/configprovider.spec.ts b/src/packages/__VUE/configprovider/__tests__/configprovider.spec.ts index a21200bbfe..b57fa0baa0 100644 --- a/src/packages/__VUE/configprovider/__tests__/configprovider.spec.ts +++ b/src/packages/__VUE/configprovider/__tests__/configprovider.spec.ts @@ -27,4 +27,11 @@ test('ConfigProvider: props themeVars', async () => { } }); expect(wrapper.html()).toMatchSnapshot(); + + await wrapper.setProps({ + themeVars: { + primaryColor: '#ff' + } + }); + expect(wrapper.html()).toMatchSnapshot(); }); diff --git a/src/packages/__VUE/configprovider/common.ts b/src/packages/__VUE/configprovider/common.ts new file mode 100644 index 0000000000..995410ad33 --- /dev/null +++ b/src/packages/__VUE/configprovider/common.ts @@ -0,0 +1,80 @@ +import { h, computed } from 'vue'; + +export const component = (tag: string) => { + return { + props: { + theme: { type: String, default: '' }, + themeVars: { type: Object, default: {} }, + tag: { type: String, default: tag } + }, + + setup(props: any, { slots }: any) { + const hexToRgb = (color: string) => { + //十六进制颜色值的正则表达式 + const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; + if (!reg.test(color)) return ''; + color = color.toLowerCase(); + // 如果是16进制颜色 + if (color.length === 4) { + color = + '#' + + color + .slice(1) + .split('') + .map((char) => char + char) + .join(''); + } + //处理六位的颜色值 + const colors = []; + for (let i = 1; i < 7; i += 2) { + colors.push(parseInt('0x' + color.slice(i, i + 2))); + } + return colors.join(','); + }; + + const kebabCase = (str: string): string => { + str = str.replace(str.charAt(0), str.charAt(0).toLocaleLowerCase()); + return str.replace(/([a-z])([A-Z])/g, (_, p1, p2) => p1 + '-' + p2.toLowerCase()); + }; + + const mapThemeVarsToCSSVars = (themeVars: Record) => { + if (!themeVars) return; + const cssVars: Record = {}; + const primaryColor = themeVars?.primaryColor; + // 为了处理一些组件的rgba透明颜色 + if (primaryColor) { + const primaryColorRgb = hexToRgb(primaryColor); + cssVars[ + '--nut-address-region-tab-line' + ] = `linear-gradient(90deg, ${primaryColor} 0%, rgba(${primaryColorRgb}, 0.15) 100%)`; + cssVars[ + '--nut-tabs-horizontal-tab-line-color' + ] = `linear-gradient(90deg, ${primaryColor} 0%, rgba(${primaryColorRgb}, 0.15) 100%)`; + cssVars[ + '--nut-tabs-vertical-tab-line-color' + ] = `linear-gradient(180deg, ${primaryColor} 0%, rgba(${primaryColorRgb}, 0.15) 100%)`; + } + + Object.keys(themeVars).forEach((key) => { + cssVars[`--nut-${kebabCase(key)}`] = themeVars[key]; + }); + + return cssVars; + }; + + const themeStyle = computed(() => mapThemeVarsToCSSVars(props.themeVars)); + const defaultSlots = slots.default?.(); + + return () => { + return h( + props.tag, + { + class: `nut-theme-${props.theme}`, + style: themeStyle.value + }, + defaultSlots + ); + }; + } + }; +}; diff --git a/src/packages/__VUE/configprovider/demo.vue b/src/packages/__VUE/configprovider/demo.vue index e0171f9c7c..91cb36054b 100644 --- a/src/packages/__VUE/configprovider/demo.vue +++ b/src/packages/__VUE/configprovider/demo.vue @@ -68,11 +68,12 @@
- - diff --git a/src/packages/__VUE/configprovider/index.taro.vue b/src/packages/__VUE/configprovider/index.taro.vue index 1db530b2b3..6297ca519f 100644 --- a/src/packages/__VUE/configprovider/index.taro.vue +++ b/src/packages/__VUE/configprovider/index.taro.vue @@ -1,74 +1,8 @@ diff --git a/src/packages/__VUE/configprovider/index.vue b/src/packages/__VUE/configprovider/index.vue index 0905a59ab1..65317bee01 100644 --- a/src/packages/__VUE/configprovider/index.vue +++ b/src/packages/__VUE/configprovider/index.vue @@ -1,76 +1,8 @@