fluent-ui - Fluent UI React - 如何使用 Fluent ThemeProvider 应用全局组件样式
问题描述
我正在使用下面的主题代码。我可以使用 ThemeProvider 和 createTheme 实用程序应用全局 Fluent 主题,但是当我添加特定于组件的主题时,我没有得到任何类型,这使得主题化变得非常困难。
所以我的问题是:如何使用具有强类型的 Fluent ThemeProvider 应用全局组件特定样式。
例如,如果我想为所有 Fluent PrimaryButtons 添加一个盒子阴影,我将不知道在components
传递给createTheme
.
如果你做过任何全局组件主题,请告诉我你使用的模式,如果我走在正确的轨道上,谢谢!
import { createTheme } from '@fluentui/react';
import { PartialTheme } from '@fluentui/react-theme-provider';
// Trying to add global component styles (not getting typings)
const customComponentStyles = {
PrimaryButton: {
styles: {
root: {
background: 'red'
}
}
}
};
export const fluentLightTheme: PartialTheme = createTheme({
components: customComponentStyles, // Want to apply component styles
palette: {
themePrimary: '#0078d4',
themeLighterAlt: '#eff6fc',
themeLighter: '#deecf9',
themeLight: '#c7e0f4',
themeTertiary: '#71afe5',
themeSecondary: '#2b88d8',
themeDarkAlt: '#106ebe',
themeDark: '#005a9e',
themeDarker: '#004578',
neutralLighterAlt: '#faf9f8',
neutralLighter: '#f3f2f1',
neutralLight: '#edebe9',
neutralQuaternaryAlt: '#e1dfdd',
neutralQuaternary: '#d0d0d0',
neutralTertiaryAlt: '#c8c6c4',
neutralTertiary: '#a19f9d',
neutralSecondary: '#605e5c',
neutralPrimaryAlt: '#3b3a39',
neutralPrimary: '#323130',
neutralDark: '#201f1e',
black: '#000000',
white: '#ffffff'
}
});
解决方案
这里的问题是, components 只是一个Record<string, ComponentStyles>
,ComponentStyles
然后 just 是 form 的一个非常不特定的对象{ styles?: IStyleFunctionOrObject<any, any>}
。他们必须为每个可能的I<Component>Styles
接口添加一个条目ComponentsStyles
,我猜这将是太多的工作并且容易出错(例如忘记在这里添加一个新组件......)。
由于所有I<Component>Styles
接口都由 Fluent 导出,因此我总是分别为每个组件定义样式,然后将它们合并到components
对象中:
const buttonStyles: IButtonStyles = {
root: {
backgroundColor: 'red'
}
};
export const fluentLightTheme: PartialTheme = createTheme({
components: { PrimaryButton: { styles: buttonStyles } },
});
这是我使用 Fluent UI 基本按钮示例之一创建的 codepen 示例:https ://codepen.io/alex3683/pen/WNjmdWo
推荐阅读
- php - preg_replace 短代码,可能带有一个或两个参数
- vue.js - vue中的列表应该有明确的键错误
- kubernetes - 此编解码器不允许编码:*versioning.codec
- javascript - 将 javaScript 文件用于网站时,是否总是必须将其命名为 main.js?
- java - 预启动报告 UiAutomation 未连接错误
- php - SQL Query如何调用枚举?
- spring - 具有自动缩放订阅者的 Spring Cloud Stream 是否会使用云 pubsub binder 处理相同的消息?
- angular - 有没有办法与 nativescript angular 中的文本选择菜单进行交互?
- mysql - 使用 JOIN 表的错误 MySQL 查询结果
- matlab - Matlab:从谱密度到方差