我想知道<ThemeProvider/>
在React应用中的位置。
我想出两个解决方案。
1,<ThemeProvider/>
应该在上层根目录组件中仅使用一次
类似于由“ create-react-app”工具创建的index.js
或App.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 />
</>
)
}
}
上面的代码中可能有一些错字,但是我希望这个示例能够清楚地传达我的想法。
答案 0 :(得分:0)
我在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')
);