reactjs - Prop-uri tipizate când folosești Material UI makeStyles
Încerc să migrez unele dintre componentele mele React către noul API hook makeStyles/useStyles din Material UI. Dacă am înțeles corect, pot să continui să accept classes ca prop de la componentele părinte atâta timp cât trec props la useStyles:
const MyComponent = (props: Props) => {
const { myProp } = props;
const classes = useStyles(props);
Mă întrebam cum să declar tipul meu Props în acest caz. Echivalentul cu API-ul HOC fiind:
const styles = createStyles({
a: {},
b: {}
});
interface Props extends WithStyles<typeof styles> {
myProp: string;
}
Iată ceva care funcționează, dar arată puțin verbose:
const styles = createStyles({
a: {},
b: {}
});
interface Props extends StyledComponentProps<ClassKeyOfStyles<typeof styles>> {
myProp: string;
}
const useStyles = makeStyles(styles);
Există o metodă mai bună? Ideal fără nevoie de createStyles și folosind makeStyles direct în declarația stilurilor.
Răspuns #1
Pentru a ști la momentul compilării care proprietăți/clase au fost declarate, am folosit un astfel de truc.
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;
Moment important aici - nu uitați să declarați tipul pentru constanta classes.
Poți reutiliza aceste tipuri în alte componente și să ai toate informațiile necesare.
