Reactコンポーネントの一部をMaterialUIから新しいmakeStyles
/useStyles
フックAPIに移行しようとしています。正しく理解していれば、引き続き受け入れることができます。小道具をclasses
に渡す限り、親コンポーネントからの小道具としてuseStyles
:
const MyComponent = (props: Props) => {
const { myProp } = props;
const classes = useStyles(props);
その場合、Props
型をどのように宣言するのか疑問に思いました。 HOCAPIと同等のものは次のとおりです。
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;
ここで重要な瞬間classes定数の型を宣言することを忘れないでください。
このタイプを他のコンポーネントで再利用して、必要なすべての情報を入手できます。