2016-10-25 4 views
2

Мой вопрос очень прост, я хочу использовать DarkTheme Material-ui в части моего приложения. Вот пример кода:Материал-ui: darkTheme не влияет на обернутых детей

<div> 
    <MuiThemeProvider muiTheme={getMuiTheme(darkBaseTheme)}> 
    <div> 
     <AppBar title="I am dark" /> 
     <MyCustomComponent label="I should be dark but I am not" /> 
    </div> 
    </MuiThemeProvider> 
    <MuiThemeProvider muiTheme={getMuiTheme(lightBaseTheme)}> 
     <p>I am in the lightBaseTheme (default theme)</p> 
    </MuiThemeProvider> 
</div> 

Первая часть приложения должна быть в темной теме (это меню слева), то вторая часть в свете темы (это само приложение).

The AppBar, который является прямым потомком MuiThemeProvider действительно темно, однако, MyCustomComponent и его дети (даже если они являются базовыми Материальным-компонентами пользовательского интерфейса, таких как RaisedButton), не используя темную тему.

Каков самый простой способ иметь MyCustomComponents и все его дочерние элементы, чтобы использовать темную тему?

ответ

1

Вам нужно обернуть все внутри MuiThemeProvider в один элемент.

<MuiThemeProvider muiTheme={getMuiTheme(darkBaseTheme)}> <div> <AppBar title="I am dark" /> <MyCustomComponent label="I should be dark but I am not" /> </div> </MuiThemeProvider>

на самом деле вы должны были иметь ошибку как

MuiThemeProvider.render(): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.

Конечно только Material-UI компоненты внутри вашего MyCustomComponent будут тематические внешний вид. Все остальное вам нужно сделать вручную: в пути, показанный Джефф McCloud или с помощью контекста, как это:

function MyCustomComponent (props, context) { 
    const { palette } = context.muiTheme; 
    // Now you have access to theme settings. for example: palette.canvasColor 
} 

MyCustomComponent.contextTypes = { 
    muiTheme: React.PropTypes.object.isRequired, 
}; 

Еще один способ стилизовать простой HTML или React компонента, чтобы обернуть их в react-theme-provider. Как это:

import ThemeProvider from 'react-theme-provider'; 

<MuiThemeProvider muiTheme={getMuiTheme(darkBaseTheme)}> 
    <div> 
    <AppBar title="I am dark" /> 
    <ThemeProvider> 
     <MyCustomComponent label="I should be dark and I am!" /> 
    </ThemeProvider> 
    </div> 
</MuiThemeProvider> 

ссылка: https://github.com/callemall/material-ui/blob/master/src/styles/MuiThemeProvider.js#L7

+0

Привет, в моем фактическом коде я действительно поставил свои компоненты в один «div», я отредактировал вопрос. Дело в том, что 'Material-UI' внутри' MyCustomComponent' не являются тематическими, хотя они действительно должны. Возможно, я сделал какую-то ошибку, не могли бы вы представить мне очень простой пример, где он работает для вас? –

+0

Хорошо, я думаю, что я понимаю, Material-UI действительно тематический, однако они не обеспечивают цвет фона по умолчанию. Здесь мой темный тематический «MenuItem» выглядит белым на белом фоне, и я думал, что это проблема стиля. –

+0

Yeap, когда-нибудь вам нужно настроить свои собственные элементы (например, 'div' color/background-color), как показано в ответе. если у вас все еще есть проблемы с проверкой кода, или вы можете использовать [этот инструмент] (https://github.com/sm-react/storybook-addon-material-ui) для быстрого тестирования различных тем. –

0

Вам необходимо указать, что ваш пользовательский компонент является «тематическим». Вы можете сделать это, обернув свой компонент в «muiThemeable» высшего порядка компонент:

import React from 'react'; 
import muiThemeable from 'material-ui/styles/muiThemeable'; 

class MyCustomComponent extends React.Component { 
// ... your component will now have access to "this.props.muiTheme" 
} 


export default muiThemeable()(MyCustomComponent); 

ссылка: http://www.material-ui.com/#/customization/themes

+0

Привет, я понимаю ваш ответ, но что я должен делать с «this.props.muiTheme» внутри моего компонента? Чтобы обернуть свои собственные материальные ui-файлы с помощью ''? Проблема заключается не в моих пользовательских компонентах, я понимаю, что thay не может быть автоматически оформлен, однако грандиозные дети Material-UI тоже не тематизируются. –

+0

Предположительно, вы создаете «виджетов» HTML в своем MyCustomComponent? Предположим, что у виджета есть пара DIV, SPAN и кнопка - И вы хотите, чтобы они соответствовали общему взгляду на материал-ui ... Вы можете использовать свойства muiTheme для соответствия цветам, дополнениям, стилям границ и т. Д. вы можете использовать такие значения, как «this.props.muiTheme.palette.accent1Color» или «this.props.muiTheme.appBar.height» или «this.props.muiTheme.spacing.iconSize» в стиле (-ях) ваших DIVs , SPAN и т. Д., Которые составляют ваш компонент. Надеюсь, это поможет! –