Skip to content

主题

得益于flexstyled的灵活性,我们可以通过主题来实现全局样式的统一管理。

创建主题

主题是一个对象,包含多个CSS变量样式,也可以包含一些预定义的样式。

tsx
// theme.ts
import { createTheme } from "flexstyled"
export const theme = createTheme({
   primaryColor   : "#007bff",
   secondaryColor : "blue",
   backgroundColor: "#e8f8ff",
   textColor      : "333",
   fontSize       : "16px",
})

使用主题

接下来就可以在组件中使用主题了。

tsx

import { theme } from "./theme"

export type  CardProps = React.PropsWithChildren<{
    title:string 
    footer?:string
  }>

export const Card = styled<CardProps>((props,{className})=>{
    const { title,children,footer} =props
    return (
      <div className={className}>
        <div>            
            {title}
        </div>
        <div>{children}</div>
        <div>{footer}</div>
      </div>
    )
  },{ 
    position:"relative",
    width:"100%",
    border:"1px solid #ccc",
    // 引用主题变量,具有类型提示
    backgroudColor: theme.backgroundColor,              
    color: theme.primaryColor                           
    // 或者也可以直接引用
    backgroudColor: "var(--background-color)",          
    color: "var(--primary-color)"
    borderRadius:"4px" 
  })

修改主题

能通过修改主题来修改全局样式。

tsx
import { theme } from "./theme"

// 具有类型提示,直接修改主题变量
theme.primaryColor = "red"               // ![code++]

// 也可以直接批量修改主题变量
theme.update({                                  // ![code++]
    primaryColor   : "#007bff",                 // ![code++]
    secondaryColor : "blue",                    // ![code++]
    backgroundColor: "#e8f8ff",                 // ![code++]
    textColor      : "333",                     // ![code++]
    fontSize       : "16px",                    // ![code++]
})

保存主题

修改主题后可以保存地,方便下次使用。

tsx
import { theme } from "./theme"

// 也可以直接批量修改主题变量
theme.update({
    primaryColor   : "#007bff",
    secondaryColor : "blue",
    backgroundColor: "#e8f8ff",
    textColor      : "333",
    fontSize       : "16px",
})

theme.save((data)=>{             // ![code++ ]
    // ![code++] // 保存主题到   
    localStorage.setItem("theme",JSON.stringify(data))   // ![code++]
} )  // ![code++]

读取主题

tsx
import { theme } from "./theme"

theme.load(JSON.parse(localStorage.getItem("theme"))   // ![code++]

变量前缀

主题变量本质上是创建一些全局CSS变量,为了避免冲突,可以给变量添加统一的前缀。

ts
import { createTheme } from "flexstyled";

export const theme = createTheme({
    primaryColor   : "#007bff",
    secondaryColor : "blue",
    backgroundColor: "#e8f8ff",
    textColor      : "333",
    fontSize       : "16px",
},{
    prefix:"v"
})

以下声明的变量都会自动添加前缀v,创建以下的全局变量:

css
:root{
    --v-primary-color: #007bff;
    --v-secondary-color: blue;
    --v-background-color: #e8f8ff;
    --v-text-color: 333;
    --v-font-size: 16px;
}