Какова лучшая практика 'ThemeProvider' в styled-компонентах? - PullRequest
1 голос
/ 26 мая 2019

Я хочу знать, где <ThemeProvider/> должно быть размещено в приложении React.

Я бы придумал два решения по этому поводу.

1, <ThemeProvider/> следует использовать «Just Once» в верхнем корневом компоненте например index.js или App.js файл, созданный инструментом 'create-реагировать-приложение'.

2, <ThemeProvicer/> следует поместить в «Каждый корень React-компонента» в буквальном смысле.

для пояснения, я покажу вам пример. есть только два компонента, 'Red' и 'Blue' <div> tag.

1, <ThemeProvider/> используется «Just Once»

// 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 голосов
/ 27 мая 2019

Я использую его только один раз, внутри 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')
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...