スプレッド構文について、まとめてみた

2025/01/25に公開

スプレッド構文とは

スプレッド構文(...)は、配列やオブジェクトの要素を展開するためのJavaScriptの構文です。この機能は、配列やオブジェクトを簡単にコピーしたり、結合したりする際に便利です。

const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];

console.log(arr2); // [1, 2, 3, 4, 5]

...arr1: 配列 arr1 の全ての要素を展開します。
結果: 新しい配列 [1, 2, 3, 4, 5] が作成されます。

配列のマージ

複数の配列をマージすることができます。

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const merged = [...arr1, ...arr2];

console.log(merged); // [1, 2, 3, 4, 5, 6]

このように、スプレッド構文を使うことで元の配列をそのまま維持しつつ、新しい配列を作成できます。

Reactでの応用

スプレッド構文は、Reactの状態管理やプロパティ(props)の操作においても広く利用されています。ここでは、ショッピングカートを管理する例を通じて、実際の使い方を確認してみましょう。

例: 商品ごとの数量を管理 以下は、ユーザーが入力した商品ごとの数量をReactの状態で管理するシンプルな例です。

import React, { useState } from "react";
import { View, Text, TextInput, FlatList, StyleSheet } from "react-native";

const App = () => {
  // 商品ごとの数量を管理する状態
  const [itemQuantities, setItemQuantities] = useState<{ [key: string]: string }>({});

  // 商品データ
  const items = ["apple", "banana", "orange", "grape", "melon"];

  // 商品ごとの数量を更新する関数
  const handleQuantityChange = (item: string, value: string) => {
    setItemQuantities((prev) => ({
      ...prev,
      [item]: value, // 入力された商品の数量を更新
    }));
  };

  return (
    <View style={styles.container}>
      <Text style={styles.title}>ショッピングカート</Text>
      <FlatList
        data={items}
        keyExtractor={(item) => item}
        renderItem={({ item }) => (
          <View style={styles.row}>
            {/* 商品名 */}
            <Text style={styles.itemName}>{item}</Text>

            {/* 商品数量の入力フィールド */}
            <TextInput
              style={styles.input}
              keyboardType="numeric"
              placeholder={`${item}の数量`}
              value={itemQuantities[item] || ""} // 状態から該当商品の数量を取得
              onChangeText={(value) => handleQuantityChange(item, value)} // 入力値を更新
            />
          </View>
        )}
      />
      <View style={styles.summary}>
        <Text style={styles.summaryTitle}>合計数量:</Text>
        <Text style={styles.summaryValue}>
          {Object.values(itemQuantities).reduce(
            (sum, qty) => sum + (parseInt(qty) || 0),
            0
          )}
        </Text>
      </View>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 16,
    backgroundColor: "#f8f8f8",
  },
  title: {
    fontSize: 24,
    fontWeight: "bold",
    marginBottom: 16,
    textAlign: "center",
  },
  row: {
    flexDirection: "row",
    alignItems: "center",
    marginBottom: 8,
  },
  itemName: {
    flex: 1,
    fontSize: 18,
  },
  input: {
    flex: 1,
    borderWidth: 1,
    borderColor: "#ccc",
    borderRadius: 8,
    padding: 8,
    fontSize: 16,
    backgroundColor: "#fff",
  },
  summary: {
    marginTop: 16,
    padding: 16,
    borderWidth: 1,
    borderColor: "#ddd",
    borderRadius: 8,
    backgroundColor: "#fff",
  },
  summaryTitle: {
    fontSize: 20,
    fontWeight: "bold",
  },
  summaryValue: {
    fontSize: 24,
    color: "#007BFF",
    marginTop: 8,
  },
});

export default App;

この配列 items は、商品名リストを表しています。このリストを使って、商品ごとの数量を管理する場合、キーとして利用されます。

const items = ["apple", "banana", "orange", "grape", "melon"];

この items 配列内の各要素("apple", "banana" など)が、オブジェクトのキーになります。

const [itemQuantities, setItemQuantities] = useState({});

const handleQuantityChange = (item, value) => {
  setItemQuantities((prev) => ({
    ...prev, // 既存の状態を保持
    [item]: value, // item をキーにして value を更新
  }));
};

さきほどのitems配列のオブジェクトのキーをもとにして、数量を入力します。入力するたびに
値が更新されていきます。

prev とは?
prev は 「現在の状態」 を表します。
Reactが現在の状態(itemQuantities の値)を自動で渡します。

const [itemQuantities, setItemQuantities] = useState({ apple: "2", banana: "3" });

setItemQuantities((prev) => ({
  ...prev,
  apple: "5", // appleの数量を更新
}));

①prev の初期値: { apple: "2", banana: "3" }
②スプレッド構文でコピー: { apple: "2", banana: "3" }
③更新後の結果: { apple: "5", banana: "3" }

まとめ

今回、スプレッド構文について、また、Reactでのスプレッド構文の使用例について
まとめました。
スプレッド構文を使うと、オブジェクトや配列のコピーを簡単に作れるので、元のデータをそのまま残しながら新しいデータを作り直せます。これによって、Reactのコンポーネントが効率よく再描画されるようになり、動きがスムーズになるのに役立ちます!

Discussion