使用带有样式组件的 Material-UI 主题

Posted

技术标签:

【中文标题】使用带有样式组件的 Material-UI 主题【英文标题】:Using Material-UI Theming with Styled Component 【发布时间】:2020-05-08 04:39:04 【问题描述】:

我正在学习 Gatsby,并尝试使用 Material-UI 和 Styled Components 构建一些组件并应用我的主题。我按照这里解释的 Material-ui 插件的 Gatsby 配置成功应用了主题(https://www.gatsbyjs.org/packages/gatsby-plugin-material-ui/)

还有 Material-ui 文档 此处提供的示例(https://material-ui.com/customization/palette/)

当我安装 Styled Components 时出现问题,我无法再应用我的主题。它似乎已正确安装,因为它确实遵循其他一些规则。有人能告诉我在访问我的主题属性时哪里出错了吗?

这是我的代码,我在需要时放置了路径,但 nav.js 是我的问题所在。

gatsby-config.js

module.exports = 
   plugins:[
   <other plugins>,
   
      resolve: 'gatsby-plugin-material-ui',
      // If you want to use styled components you should change the injection order.
      options: 
        StylesProvider: 
          injectFirst: true,
        ,
      ,
    ,
    'gatsby-plugin-styled-components',
  ]

主题.js

import React from 'react'
import  createMuiTheme, colors, MuiThemeProvider, StylesProvider  from '@material-ui/core';
import  ThemeProvider  from 'styled-components';
import CssBaseline from '@material-ui/core/CssBaseline'

// A custom theme for this app
const theme = createMuiTheme(
  palette: 
    type : 'dark',
    primary   :  500 : '#407855' ,
    secondary :  500 : '#9c27b0' ,
  ,
);

const ThemeWrapper = (props) => 
  return (
    <StylesProvider>
        <MuiThemeProvider theme=theme>
          <ThemeProvider theme=theme>
            <CssBaseline />
            props.children
          </ThemeProvider>
        </MuiThemeProvider>
    </StylesProvider>
  )


export default ThemeWrapper;

index.js

import React from 'react'
import ThemeWrapper from '../theme/theme'
import Layout from '../component/layout'
const IndexPage = ( data ) => 
    return (
        <ThemeWrapper>
            <Layout>
            </Layout>
        </ThemeWrapper>
    )

export default IndexPage

layout.js

import React from 'react'
import NavBar from './nav'
import Footer from '../component/footer'

const Layout = (props) => 
    return (
        <div>
            <div>
                <NavBar />
                props.children
            </div>
            <Footer />
        </div>
    )

export default Layout

nav.js

import React from 'react'
import styled from 'styled-components';
import  Link, graphql, useStaticQuery  from 'gatsby'

import  Paper, Tabs, Tab  from '@material-ui/core'

const StyledTabs = styled(Tabs)`
    backgroundColor: transparent;
    boxShadow: none;
    textColor: primary !important; // Doesn't work
    indicatorColor:$ props => props.data.theme.palette.secondary; // Doesn't work
    color : tomato; // Works
)`;


function Nav ( props ) 
    return ( 
        <Paper>
            <StyledTabs value=0>
                <Tab label="Item One" />
                <Tab label="Item Two" />
                <Tab label="Item Three" />
            </StyledTabs>
        </Paper>
    )


export default Nav 

如果我要使用 Tabs 和 Tab 组件而不是 StyledTabs 它可以工作

       <Paper>
            <Tabs textColor="primary" indicatorColor="secondary" value=0> //works perfectly
                <Tab label="Item One" />
                <Tab label="Item Two" />
                <Tab label="Item Three" />
            </StyledTabs>
        </Paper>

【问题讨论】:

【参考方案1】:

这里有几件事我注意到了。您可以尝试将您的主题提供程序应用于 gatsby-browser.js 中的 wrapRootElement 功能,这会将其置于根级别并通过您的应用程序向下传播:wrapRootElement

你告诉你的 Nav 组件它应该期待 props 但没有向它传递任何东西。

您在 index.js 中的布局是否应该将子级传递给它?

【讨论】:

嘿 Molebox,感谢您抽出宝贵时间回复,我添加了两个文件和 gatsby-browser.js 和 gatsby-s-s-r.js 并将我的主题添加到其中 ``` import ThemeWrapper from " ./theme" export const wrapRootElement = ThemeWrapper ``` 但我现在不知道怎么用?我的样式化组件现在应该可以看到了吗?它最终不起作用,但事实是我不确定我是否正确使用它,因为我想知道它被应用于根目录是否意味着我不再需要将我的布局包装在索引中?但是当我删除我的包装时,它又回到了它的基本主题。 "你告诉你的 Nav 组件它应该期待 props 但没有传递任何东西给它。" - 我没有注意到,但我应该注意到,但现在我不确定如何从并行孩子那里检索这些值,我在想也许我应该导出主题选项并移动 ThemeProvider、MuiThemeProvider 等的定义.索引并将主题传递给孩子们? “你的 index.js 中的布局应该有孩子传递给它吗?” - 我删除它们是为了减少问题的混乱

以上是关于使用带有样式组件的 Material-UI 主题的主要内容,如果未能解决你的问题,请参考以下文章

在样式化组件中使用 Material-ui 主题

如何在样式化组件中访问 Material-ui 的主题

如何在 next.js 中使用带有样式组件主题的 window.matchMedia?

带有 next.js 的 material-ui 样式

如何使用 react-testing-library 测试包装在 withStyles 中的样式化 Material-UI 组件?

React-Router 和 Material-UI:根据路由应用自定义主题