样式组件中“ ThemeProvider”的最佳实践是什么?

时间:2019-05-26 05:23:23

标签: reactjs styled-components

我想知道<ThemeProvider/>在React应用中的位置。

我想出两个解决方案。

1,<ThemeProvider/>应该在上层根目录组件中仅使用一次 类似于由“ create-react-app”工具创建的index.jsApp.js文件。

2,<ThemeProvicer/>应该放在“ React组件的每个根目录”中 从字面上看。

为澄清起见,我将向您展示一些示例。 只有两个部分,“红色”和“蓝色” <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组件的每个根”

// 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 />
            </>
        )
    }
}


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

1 个答案:

答案 0 :(得分:0)

我在index.js内只使用过一次。

如果需要,也可以添加一些全局样式。我将它们用于resetCSShttp://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')
);