React Nativeの開発では、特定の機能を持った基底コンポーネントを作成し、それを再利用することがよくあります。ここでは、既存のベースコンポーネントに新たにPropsを追加する方法について説明します。
元となるコンポーネント
まず、出発点となるコンポーネントを見てみましょう。以下は一例となるCard
コンポーネントです。
import React, { FC } from 'react';
import { View, ViewProps } from 'react-native';
type CardProps = ViewProps;
export const Card: FC<CardProps> = ({ children, ...rest }) => {
return (
<View {...rest}>
{children}
</View>
);
};
このCard
コンポーネントは、子要素として任意のコンテンツを受け取ることができます。
このCardProps
の型は、ViewProps
として定義されています。ViewProps
はReact Nativeが提供する型で、View
コンポーネントが受け取ることができる全てのプロップスの型定義を含んでいます。これにより、このCard
コンポーネントもView
と同じプロップを受け取ることができます。
新しいPropsの追加
次に、このCard
コンポーネントに、新たなプロップとしてonClose
を追加しましょう。これは、ユーザーが閉じるアクションを行ったときにトリガーされるイベントハンドラを想定します。
新たなプロップを追加するには、まず、新たなプロップの型を定義します。ここでは、onClose
関数の型は() => void
とします。
そして、この新たなプロップをCardProps
に追加します。
interface CardProps extends ViewProps {
onClose: () => void;
}
コンポーネントへの適用
最後に、新たに追加したonClose
プロップをCard
コンポーネントに適用します。
import React, { FC } from 'react';
import { View, ViewProps, TouchableOpacity } from 'react-native';
import { CloseIcon } from '../icons/CloseIcon';
interface CardProps extends ViewProps {
onClose: () => void;
}
export const Card: FC<CardProps> = ({ onClose, children, ...rest }) => {
return (
<View {...rest}>
<TouchableOpacity onPress={onClose}>
<CloseIcon />
</TouchableOpacity>
{children}
</View>
);
};
新たなonClose
プロップはCardProps
インターフェースに追加され、Card
コンポーネントの引数にも追加されました。これにより、親コンポーネントからこの関数がプロップとして渡されるようになり、ユーザーがCloseIcon
をタップしたときにこれがトリガーされるようになります。
ここで注目したいのは、...rest
という記述です。これはJavaScriptの「残余パラメータ(rest parameter)」と呼ばれる構文で、いくつかのアイテムを一つの配列にまとめることができます。この場合、Card
コンポーネントが受け取る全てのプロップをrest
オブジェクトにまとめ、それをView
コンポーネントに渡しています。つまり、Card
コンポーネントが受け取る全てのプロップ(onClose
とchildren
を除く)は、そのままView
コンポーネントに渡されます。
まとめ
React Nativeで汎用的なコンポーネントを作成し、それを再利用する際には、新たなプロップを追加してコンポーネントをカスタマイズすることがよくあります。この記事ではその方法を具体的に説明しました。また、React NativeのViewProps
とJavaScriptの「残余パラメータ」についても解説しました。これらを理解し活用することで、コンポーネントの再利用性と可読性が向上します。