更改<body>元素上的样式

ama*_*may 2 reactjs material-ui

我是React的新手,所以这可能很简单,但是我无法在文档中找到任何内容,因为该元素在ReactDOM之外。

我在用户界面上使用了Material-ui,它提供了两个主题:(lightBaseTheme默认)主题和darkBaseTheme深色主题。白天和黑夜模式的排序。问题在于,这两个样式均未应用任何样式,<body>因此页面背景不会遵循主题。深色主题使用白色文本,该文本不会显示在默认的白色背景上。

我怀疑我需要找到一个编程解决方案,并根据当前加载的主题设置背景色。

但是如何?我尝试将代码放入顶级组件的componentDidUpdate方法中,但这似乎总是返回浅色主题。无论如何,我不确定直接写入DOM是一个好习惯,即使该body元素在任何会受到React影响的内容之外。

export default class app extends React.Component {

    componentDidUpdate () {
        const muiTheme = getMuiTheme();
        const canvasColor = muiTheme.palette.canvasColor;
        document.body.style.backgroundColor = canvasColor;
    }

    render () {
        const muiTheme = getMuiTheme();
        return (
            <MuiThemeProvider muiTheme={getMuiTheme(darkBaseTheme)}>
                <span>Rest of the app goes here</span>
            </MuiThemeProvider>
        );
    }
};
Run Code Online (Sandbox Code Playgroud)

即使在render调用中设置了lightBaseTheme,对componentDidUpdate中的getMuiTheme的调用也始终返回lightBaseTheme。

我也许应该补充一点,最终目的是能够即时更改主题,因此不能直接设置<body元素的样式。

Bra*_*ugh 6

如果可能的话,最好的解决方案是div除了使用样式道具来解决您的问题之外,还可以在React应用程序中使用顶层。

但是,您现在拥有的东西将无法使用,因为componentDidUpdate()不会在初始化时被调用,并且加载后似乎没有任何东西用props / state更新。

发生更新后,立即调用componentDidUpdate()。初始渲染不调用此方法。(React Docs

相反,请使用componentDidMount(),在组件安装到DOM时立即调用。

挂载组件后立即调用componentDidMount()。需要DOM节点的初始化应在此处进行。如果需要从远程端点加载数据,这是实例化网络请求的好地方。在此方法中设置状态将触发重新渲染。(React Docs

这是有关组件生命周期的好文章