reactjs - 使用 Material UI makeStyles 时输入的 props

标签 reactjs typescript material-ui

我正在尝试将一些 React 组件从 Material UI 迁移到新的 makeStyles/useStyles Hook API。如果我理解正确的话,只要我将 Prop 传递给 useStyles,我就可以继续接受 classes 作为来自父组件的 Prop :

const MyComponent = (props: Props) => {
  const { myProp } = props;
  const classes = useStyles(props);

我想知道在这种情况下如何声明我的 Props 类型。 HOC API 的等效项是:

const styles = createStyles({
  a: {},
  b: {}
});

interface Props extends WithStyles<typeof styles> {
  myProp: string;
}

这是可行的,但看起来有点冗长:

const styles = createStyles({
  a: {},
  b: {}
});

interface Props extends StyledComponentProps<ClassKeyOfStyles<typeof styles>> {
  myProp: string;
}

const useStyles = makeStyles(styles);

还有更好的办法吗?理想情况下不需要 createStyles 并使用 makeStyles 与样式声明内联。

最佳答案

为了在编译时了解声明了哪些属性/类,我使用了这样的解决方法。

import React from 'react';
import { Theme, makeStyles } from '@material-ui/core';
import { BaseCSSProperties } from '@material-ui/core/styles/withStyles';

interface StyleProps {
    root: BaseCSSProperties,
}

type PropsClasses = Record<keyof StyleProps, string>

let baseStyle: StyleProps = {
    root: {
        color: "red",
    },
};

const useStyles = makeStyles<Theme, StyleProps>(() => baseStyle as any);

const MyComponent = () => {
    const classes: PropsClasses = useStyles({} as StyleProps);
    return (<div className={classes.root}>This is root!</div>)
}

export default MyComponent;

这里的关键时刻 - 不要忘记声明常量的类型。

您可以在其他组件中重用此类型并拥有所有必需的信息。

关于reactjs - 使用 Material UI makeStyles 时输入的 props,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56326428/

相关文章:

json - 如何使用ReactJs将json数据显示为表格

javascript - 在子悬停时更改父背景

reactjs - 如何在 React-native 中循环数据数组?

reactjs - React Material UI 在首次渲染时找不到移动设备

javascript - 类型错误 : Cannot read property 'carts' of null

javascript - 如何从 Angular 6 或 7 组件内的 LESS 文件访问 style.less 中的 LESS 变量?

typescript - 进行 Jest 测试以在抛出任何错误时失败?

javascript - React Material-UI 状态未更新

reactjs - 如何使用 Material UI 在应用栏下方打开下拉菜单?

javascript - 将新对象作为参数传递给仅更改 1 个值的函数