reactjs - Typade props när man använder Material UI makeStyles
Jag försöker migrera några av mina React-komponenter till det nya makeStyles/useStyles-hook-API från Material UI. Om jag förstår det rätt kan jag fortsätta att ta emot classes som en prop från föräldrakomponenter så länge jag skickar props till useStyles:
const MyComponent = (props: Props) => {
const { myProp } = props;
const classes = useStyles(props);
Jag undrade hur man deklarerar min Props-typ i det fallet. Motsvarigheten med HOC API är:
const styles = createStyles({
a: {},
b: {}
});
interface Props extends WithStyles<typeof styles> {
myProp: string;
}
Här är något som fungerar men ser lite omständligt ut:
const styles = createStyles({
a: {},
b: {}
});
interface Props extends StyledComponentProps<ClassKeyOfStyles<typeof styles>> {
myProp: string;
}
const useStyles = makeStyles(styles);
Finns det ett bättre sätt? Helst utan behov av createStyles och genom att använda makeStyles direkt med stildeklarationen.
Svar #1
För att veta vid kompileringstid vilka egenskaper/klasser som deklarerades använde jag en sådan lösning.
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;
Viktigt ögonblick här - glöm inte att deklarera typ för classes-konstanten.
Du kan återanvända dessa typer i andra komponenter och ha all nödvändig information.
