Javascript 反应器&;如何正确分享风格?
我想在我的整个webapp之间共享样式 我的问题:我目前使用的Javascript 反应器&;如何正确分享风格?,javascript,reactjs,material-ui,jsx,Javascript,Reactjs,Material Ui,Jsx,我想在我的整个webapp之间共享样式 我的问题:我目前使用的makeStyles如下: 组件A.js const useStyles = makeStyles({ specific_style: { padding: '24px', // etc. } }) function foo() { const classes = useStyles(); return ( <div className={cl
makeStyles
如下:
组件A.js
const useStyles = makeStyles({
specific_style: {
padding: '24px',
// etc.
}
})
function foo() {
const classes = useStyles();
return (
<div className={classes.specific_style}>This is a styled div</div>
)
}
const useStyles = makeStyles({
specific_style: {
padding: '24px',
// etc.
}
})
function bar() {
const classes = useStyles();
return (
<div className={classes.specific_style}>This is another styled div</div>
)
}
const useStyles=makeStyles({
具体风格:{
填充:“24px”,
//等等。
}
})
函数foo(){
const classes=useStyles();
返回(
这是一个样式化的div
)
}
组件B.js
const useStyles = makeStyles({
specific_style: {
padding: '24px',
// etc.
}
})
function foo() {
const classes = useStyles();
return (
<div className={classes.specific_style}>This is a styled div</div>
)
}
const useStyles = makeStyles({
specific_style: {
padding: '24px',
// etc.
}
})
function bar() {
const classes = useStyles();
return (
<div className={classes.specific_style}>This is another styled div</div>
)
}
const useStyles=makeStyles({
具体风格:{
填充:“24px”,
//等等。
}
})
功能条(){
const classes=useStyles();
返回(
这是另一个样式的div
)
}
因此,我现在有很多重复的代码。
我想把这些类放到一个主题中,然后像{theme.specific_style}
那样访问它,这可能吗?我试过了,但到目前为止没有成功
有人能和我以及下面的人分享一个工作示例吗?:)
我想到的可能解决方案:
- 我知道使用原生CSS是可能的,但我觉得这不对
- 也可以简单地将style类放入自己的
中,然后导入,但这感觉也不对,因为我已经访问了主题-我想这就是这些样式应该存在的地方.js
makeStyles()一起使用是在整个文件系统中共享样式的一种方法。makeStyles()
函数除了接受对象外,还可以接受函数:
const useStyles = makeStyles((theme) => {
root: {
minWidth: '100%',
color: theme.textColor,
}
}
通过这种方式,可以在样式对象中使用更高级别的主题组件。您需要做的是创建一些主题文件,在其中保存所有共享样式,然后以与导入组件相同的方式导入该对象
import { lightTheme } from './theme';
其他选项包括使用主题提供程序:
您还可以向主题传递一个道具。将主题与makeStyles()
一起使用是在整个文件系统中共享样式的一种方法。makeStyles()
函数除了接受对象外,还可以接受函数:
const useStyles = makeStyles((theme) => {
root: {
minWidth: '100%',
color: theme.textColor,
}
}
通过这种方式,可以在样式对象中使用更高级别的主题组件。您需要做的是创建一些主题文件,在其中保存所有共享样式,然后以与导入组件相同的方式导入该对象
import { lightTheme } from './theme';
其他选项包括使用主题提供程序:
此外,您还可以通过道具传递主题。TL;DR:根据您的讨论,您希望在将样式传递给主题提供商之前制作样式:
const useStyles=makeStyles({specific_style:{space:8},/*more*/});
函数UseTheme(){
const classes=useStyles();
返回();
}
函数DeepChild(){
const theme=useTheme();
返回特定的_样式间距;
}
否则,将传递一个原始对象,而不是CSS类名。
在这件衣服上试试你的风格
NL;PR:现在,就样式共享的基本原理而言,由于主题提供程序在内部是一个上下文提供程序,它将减少组件的数量
有四个样式范围:
全局样式覆盖:您提到它是常见的CSS文件,在制作时可以使用前缀“@Global”来实现。我同意你的看法,不是这里的方式。当库或组件不公开其类名或不通过直接CSS公开类名时,它非常有用
const useStyles=makeStyles(
{'@global':{'.aGlobalStyleClass':{间距:8}/*更多*/}
);
函数UseTheme(){
const classes=useStyles();
返回();
}
全局样式组件覆盖:创建时。这将影响MUI组件的所有实例
//来自MUI的页面
const theme=createMuiTheme({
组成部分:{
//样式表名称⚛️
穆伊布顿:{
样式覆盖:{
//规则名称
textPrimary:{
//一些CSS
颜色:'白色',
},
},
},
},
});
上下文样式组件覆盖:这是您一直在讨论的一个,您可以在其中决定是否覆盖组件初始样式,但是,该组件需要是主题提供程序的使用者。“谨慎应用”,可能会移动useStyles()使用组件的公共父级是更好的解决方案。主要示例使用它
本地样式组件覆盖:您的通用类名={classes.Style}或样式={}。如前所述,调用useStyles()的位置会产生巨大的差异。通过在组件层次结构中向上移动样式创建,减少样式重复
const useStyles=makeStyles({specific_style:{space:8},/*more*/});
函数父函数(){
const classes=useStyles();
返回();
}
函数Child1({classes}){
返回特定的_样式间距;
函数Child2({classes}){
返回特定的_样式间距;
}
我假设您在上下文样式覆盖和本地样式覆盖之间左右为难。两者都有必要,但我将通过沿合成层次结构放大样式来消除任何重复样式,因为主题提供程序中的更改将影响其所有组件子树。TL;DR:根据您的讨论,您希望将样式传递给主题提供程序之前,请执行以下操作:
const useStyles=makeStyles({specific_style:{space:8},/*more*/});
函数UseTheme(){
const classes=useStyles();
返回();
}
函数DeepChild(){
const theme=useTheme();
返回特定的_样式间距;
}
否则,将传递一个原始对象,而不是CSS类名。
在这件衣服上试试你的风格
NL;PR:现在,就样式共享的基本原理而言,由于主题提供程序在内部是一个上下文提供程序,它将减少组件
有四个样式范围:
全局样式替代:您提到它是公共样式