前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >react和vue设主题色

react和vue设主题色

原创
作者头像
愤怒的小鸟
修改2021-10-08 10:05:10
4190
修改2021-10-08 10:05:10
举报
文章被收录于专栏:web shareweb share

1. react 使用createContextuseContext设置主题色

代码语言:javascript
复制
import React, { useState } from 'react';

interface IThemeProps {
  [key: string]: {
    color: string;
    background: string;
  }
}

// 主题色
const themes: IThemeProps = {
  'light': {
    color: '#000',
    background: '#eee'
  },
  'dark': {
    color: '#fff',
    background: '#222'
  }
}

export const ThemeContext = React.createContext(themes.dark)

function App() {
  return (
    <div className="App">
      <ThemeContext.Provider value={themes.light}>
          <Hello />
      </ThemeContext.Provider>
    </div>
  );
}

使用:

代码语言:javascript
复制
import React, { useContext } from 'react'
import { ThemeContext } from '../../app/App'

interface IProps {
  message?: string;
}

const Hello: React.FC<IProps> = (props) => {
  const theme = useContext(ThemeContext)
  const style = {
    background: theme.background,
    color: theme.color
  }

  return <h2 style={style}>{props.message}</h2>
}

Hello.defaultProps = {
  message: 'hello world'
}

export default Hello

2. vue 使用provide、inject设置主题色

代码语言:javascript
复制
import { couputed, defineComponent, PropType, provide } from "vue"

const THEME_PROVIDER_KEY = Symbol()

interface Theme {
}

const ThemeProvider defineComponent({
    name: 'ThemeProvider',
    props: {
        theme: {
            type: Object as PropType<Theme>,
            require: true
        }
    },
    setup(props, { slots }) {
        const context = computed(() => props.theme)
        provide(THEME_PROVIDER_KEY, context)
        
        return () => slots.default && slots.default()
    }
})

export function getWidget(name: String) {
    const context: ComputedRef<Theme> | undefined = inject<ComputedRef<Theme>>(
        THEME_PROVIDER_KEY,
    )
    
    if(!context) {
        throw new Error('theme required')
    }
        
    const widgetRef = computed(() => {
        return (context.value.widgets as any)[name]
    })
    
    return widgetRef
}

export default ThemeProvider

使用:

代码语言:javascript
复制
<ThemeProvider theme={themeDefault as any}>
    <Form />
</ThemeProvider>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. react 使用createContext、useContext设置主题色
  • 2. vue 使用provide、inject设置主题色
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档