React-Toolbox:如何应用主题

IT技术 reactjs react-toolbox
2021-05-01 05:22:28

我正在使用 react 工具箱,并且在我的 webpack 配置中我有(我只发布了配置的重要部分):

loaders: [
..... 
ExtractTextPlugin.extract('style',
                'css?sourceMap&modules&importLoaders=1&localIdentName=' +
                '[name]__[local]___[hash:base64:5]!postcss!sass') }
        ]
postcss: [autoprefixer],
    sassLoader: {
      data: '@import "' + path.resolve(__dirname, 'app/theme/_config.scss') + '";'
    }

app/theme/_config.scss我已经定义:

@import "~react-toolbox/lib/colors";
@import "~react-toolbox/lib/globals";
@import "~react-toolbox/lib/mixins";

$color-primary: $palette-orange-500;
$color-primary-dark: $palette-orange-700;

现在有什么奇怪的,我的颜色应用正确。

现在,我想创建一个自定义Card组件,我已经像这样定义了它(仅用于测试主题):

import theme from './style.scss';
const CardStatus = ({ children, ...other}) => (
    <Card {...other} theme={theme}>
        <CardTitle
            title="A title"
            subtitle="a subtitle"
            theme={theme}
        />
    </Card>
);

CardStatus.propTypes = {
    children: PropTypes.node
};

导出默认 CardStatus;

在 style.scss 我有:

.title {
  color: yellow;
}

我的应用程序编译没有错误,但黄色不适用于我的 CardTitle:

我确实尝试过:

  1. theme={theme}
  2. theme={theme.title}

但没什么......颜色不起作用。

我做错了什么?

2个回答

当您对组件进行主题化时,需要考虑一些事项。首先,您必须了解我们传递自定义主题对象所做的工作是自定义类名附加到内部定义的类名。

自定义 classNames 应该实现比默认 className 更高的优先级以成功覆盖它们。此外,您还必须考虑到内部类可能没有最低优先级。

在您的示例中,您正在传递一个.title具有最低优先级的类定义的主题对象如果您检查来源,您会看到默认选择器的优先级高于此。要覆盖默认值,您至少需要相同的优先级,并在原始 css 之后捆绑您的 css。在此处查看完整答案

className={theme.title}在 CardTitle 中使用您的样式而不是theme={theme.title}