如何使用 useTheme() 钩子使用我的自定义主题?

Posted

技术标签:

【中文标题】如何使用 useTheme() 钩子使用我的自定义主题?【英文标题】:How is possible consume my custom Theme with useTheme() hook? 【发布时间】:2019-09-02 04:04:13 【问题描述】:

我在声明我的 MuiProvider 时有一段代码,如下所示:

<MuiThemeProvider theme=merge(defaultGlobalTheme, this.props.adjustThemeOptions)>
    this.props.children
</MuiThemeProvider>

如何使用 Material-UI Hooks(在 @material-ui/styles@3.0.0-alpha.10 中声明)使用我的自定义主题(在 MuiThemeProvider 中使用 @material-ui/core@3.9.3 库声明)还是使用 Hooks 的其他解决方案?

编辑: 你可以这样消费:

import  useTheme  from '@material-ui/styles';

function MyComponent() 
  const theme = useTheme();

  return <div>`spacing $theme.spacing`</div>;

但是我的解决方案有效如果您在上述版本中有带有@material-ui/core 的组件并且您正在使用@material-ui/styles 库。

提前谢谢你。

最好, 弗兰

【问题讨论】:

【参考方案1】:

没有使用MuiThemeProvider 提供的上下文的钩子,但是如果您可以使用ThemeProvider 代替,您可以使用useTheme 钩子来使用位于提供程序下方的组件中的主题树。

import  useTheme  from '@material-ui/styles';

function MyComponent() 
  const theme = useTheme();

  return <div>`spacing $theme.spacing`</div>;

【讨论】:

是的,但是我已经声明了一个带有新属性“调色板”的自定义主题,例如,当我尝试在样式规则中使用它时,会发布错误并显示以下消息:“属性面板未定义”。 @fg93 我的回答可能有误。 It works with a regular ThemeProvider at least。也许这不是你需要的? 是的,我需要那个,但是……我想我已经找到了问题所在。我想我是从 @material-ui/core/MuiThemeProvider 导入 ThemeProvider ,我需要相同但从 @material-ui/styles/ThemeProvider 并从 @material-ui/styles 调用 install() 方法。【参考方案2】:

customTheme 不适用于 useTheme(),因为我使用的是来自 @material-ui/core@3.9.3 的 ThemeProvider,它与来自 @material-ui/styles@^3.0 的 useTheme() 不兼容.0-alpha.10.

Material-UI 的人在this link 中解释了解决方案

基本上,当尚未导入 Material-UI 时,您必须在顶部添加这些行:

import  install  from '@material-ui/styles';

install();

并且 ThemeProvider 和其余组件将兼容库 @material-ui/styles 的组件

PD:这是暂时的,因为钩子还没有在 @material/core 中,但它们会在 v4 中

感谢您的帮助!

最好, 弗兰。

【讨论】:

以上是关于如何使用 useTheme() 钩子使用我的自定义主题?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 React 组件的自定义钩子与“map”一起使用

创建永不重建的自定义钩子

如何使用反冲为自定义钩子编写测试代码

如何使用 JEST、Enzyme 在 React 中测试自定义钩子?

如何使用 Mock Service Worker 在自定义钩子中模拟获取?

如何创建一个接收依赖项的自定义钩子?