reactjs - React Material-UI 中“makeStyles”的内部实现?
问题描述
这个问题的目的是了解幕后发生的事情。每次我找到代码时,makeStyles()
我都觉得我只是在做一个纯粹的复制粘贴,而不了解引擎盖下发生的事情。所以我想在这里发布一个问题,以便有人可以帮助我。
我在许多 React 应用程序中看到了以下类型的代码。当我们打电话给 时,我很想知道发生了什么makeStyles()
。所以我跳入了它的定义,但我无法理解它的含义。有人可以帮助我了解如何阅读/理解它。
我在这里理解的是我正在传递一个带有名为theme
. 通过该功能后,我不知道发生了什么。如果有人也能帮助我解决这个问题,我将不胜感激。
// Calling makeStyles()
const useStyles = makeStyles(theme => ({
root: {
display: 'flex',
},
drawer: {
[theme.breakpoints.up('sm')]: {
width: drawerWidth,
flexShrink: 0,
},
},
appBar: {
marginLeft: drawerWidth,
[theme.breakpoints.up('sm')]: {
width: `calc(100% - ${drawerWidth}px)`,
},
},
menuButton: {
marginRight: theme.spacing(2),
[theme.breakpoints.up('sm')]: {
display: 'none',
},
},
toolbar: theme.mixins.toolbar,
drawerPaper: {
width: drawerWidth,
},
content: {
flexGrow: 1,
padding: theme.spacing(3),
},
}));
//definition of makeStyles()
import { Theme as DefaultTheme } from './createMuiTheme';
import { Styles, WithStylesOptions } from '@material-ui/styles/withStyles';
import { StylesHook } from '@material-ui/styles/makeStyles';
export default function makeStyles<
Theme = DefaultTheme,
Props extends {} = {},
ClassKey extends string = string
>(
styles: Styles<Theme, Props, ClassKey>,
options?: WithStylesOptions<Theme>,
): StylesHook<Styles<Theme, Props, ClassKey>>;
解决方案
输入/输出/副作用的高级图片
制作样式
- 概述:此函数通常在 JavaScript 文件的顶层调用(而不是从组件/函数中),它返回一个函数(通常称为
useStyles
),该函数将在函数组件中使用。 - 输入:样式对象或样式对象创建函数
- 如果输入是一个对象,则假定该对象的每个属性都定义了一个样式规则。属性名称是规则名称,属性值是具有 CSS 属性和/或嵌套规则的对象。每个样式规则稍后将用于生成 CSS 类。
- 如果输入是一个函数,则假定它是一个函数,它接收主题作为参数,然后返回一个样式对象,该对象具有在输入是对象的情况下描述的结构。
- 在makeStyles 函数声明中,此输入被调用
stylesOrCreator
。然后由getStylesCreator 函数将其规范化为具有create
指向将返回样式对象的函数的属性的对象。
- 输出:
useStyles
函数- 由返回的函数
makeStyles
通常被调用useStyles
并且是一个自定义钩子。这意味着它只能从函数组件中调用,并且必须无条件调用。 - 在返回此
useStyles
函数时,几乎没有发生任何事情。该函数知道它的stylesCreator,但还没有使用它。通过stylesCreator 的 options,该useStyles
函数知道index
稍后将用于确定<head>
这些样式相对于makeStyles
/的其他调用生成的其他样式表在样式表中的位置useStyles
。
- 由返回的函数
- 副作用:增加一个全局计数器,该计数器用于确定由
<head>
生成的样式表中的索引makeStyles/useStyles
。
使用样式
- 概述:这是返回的函数
makeStyles
。应该从函数组件中调用它以获取classes
下面描述的对象。 - 可选输入:
props
对象- 如果通过,这通常
props
是使用它的函数组件的。然后,这将作为参数传递给值是函数的任何样式规则。 - 您可以在以下答案中看到使用此功能的示例:
- 如果通过,这通常
- 输出:
classes
对象- 此对象将样式对象中的每个样式规则名称映射到生成的 CSS 类名称。然后,您可以利用
classes.rulename
组件渲染将该 CSS 类应用于元素。
- 此对象将样式对象中的每个样式规则名称映射到生成的 CSS 类名称。然后,您可以利用
- 副作用:将样式表添加到
<head>
包含每个样式规则的 CSS 类的 DOM 中。
主要工作发生在哪里
当您调用该useStyles
函数时,大部分魔法都会发生。函数的开始在这里。以下是它执行的关键步骤:
- 调用attach。attach 函数执行以下关键步骤:
- 调用stylesCreator.create来获取您的样式对象。
- 利用JSS根据您的样式对象创建样式表。JSS 也在这里生成将在
classes
对象中的类名。 - 将此样式表附加到 DOM 中适当位置的
<head>
.
- 返回类对象
- 如果发生某些事情触发重新创建 CSS 或组件卸载,则调用detach以删除先前生成的样式表。
推荐阅读
- javascript - 使用 local-storage 将数组存储为值并更新它
- c# - MIP SDK 在调用配置文件 AddEngineAsync 时出现访问被拒绝错误
- reactjs - react-router-dom 的问题
- reactjs - 通过 contentful-cli 创建的扩展不会在 localhost 上加载
- apache-nifi - 使用嵌套依赖测试 Nifi 类
- python - 当我不在我的函数中使用它时,为什么我们需要 func.TimerRequest?
- firebase - Flutter Provider 仅在热重载后显示结果
- html - 如何使用剪辑路径在图像中设置形状
- flutter - Flutter 驱动程序处理最小化的应用程序
- terraform - 如果存在现有资源,则将其用作数据