JavaScriptとReactで輝く!`...rest`演算子でReactコンポーネントをパワーアップ
rest 演算子の使用方法
- 子コンポーネントの定義時に、
...rest
演算子をパラメータリストの末尾に置きます。 ...rest
演算子は、props
オブジェクトから名前付きパラメータとして定義されていないすべてのプロパティを含む新しいオブジェクトを作成します。- 作成された新しいオブジェクトは、子コンポーネント内で使用できます。
以下に例を示します。
// 親コンポーネント
function ParentComponent() {
return (
<ChildComponent
prop1="value1"
prop2="value2"
prop3="value3"
otherProp1="otherValue1"
otherProp2="otherValue2"
/>
);
}
// 子コンポーネント
function ChildComponent(props) {
console.log(props.prop1); // value1
console.log(props.prop2); // value2
console.log(props.prop3); // value3
console.log(props.otherProp1); // otherValue1
console.log(props.otherProp2); // otherValue2
return <div>子コンポーネント</div>;
}
この例では、ChildComponent
コンポーネントは prop1
、prop2
、prop3
のみを必要とし、残りの小道具は無視します。...rest
演算子を使用すると、otherProp1
と otherProp2
などの残りの小道具にアクセスできます。
利点
- 親コンポーネントから子コンポーネントに渡されるデータ構造が変更されても、子コンポーネントのコードを変更する必要がない
- 子コンポーネントに必要な小道具のみを明示的に指定する必要がなくなる
- コードが簡潔になる
注意点
- 同じ名前の複数の小道具が親コンポーネントと子コンポーネントで定義されている場合、子コンポーネントでアクセスできるのは親コンポーネントで定義された小道具のみです。
...rest
演算子は、常にパラメータリストの最後に配置する必要があります。
ParentComponent.js
import React from 'react';
function ParentComponent() {
return (
<ChildComponent
prop1="value1"
prop2="value2"
prop3="value3"
otherProp1="otherValue1"
otherProp2="otherValue2"
/>
);
}
export default ParentComponent;
ChildComponent.js
import React from 'react';
function ChildComponent(props) {
console.log(props.prop1); // value1
console.log(props.prop2); // value2
console.log(props.prop3); // value3
console.log(props.otherProp1); // otherValue1
console.log(props.otherProp2); // otherValue2
return <div>子コンポーネント</div>;
}
export default ChildComponent;
このコードを実行すると、以下の出力がコンソールに表示されます。
value1
value2
value3
otherValue1
otherValue2
オブジェクトの解体構文
オブジェクトの解体構文を使用すると、props
オブジェクトから個々のプロパティを直接抽出できます。
// 子コンポーネント
function ChildComponent({ prop1, prop2, prop3, ...rest }) {
console.log(prop1); // value1
console.log(prop2); // value2
console.log(prop3); // value3
console.log(rest); // { otherProp1: 'otherValue1', otherProp2: 'otherValue2' }
return <div>子コンポーネント</div>;
}
この例では、ChildComponent
コンポーネントは prop1
、prop2
、prop3
を明示的に受け取り、残りの小道具は rest
オブジェクトに格納されます。
lodash のようなライブラリを使用する
lodash
のようなユーティリティライブラリを使用すると、オブジェクトからプロパティを簡単に抽出できます。
import React from 'react';
import _ from 'lodash';
// 子コンポーネント
function ChildComponent(props) {
const otherProps = _.omit(props, ['prop1', 'prop2', 'prop3']);
console.log(props.prop1); // value1
console.log(props.prop2); // value2
console.log(props.prop3); // value3
console.log(otherProps); // { otherProp1: 'otherValue1', otherProp2: 'otherValue2' }
return <div>子コンポーネント</div>;
}
この例では、lodash.omit
関数を使用して prop1
、prop2
、prop3
を除いた残りのプロパティを含む新しいオブジェクトを作成します。
カスタムフックを使用する
カスタムフックを使用して、子コンポーネントに必要なプロパティを抽出するロジックをカプセル化できます。
import React, { useState } from 'react';
function useFilteredProps(props, filterProps) {
const [filteredProps, setFilteredProps] = useState({});
useEffect(() => {
const filtered = Object.keys(props).reduce((obj, key) => {
if (!filterProps.includes(key)) {
obj[key] = props[key];
}
return obj;
}, {});
setFilteredProps(filtered);
}, [props, filterProps]);
return filteredProps;
}
// 子コンポーネント
function ChildComponent(props) {
const filteredProps = useFilteredProps(props, ['prop1', 'prop2', 'prop3']);
console.log(props.prop1); // value1
console.log(props.prop2); // value2
console.log(props.prop3); // value3
console.log(filteredProps); // { otherProp1: 'otherValue1', otherProp2: 'otherValue2' }
return <div>子コンポーネント</div>;
}
この例では、useFilteredProps
カスタムフックを作成して、filterProps
配列に指定されたプロパティを除いた残りのプロパティを含む新しいオブジェクトを返します。
適切な方法の選択
どの方法を選択するかは、状況によって異なります。
- カスタムフックを使用すると、ロジックをカプセル化し、再利用できます。
lodash
のようなライブラリを使用すると、より複雑なロジックを実装できます。- オブジェクトの解体構文を使用すると、個々のプロパティを明示的に受け取ることができます。
...rest
演算子は、シンプルで簡潔な方法です。
javascript reactjs