【发布时间】:2021-10-23 06:50:50
【问题描述】:
我在渲染大量组件时遇到问题,其中每个组件都有一个useStyles。我们希望组件道具影响样式,所以我们结合道具和主题设置。工作正常,除了它非常慢而且我将其缩小到它是由 makeStyles 中的 prop 方法引起的。
实际上是否使用该类并不重要。如果所有类都是静态的,它会很快,但如果我添加一个未使用的类作为方法,它会很慢。道具也无所谓,如果我添加test: { fontWeight: () => 'bold' } 它会再次变慢。
确实很奇怪。我正在使用 Material UI ^4.11.0。不是最新版本的 v4。漏洞?有人听说过这个吗?有人有更好的解决方案来添加基于道具的样式并同时使用主题吗?任何人都通过使用 useMemo 或任何东西获得了性能改进? (我试过没有效果)。
const useStyles = makeStyles(({ typography }) => ({
fontFamily: {
fontFamily: ({ fontFamily }: any) => fontFamily,
},
fontFamilySecondary: {
fontFamily: typography.fontFamilySecondary,
},
...filterCustomVariants(typography),
bold: {
fontWeight: typography.fontWeightBold,
},
boldScondary: {
fontWeight: typography.fontWeightBoldSecondary,
},
italic: {
fontStyle: "italic",
},
thisIsNotEvenUsed: {
fontWeight: () => {
console.log("Running running running") // Runs many times anyway!
return "bold"
},
},
}))
以及实现:
const styleProps = { fontFamily: fontFamily }
const classes = useStyles(styleProps)
编辑:这是一个 CodeSandbox,它使用最新的 MUI v4 显示了这种行为,并且没有我的应用程序复杂性:https://codesandbox.io/s/black-monad-tr05l?file=/src/App.tsx
【问题讨论】:
-
看来您使用
makeStyles的方式有误。类似问题:stackoverflow.com/q/69608311/9449426 -
@NearHuscarl 你是对的,我确实用错了方法。我现在在上面更新了我的代码示例。恐怕它并没有让事情变得更快,而且 thisIsNotEvenUsed 类仍然运行数百次,即使它没有使用的类。
-
您的代码中一定有其他问题。你能添加使用
useStyles的整个组件吗? -
@NearHuscarl 不,在这里看看我的沙盒链接:codesandbox.io/s/black-monad-tr05l?file=/src/App.tsx
标签: reactjs performance material-ui