【React基礎】useStateとは?初心者向けに分かりやすく解説
yuya_react
月収100万フリーランスへの道
こんにちは、優也@月収100万を目指して月100時間勉強する男です。
前回までの記事で、TODOアプリを完成させました。その中で、配列のstateを追加・削除・更新する処理を実装しましたが、「なぜこの書き方なのか?」を詳しく解説していませんでした。
今回は、Reactで配列のstateを更新する方法について、5つのパターンに分けて解説します。TODOアプリで実装した処理を振り返りながら、配列操作の基本を身につけましょう。
Reactでは、stateを直接変更してはいけません。
const [items, setItems] = useState([1, 2, 3]);
// ❌ 直接変更
items.push(4);
items[0] = 10;<em>// ✅ 新しい配列を作る</em>
setItems([...items, 4]);
setItems([10, ...items.slice(1)]);Reactは参照が変わったかどうかで再レンダリングを判断します。配列の中身を変更しても、配列自体の参照は変わらないため、Reactが変更を検知できません。
配列の末尾に要素を追加する方法です。
const [items, setItems] = useState([1, 2, 3]);
const addItem = () => {
setItems([...items, 4]);
};[...items, 4]...items: 既存の配列を展開, 4: 新しい要素を追加[]で囲んで新しい配列を作成結果: [1, 2, 3, 4]
const addTask = () => {
const newTask = {
id: newId,
taskName: inputTask,
completed: false
};
setTasks([...tasks, newTask]);
};setItems([4, ...items]);結果: [4, 1, 2, 3]
filterを使って、条件に合わない要素を除外します。
const [items, setItems] = useState([
{ id: 1, name: 'りんご' },
{ id: 2, name: 'バナナ' },
{ id: 3, name: 'オレンジ' }
]);
const deleteItem = (id) => {
setItems(items.filter((item) => item.id !== id));
};items.filter((item) => item.id !== id)filter: 条件に合う要素だけを残すitem.id !== id: 削除対象以外を残すconst deleteTask = (id) => {
setTasks(tasks.filter((task) => task.id !== id));
};const deleteByIndex = (index) => {
setItems(items.filter((_, i) => i !== index));
};_は使わない変数を表す慣習的な書き方です。
mapを使って、特定の要素だけを更新します。
const [items, setItems] = useState([
{ id: 1, name: 'りんご', price: 100 },
{ id: 2, name: 'バナナ', price: 80 },
{ id: 3, name: 'オレンジ', price: 120 }
]);
const updatePrice = (id, newPrice) => {
setItems(
items.map((item) =>
item.id === id ? { ...item, price: newPrice } : item
)
);
};items.map((item) =>
item.id === id ? { ...item, price: newPrice } : item
)map: すべての要素を処理item.id === id: 対象の要素か判定{ ...item, price: newPrice }: 対象ならpriceを更新: item: 対象外ならそのままconst completeTask = (id) => {
setTasks(
tasks.map((task) =>
task.id === id ? { ...task, completed: true } : task
)
);
};filterとmapを組み合わせることもできます。
const [items, setItems] = useState([
{ id: 1, name: 'りんご', category: '果物', discount: false },
{ id: 2, name: 'バナナ', category: '果物', discount: false },
{ id: 3, name: 'にんじん', category: '野菜', discount: false }
]);
const applyDiscountToCategory = (category) => {
setItems(
items.map((item) =>
item.category === category ? { ...item, discount: true } : item
)
);
};「果物」カテゴリの商品すべてにdiscountフラグを付けることができます。
配列を並び替える方法です。
const [items, setItems] = useState([3, 1, 4, 1, 5]);
// ❌ これはダメ(元の配列を変更してしまう)
const sortItems = () => {
items.sort();
setItems(items);
};
// ✅ 正しい方法(新しい配列を作る)
const sortItems = () => {
setItems([...items].sort());
};[...items].sort()[...items]: 配列をコピー.sort(): コピーした配列をソートconst [items, setItems] = useState([
{ id: 3, name: 'オレンジ' },
{ id: 1, name: 'りんご' },
{ id: 2, name: 'バナナ' }
]);
// IDでソート
const sortById = () => {
setItems([...items].sort((a, b) => a.id - b.id));
};
// 名前でソート
const sortByName = () => {
setItems([...items].sort((a, b) => a.name.localeCompare(b.name)));
};// ❌ これはダメ
const addItem = () => {
items.push(newItem);
setItems(items);
};
// ✅ 正しい
const addItem = () => {
setItems([...items, newItem]);
};// ❌ これはダメ
const updateItem = (index) => {
items[index] = newValue;
setItems(items);
};
// ✅ 正しい
const updateItem = (index) => {
setItems(items.map((item, i) => (i === index ? newValue : item)));
};// ❌ これはダメ
const deleteItem = (index) => {
items.splice(index, 1);
setItems(items);
};
// ✅ 正しい
const deleteItem = (index) => {
setItems(items.filter((_, i) => i !== index));
};Reactで配列のstateを更新する5つのパターンを解説しました。
重要なポイント:
5つのパターン:
[...items, newItem]items.filter((item) => item.id !== id)items.map((item) => item.id === id ? {...item, updated} : item)items.map()で条件に合う要素を更新[...items].sort()これらのパターンを覚えれば、Reactでの配列操作はバッチリです!
この記事のシリーズ:
月100時間の学習時間の中で、今月はReactに集中して取り組んでいます。Instagramでは、フリーランスとして月収100万円を目指す道のりを、リアルタイムで発信していきますので、ぜひフォローしてください!
Instagram: @hooded_yuya_100man
