- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个问题,我渲染了很多组件,其中每个组件都有一个 useStyles
。我们希望组件 Prop 影响样式,所以我们将 Prop 和主题设置结合起来。工作正常,除了它非常慢,我已经将它缩小到它是由 makeStyles
中的 prop 方法引起的。
类是否被使用其实并不重要。如果所有类都是静态的,它会很快,但如果我添加一个未使用的类,它是一个方法,它会很慢。 Prop 也不重要,就像如果我添加 test: { fontWeight: () => 'bold' }
它会再次变慢。
确实很奇怪。我正在使用 Material UI ^4.11.0。不是最新版本的 v4。漏洞?有人听说过这个吗?有人有更好的解决方案来添加基于 Prop 的样式并同时使用主题吗?任何人都通过使用 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
最佳答案
这不是错误,v5 中的 makeStyles
行为方式相同。使用回调的动态样式是 JSS feature .但众所周知,JSS 的动态性能非常糟糕(有关更多详细信息,请参阅 performance 部分,它比 emotion 慢大约 6 倍)。这是 MUI 团队决定放弃它以支持大量使用动态样式的 v5 中的情感的原因之一。
是的,即使您没有在内部传递任何内容并且没有使用 classes
对象,它也会始终调用回调。它遍历样式对象和invoke every callbacks它在您调用 useStyles
时找到。有关 makeStyles
工作原理的更多详细信息,我建议您阅读 this瑞安的回答。
const useStyles = makeStyles({
thisIsNotEvenUsed: {
fontWeight: () => {
console.log("Running running running"); // Runs many times anyway!
return "bold";
}
}
});
const unusedClasses = useStyles(); // generate the styles
有一些策略可以提高性能。最简单的(视情况而定)是升级到 v5 以利用情感及其有效生成动态样式的能力。另一种方法是使用内联样式:
<Typography style={{ fontWeight: props.fontWeight }}>
但是如果你不想用内联样式污染你的组件,你仍然可以使用 makeStyles
通过在包含大量样式的容器中创建嵌套样式来使用“样式注入(inject)”方法内部元素的数量(Grid
、List
、Stack
...)
const useStyles = makeStyles({
root: {
"& MuiTypography-root": {
fontWeight: () => 'bold'
}
}
});
<div className={classes.root}>
{[...Array(100)].map((_, index) => {
return <Text key={`text_${index}`}>Text Component</Text>;
})}
</div>
关于reactjs - MUI - 如果在方法中使用 Prop ,则 makeStyles 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69685820/
我正在学习 MUI,在类(class)中,讲师要求我只设计一个组件而不是整个主题。 为此,它使用 制作样式 功能和传播theme.mixins.toolbar .问题是当我这样做时,出现以下错误: T
我正在尝试为我的 React 组件添加更好的测试覆盖率,而我无法模拟的地方之一就是这个内部 export const useTabStyles = makeStyles(({ options: { c
如何将 makeStyle 类从父组件传递到子组件并将它们与子组件中的 makeStyle 类组合?例如。如下添加断点隐藏到子组件样式。 示例子组件: import React from "react
我做了一些研究,但未能找到解决方案。 我正在尝试使用 createMuiTheme 创建一个主题,并稍后在 makeStyles 中使用它来检索内部的键。 (示例中的调色板)但是,自定义主题似乎没有在
我需要知道如何在选择根时定位“元素” 这是 makeStyles: const useStyles = makeStyles(theme => ({ root:{ '&.select
尽管尝试了多种方法来为 backgroundImage 属性加载图像,但它从未出现在页面中。加载外部图像(例如来自谷歌)按预期工作。 我试过: backgroundImage: `url(${Papy
如何将 Prop 填充值传递给 makeStyles 的关键帧?我必须指定初始状态才能传递 prop 吗? 它适用于颜色但不适用于填充值。 ---Child component const useSt
我正在尝试使用 覆盖 Stepper 组件中的伪类makeStyles : const useStyles = makeStyles((theme) => ({ active: { col
我在一个代码库中工作,随着时间的推移,我们对我们的页面和组件进行了许多更改,因此导致了许多现在没有使用的样式。我们想清理我们的代码库并删除所有未使用的 makeStyles 属性。 我们的样式是从一个
我想知道是否可以使用 MakesStyles 仅将样式应用于子元素,例如在普通的 HTML/CSS 项目中: Title! .parent h1 { color: #f00; } 这将为
我正在尝试处理多个 className(s) 以自定义 HTML 元素的样式,但我不明白如何复制这种情况 .class1.class2 (css) 与 makeStyle react 的方法。 情况很
我正在从事一个需要以下 CSS 代码的元素。 .hexagon, .hexagon::before, .hexagon::after { width: 67px; height: 116px;
我正在从事一个需要以下 CSS 代码的元素。 .hexagon, .hexagon::before, .hexagon::after { width: 67px; height: 116px;
这个问题在这里已经有了答案: Material-UI withStyles doesn't apply any kind of styles (1 个回答) 关闭 3 年前。 当我使用 withSt
我有这个风格 background: "-moz-linear-gradient(180deg, rgba(0,0,0,0.88) 0%, rgba(0,0,0,0.5) 66%,
我刚刚更新到 5.0.0-alpha.25(来自 5.0.0-alpha.10),现在 makeStyles 无法正常工作。我在与它相关的重大更改中找不到任何内容,所以我想知道它是否是一个错误。检查元
我在 CSS/样式方面做得很差,希望能得到一些帮助 我试图根据屏幕宽度更改某些卡片的高度。使用 let mainContainerHeight = window.innerWidth
我需要在 makeStyles 内的多个样式中传播通用样式。这适用于我的 jsx,但是当我移动到 tsx 时会出错。 const abc = { fontWeight: 600, te
这个问题已经有答案了: Internal implementation of "makeStyles" in React Material-UI? (2 个回答) 已关闭 1 年前。 我刚刚开始学习
在 Material-UI ,有 makeStyles 函数可用于获取自定义 CSS 样式。 如果我没有在该特定 CSS 中使用主题,我应该使用它吗? 例如: import React from "r
我是一名优秀的程序员,十分优秀!