reactjs - 样式组件中 'ThemeProvider' 的最佳实践是什么?

标签 reactjs styled-components

我想知道哪里<ThemeProvider/>应该放在 React 应用程序中。

我想出了两个解决方案。

1、<ThemeProvider/>应该在顶级组件中使用“仅一次”
喜欢 index.jsApp.js由“create-react-app”工具创建的文件。

2、<ThemeProvicer/>应放置在“React-component 的每个根”中
字面上地。

为了澄清起见,我将向您展示一些示例。
只有两个组件,“红色”和“蓝色”<div>标签。

1、<ThemeProvider/>用过“只要一次”

// In './red.js'
import React from 'react'
import styled from "styled-components"

const Red = styled.div`background: ${props => props.theme.mainColor}`

export default function RedDiv() {
    return (
        //NOT using ThemeProvider
        <Red />
    )
}

// In './blue.js'
......

const Blue = styled.div`background: ${props => props.theme.subColor}`

export default function BlueDiv() {
    return (
        <Blue />
    )
}

// In './App.js'
import React, { Component } from 'react'
import { ThemeProvider } from "styled-components"
import myTheme from "./myTheme
import Red from "./red"
import Blue from "./blue"

export default class App extends Component { 
    render() {
        return (
            //only used here just once
            <ThemeProvider theme={myTheme}>
                <>
                    <Red />
                    <Blue />
                </>
            </ThemeProvider>
        )
    }
}

2、<ThemeProvider/>使用“React-component 的每个根”
// In './red.js'
import React from 'react'
import styled, { ThemeProvider } from "styled-components"

const Red = styled.div`background: ${props => props.theme.mainColor} `

export default function RedDiv() {
    return (
        <ThemeProvider theme={myTheme}>
            <Red />
        </ThemeProvider>
    )
}

// In './blue.js'
......

const Blue = styled.div`background: ${props => props.theme.mainColor}`

export default function BlueDiv() {
    return (
        <ThemeProvider theme={myTheme}>
            <Blue />
        </ThemeProvider>
    )
}

// In './App.js'
import React, { Component } from 'react'
import Red from "./red"
import Blue from "./blue"

export default class App extends Component { 
    render() {
        return (
            <>
                // <ThemeProvider/>  is not used
                <Red />
                <Blue />
            </>
        )
    }
}

上面的代码可能有一些错字,但我希望这个例子能清楚地传达我的想法。

最佳答案

我只用过一次,里面index.js .

如果需要,也是添加一些全局样式的好地方。我将它们用于 resetCSS ( http://meyerweb.com/eric/tools/css/reset/ ) 和一些 baseCSS规则如 box-sizing等等。

index.js

import { createGlobalStyle, ThemeProvider } from 'styled-components';
import theme from './styles/theme';
import resetCSS from './styles/resetCSS';
import baseCSS from './styles/baseCSS';
import { BrowserRouter as Router} from "react-router-dom";

const GlobalStyle = createGlobalStyle`
  ${resetCSS}
  ${baseCSS}
`;

React.DOM.render(
  <React.Fragment>
    <GlobalStyle/>
    <Router>
      <ThemeProvider theme={theme}>
        <App/>
      </ThemeProvider>
    </Router>
  </React.Fragment>
  ,document.getElementById('root')
);

关于reactjs - 样式组件中 'ThemeProvider' 的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56310875/

相关文章:

css - React Styled Component 的 CSS 方法优化

reactjs - React hook 渲染额外的时间

javascript - 我的模态触发器根据 id 渲染所有模态而不是特定模态

mongodb - Meteor/ReactJS - UI 闪烁问题 : rendering twice before and after checking a database

reactjs - React、样式组件和 TypeScript : How to wrap a styled component in a functional component

reactjs - 设置导入的样式组件的样式

javascript - 如何将FlotJs集成到ReactJs中

javascript - TS |元素隐式具有 'any' 类型,因为类型 'string' 的表达式不能用于索引类型 'Record<SecurityMode, boolean>'

reactjs - 如何在样式组件中覆盖嵌套的 material-ui 类?

typescript - 更好的类型函数来生成媒体查询