2017-05-11 2 views

답변

2

주제를 상태로 유지하는 배치 구성 요소에 테마를 넣을 수 있습니다. React's context을 사용하여이 구성 요소는 자식 구성 요소에 기능을 노출하여 상태를 변경합니다.

import React, { Component } from 'react'; 
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 
import getMuiTheme from 'material-ui/styles/getMuiTheme'; 
import PropTypes from 'prop-types'; 
import theme from './theme'; 
import themeOther from './theme-other' 

class Wrapper extends Component { 
    static childContextTypes = { 
    changeTheme: PropTypes.func 
    }; 

    constructor(props) { 
    super(props); 
    this.state = { 
     muiTheme: getMuiTheme(theme) 
    }; 
    } 

    getChildContext() { 
    return {changeTheme: this.changeTheme}; 
    } 

    changeTheme =() => { 
    this.setState({ 
     muiTheme: getMuiTheme(themeOther) 
    }) 
    }; 

    render() { 
    return (
     <MuiThemeProvider muiTheme={this.state.muiTheme}> 
     {this.props.children} 
     </MuiThemeProvider> 
    ) 
    } 
} 

export default Wrapper; 

일부 하위 구성 요소에서 당신은 컨텍스트에 액세스 상태에서 다른 테마를 설정 changeTheme 함수를 호출 할 수 있습니다. contextTypes를 포함 시키십시오. 그렇지 않으면 함수에 액세스 할 수 없습니다.

import React, { Component } from 'react'; 
import RaisedButton from 'material-ui/RaisedButton'; 
import PropTypes from 'prop-types' 

class ChildComponent extends Component { 
    static contextTypes = { 
    changeTheme: PropTypes.func 
    }; 

    render() { 
    return (
     <RaisedButton 
     primary 
     onTouchTap={this.context.changeTheme} 
     label="Change The Theme" 
     /> 
    ); 
    } 
} 

export default ChildComponent; 

앱의 루트에 래퍼를 렌더링하면됩니다.

ReactDOM.render(
    <Wrapper> 
    <App /> 
    </Wrapper>, 
    document.getElementById('root') 
); 

편집 : 내 최초의 솔루션을 너무 많이 ABIT되었을 수 있습니다. 이후 전체 애플 리케이션을위한 전체 테마를 대체하고 있습니다. MuiThemeProvider를 트리처럼 사용할 수도 있습니다.

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import App from './App'; 
import './index.css'; 
import inject from 'react-tap-event-plugin'; 
inject(); 

import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 
import getMuiTheme from 'material-ui/styles/getMuiTheme'; 
import theme from './theme'; 

ReactDOM.render(
    <MuiThemeProvider muiTheme={getMuiTheme(theme)}> 
    <App /> 
    </MuiThemeProvider>, 
    document.getElementById('root') 
); 

하위 구성 요소에서 MuiThemeProvider를 다시 사용하고 일부 속성을 무시할 수 있습니다. 이러한 변경은,이 MuiThemeProvider 내의 모든 아이에 반영됩니다.

import React, { Component } from 'react'; 
import RaisedButton from 'material-ui/RaisedButton'; 

import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 
import getMuiTheme from 'material-ui/styles/getMuiTheme'; 
import theme from './theme'; 
import { green800, green900 } from 'material-ui/styles/colors'; 

const localTheme = getMuiTheme(Object.assign({}, theme, { 
    palette: { 
    primary1Color: green800, 
    primary2Color: green900 
    } 
})); 

class App extends Component { 
    render() { 
    return (
     <div> 

     <RaisedButton 
      primary 
      label="Click" 
     /> 


     <MuiThemeProvider muiTheme={localTheme}> 
      <RaisedButton 
      primary 
      label="This button is now green" 
      /> 
     </MuiThemeProvider> 


     </div> 
    ); 
    } 
} 

export default App; 
관련 문제