Javascript 反应器&;如何正确分享风格?

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

我想在我的整个webapp之间共享样式

我的问题:我目前使用的
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:现在,就样式共享的基本原理而言,由于主题提供程序在内部是一个上下文提供程序,它将减少组件

    有四个样式范围:

  • 全局样式替代:您提到它是公共样式