使用 Material UI makeStyles 时键入的道具

Posted

技术标签:

【中文标题】使用 Material UI makeStyles 时键入的道具【英文标题】:Typed props when using Material UI makeStyles 【发布时间】:2019-10-13 01:13:11 【问题描述】:

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

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

【问题讨论】:

我正在寻找同样的东西。您找到更好的方法了吗? @rareyesdev 不幸的是,我仍在使用我非常冗长的版本 【参考方案1】:

从 TypeScript 2.8 开始,您拥有 ReturnType 实用程序类型:

import  makeStyles  from '@material-ui/styles'

const myStyles = makeStyles(
  root: 
    margin: '0',
  ,
  foo: 
    background: '#f1f1f1',
  ,
  bar: 
    marginRight: '12px',
  ,
)

type MyStylesType = ReturnType<typeof myStyles>

// use MyStylesType as type

【讨论】:

【参考方案2】:

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

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;

关键时刻 - 不要忘记为 classes 常量声明类型。

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

【讨论】:

以上是关于使用 Material UI makeStyles 时键入的道具的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Reactjs Material UI 上使用 CSS @media 响应 makeStyles?

高阶组件和 Material-UI 的 makeStyles 的样式问题

在 React 中使用 material-ui makeStyles 的钩子调用无效

React Material-UI 中“makeStyles”的内部实现?

Material-UI Typescript 如何在组件类中从 makeStyle() 创建样式实例

material-ui makeStyles:如何按标签名称设置样式?