背景
基本的にコンポーネントの引数は分割代入で受け取ることが多く、デフォルト値も合わせて設定しているケースも多い。そうした際、さらに対象の変数名も関数内部の処理に合わせて変更しておきたい場合もある。
例えば、コンポーネントとしてはas
というプロパティを受け取りたいが、コンポーネント内では分かりやすい変数名としてTag
という名称で扱いたい場合などがある。
基本的にコンポーネントの引数は分割代入で受け取ることが多く、デフォルト値も合わせて設定しているケースも多い。そうした際、さらに対象の変数名も関数内部の処理に合わせて変更しておきたい場合もある。
例えば、コンポーネントとしてはas
というプロパティを受け取りたいが、コンポーネント内では分かりやすい変数名としてTag
という名称で扱いたい場合などがある。
まずは、基本的な分割代入による props
の受け取り方法は以下の通り。
type Props = {
as?: string;
role?: string;
children?: React.ReactNode;
gap?: string;
};
export const Grid = ({ as, role, children, gap, ...props }: Props) => {
return (
<as role={role} {...props}>
{children}
</as>
);
};
JSX 内で小文字から始まる <as>
は HTML のタグとみなされる可能性がある点に注意が必要である。
分割代入と同時にデフォルト値を設定する方法は以下の通り。
export const Grid = ({ as = 'div', role, children, gap, ...props }: Props) => {
return (
<as role={role} {...props}>
{children}
</as>
);
};
この例では、as
プロパティに対して 'div'
をデフォルト値として設定している。
コンポーネント内部でより明確な名称を用いるため、分割代入時にプロパティ名の変更とデフォルト値の設定を同時に行う方法は以下の通り。
export const Grid = ({ as: Tag = 'div', role, children, gap, ...props }: Props) => {
return (
<Tag role={role} {...props}>
{children}
</Tag>
);
};
外部から渡される as
プロパティを内部では Tag
という名称で扱い、デフォルト値として 'div'
を設定している。
// `as: Tag`で名称変更、そこに`= 'div'`でデフォルト値を設定している。
{
as: Tag = 'div';
}
補足だが、JSX 内で <Tag>
と記述することにより、React はこれをコンポーネントとして解釈するため、意図した動的タグの指定が可能となる。
この手法は「プロパティのエイリアス」または「名前の再マッピング」などと呼ばれるようだ。