- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要根据站点的当前部分稍微更改主题。
似乎 MuiThemeProvider
只在加载时设置 muiTheme
;但需要在 props 变化时更新。
如何做到这一点?
最佳答案
您可以尝试将主题放在包装组件中,使主题保持其状态。使用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')
);
编辑:我的第一个解决方案可能有点太多了。因为您要替换整个应用程序的整个主题。您也可以像这样在树下使用 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 并覆盖一些属性。请注意,这些更改将反射(reflect)到此 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;
关于reactjs - MuiThemeProvider : How to use different themes for different routes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43924536/
我在 react 项目中遇到问题。执行项目时,出现以下错误: "Failed prop type: The prop 'theme' is marked as required in MuiTheme
您好,我目前正在使用 Material Ui 开发一个新的 React 应用程序,我选择了一个 css 库。我试图让它与 react-router 一起玩得很好。我不确定应该将 MuiThemePro
我最近使用 npm install --save material ui 在我的 Meteor 应用程序中安装了 Material UI 我得到了 组件出现在我的 app.js 中文件,但每当我添加其
我有一个使用 MuiThemeProvider 的外部组件: 在我的过滤器组件中,我定义了一个自定义样式: const styles = { expan
我有一个带有 Material UI 的 React 应用程序。我知道如何在 body 上设置主题默认背景颜色。但是,我想改为设置背景图像。我怎样才能做到这一点? const theme = crea
我需要根据站点的当前部分稍微更改主题。 似乎 MuiThemeProvider 只在加载时设置 muiTheme;但需要在 props 变化时更新。 如何做到这一点? 最佳答案 您可以尝试将主题放在包
我正在使用 Material UI React 组件开发一个 React 项目。我想像这样在 src/index.js 中导入 MuiThemeProvider从“@material-ui/core/
如何不使用以下代码隐藏/删除 TextField 组件中的下划线: const theme = createMuiTheme({ overrides: { MuiInput: {
我有一个在深色背景上的 Material UI TextField 组件,所以对于这个组件,我想更改它,以便文本和线条的颜色都是红色的。其余的 TextField 实例应保持不变。 我正在使用 @ma
我正在尝试使用从 npm 安装的 react material-ui 主题,当我包含“从“material-ui/styles/MuiThemeProvider”导入 MuiThemeProvider
我将 Material UI 与 React 结合使用来创建下拉菜单。如果我将下拉组件保留在我的 src/app.js 中,一切都很好。但是,如果我将它移动到一个单独的文件 fruits.js,我会收
我是一名优秀的程序员,十分优秀!