提问人:Logan Murphy 提问时间:11/17/2023 最后编辑:Logan Murphy 更新时间:11/17/2023 访问量:70
MUIv5 和 tss-react SSR 问题:无法可靠地处理样式定义。CSS prop 中的 ArrowFunctionExpression
MUIv5 and tss-react SSR issue: Unable to handle style definition reliably. ArrowFunctionExpression in CSS prop
问:
我正在将我的 mui 迁移到 v5,并且遇到了 makeStyes“插值”模式的问题,如下所示:
const useStyles = makeStyles((theme) => ({
root: {
backgroundColor: (props) => {
let bgColor = "inherit"
if (props.colorPalette.toLowerCase() === COLORS.SAND) {
bgColor = theme.palette.background.sand
} else if (props.isGreenBG) {
bgColor = theme.palette.primary.main
} else {
bgColor = theme.palette.common.white
}
return bgColor
},
},
heading: {
color: (props) => {
if (props.isGreenBG) {
return theme.palette.common.white
}
return theme.palette.primary.main
},
marginBottom: `15px`,
letterSpacing: `normal`,
[theme.breakpoints.down(`xs`)]: {
fontSize: `2rem`,
lineHeight: `2rem`,
},
},
subhead: {
color: (props) => {
if (props.isGreenBG) {
return theme.palette.common.white
}
return theme.palette.common.black
},
lineHeight: `1.5rem`,
fontSize: `1.25rem`,
[theme.breakpoints.down(`md`)]: {
lineHeight: `1.125rem`,
fontSize: `1rem`,
},
},
body: {
color: (props) => {
if (props.isGreenBG) {
return theme.palette.common.white
}
return theme.palette.text.lightHeader
},
},
}))
export const MyComponent = ({ colorPalette }) => {
const isGreenBG = colorPalette.toLowerCase() === COLORS.GREEN1
const classes = useStyles({
isGreenBG,
colorPalette,
})
// ...rest of component, for example...
return <h1 className={classes.heading}>Just an example</h1>
}
我使用了 code-mod 并发现了这些 TODO: // TODO jss-to-tss-react codemod: 无法可靠地处理样式定义。CSS 属性中的 ArrowFunctionExpression。
有没有办法用 SSR 支持这种类型的模式?它在 CSR 中按预期工作,除了重写之外,我在任何地方都找不到解决方案,但保持此功能会很好。谢谢!
答:
1赞
Ryan Cogswell
11/17/2023
#1
tss-react 不支持单个样式规则或 CSS 道具的函数,但调用的主体是一个函数,因此所有逻辑都可以移动到该函数的顶部。makeStyles
下面是您的代码的工作版本(尽管我将样式精简为和)。除了将函数逻辑移动到样式定义上方之外,还需要在调用的第一行主题之后指定参数(例如 )。root
heading
makeStyles
(theme, { colorPalette, isGreenBG })
import { makeStyles } from "tss-react/mui";
const useStyles = makeStyles()((theme, { colorPalette, isGreenBG }) => {
let bgColor = "inherit";
if (colorPalette.toLowerCase() === "sand") {
bgColor = theme.palette.background.sand;
} else if (isGreenBG) {
bgColor = theme.palette.primary.main;
} else {
bgColor = theme.palette.common.white;
}
const color = isGreenBG
? theme.palette.common.white
: theme.palette.primary.main;
return {
root: {
backgroundColor: bgColor
},
heading: {
color,
marginBottom: `15px`,
letterSpacing: `normal`,
[theme.breakpoints.down(`xs`)]: {
fontSize: `2rem`,
lineHeight: `2rem`
}
}
};
});
const MyComponent = ({ colorPalette }) => {
const isGreenBG = colorPalette.toLowerCase() === "green1";
const { classes } = useStyles({
isGreenBG,
colorPalette
});
return (
<div className={classes.root}>
<h1 className={classes.heading}>Just an example</h1>
</div>
);
};
export default function Demo() {
return <MyComponent colorPalette="green1" />;
}
评论
1赞
Logan Murphy
11/17/2023
哦,伙计,我不知道为什么我没有想到这一点,看到它后似乎很明显。这是一个巨大的帮助,非常感谢!
1赞
Logan Murphy
11/17/2023
说真的,谢谢。在过去的一周里,我一直在致力于将一个庞大的复杂组件库从 mui v4 迁移到 v5,这是最后一个障碍。
评论
colorPalette
isGreenBG
useStyles
makeStyles
useStyles
colorPalette
isGreenBG