reactjs - react 动态主题

标签 reactjs sass themes

我有一个 React 16 应用程序,希望允许用户通过按下按钮来更改整个应用程序(包括所有路由)的主题。

例如,我可以在 SCSS 中有两个主题:

.theme-1 {
    background-color: $bg-color-1;
    color: $color-1;
}
.theme-2 {
    background-color: $bg-color-2;
    color: $color-2;
}

然后我会有一个按钮,如下所示:

<Button onClick={ this.changeTheme() }

这可以做到吗?具体来说,我想弄清楚这两部分:

  1. 如何在需要使用各种 background-colorcolor 的所有组件上设置主题。
  2. changeTheme() 函数的逻辑。它到底如何触发所有受影响组件的重新渲染。

谢谢!

最佳答案

最好的方法是使用 css variables .

您需要使用 css 变量指定您的主题,并在某些用户操作中在您的网站中添加其他 css。

  1. 创建单一主题,就像您上面提到的那样

     --color: blue;
     --bg-color: red;
     .theme {
         background-color: var(--bg-color);
         color: (--color);
     }
    
  2. 在组件内添加其他样式

    {this.state.useTheme && <style type="text/css">
        :root {
            --color: blue;
            --bg-color: red;
        }   
    </style>}
    
  3. 更改用户点击标记

    <div onClick={this.setState({useTheme: true})}> Apply theme </div>
    

或其他变体

  • 创建额外的 theme.css 文件,在其中指定不同的变量

    --bg-color: yellow;
    --color: green;
    
  • 将其附加到某些用户操作上。代码来源来自 here

    { var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); 链接.id = cssId; link.rel = '样式表'; link.type = '文本/css'; link.href = 'http://your-website.com/path-to-css-file/theme.css'; link.media = '全部'; head.appendChild(链接); }}> 改变主题
  • 通过这样做,您将避免大量代码重复。因为您不需要创建多个主题。您只需要在更改时添加少量额外的 css,这样您就可以创建很多主题,甚至让用户自定义它们。

    关于reactjs - react 动态主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52261260/

    相关文章:

    reactjs - 如何在不播放Reactjs视频的情况下获得Youtube视频的时长

    javascript - 使用 *客户端* 上的 React 验证电子邮件帐户是否处于事件状态

    delphi - 用于 Web 皮肤/主题的 VCL?

    ios - 我的本地人在构建tvOS时遇到问题,但iOS成功

    reactjs - 使用 admin-on-rest 添加嵌套资源

    css - 我怎样才能抓取一堆 scss 文件并为所有应用程序制作一个 css 文件

    sass - Foundation 4 中的最小网格宽度?

    javascript - 有没有办法在 react 中使用 JS 动态更新 scss 变量?

    vim - iTerm 中的主题在 vim 中改变颜色

    wordpress - 如何将 LTR wordpress 主题更改为 RTL