Я хочу знать, где <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 />
</>
)
}
}
Возможно, в приведенном выше коде есть опечатка, но я надеюсь, что этот пример ясно продемонстрирует мою идею.