ホームページ >ウェブフロントエンド >jsチュートリアル >コールバック関数を使用した React の useState の理解: ディープダイブ
React の useState フックは、機能コンポーネントの状態を管理するための基本的なツールです。多くの開発者はその基本的な使用法に精通していますが、useState 内のコールバック パターンは見落とされがちですが、非常に強力です。この投稿では、useState でコールバック関数を使用する時期と理由を、実践的な例を交えて説明します。
コールバックの説明に入る前に、useState が通常どのように動作するかを簡単に確認してみましょう。
const [count, setCount] = useState(0); // Later in your component... setCount(count + 1);
コールバック パターンは、以前の値に基づいて状態を更新するときに重要になります。次のように書きたくなるかもしれませんが、
const [count, setCount] = useState(0); // ? This might not work as expected const handleMultipleIncrements = () => { setCount(count + 1); setCount(count + 1); setCount(count + 1); };
このコードでは、ご想像のとおり、カウントが 3 ずつ増加しません。 React の状態バッチ処理により、これらの更新はすべて同じ元の count 値に基づいて行われます。
ここでコールバック関数が活躍します:
const handleMultipleIncrements = () => { setCount(prevCount => prevCount + 1); setCount(prevCount => prevCount + 1); setCount(prevCount => prevCount + 1); };
各更新は以前の状態に基づいており、すべての増分が適切に適用されるようになりました。
ショッピング カートを管理する実際の例を見てみましょう:
function ShoppingCart() { const [items, setItems] = useState([]); const addItem = (product) => { setItems(prevItems => { // Check if item already exists const existingItem = prevItems.find(item => item.id === product.id); if (existingItem) { // Update quantity of existing item return prevItems.map(item => item.id === product.id ? { ...item, quantity: item.quantity + 1 } : item ); } // Add new item return [...prevItems, { ...product, quantity: 1 }]; }); }; // ... rest of the component }
// ✅ Good setItems(prev => [...prev, newItem]); // ? Bad - Don't mutate previous state setItems(prev => { prev.push(newItem); // Mutating state directly return prev; });
const [items, setItems] = useState<CartItem[]>([]); setItems((prev: CartItem[]) => [...prev, newItem]);
コールバックが高度な状態更新をどのように処理できるかを示す、より複雑な例を次に示します。
function TaskManager() { const [tasks, setTasks] = useState([]); const completeTask = (taskId) => { setTasks(prevTasks => prevTasks.map(task => task.id === taskId ? { ...task, status: 'completed', completedAt: new Date().toISOString() } : task )); }; const addSubtask = (taskId, subtask) => { setTasks(prevTasks => prevTasks.map(task => task.id === taskId ? { ...task, subtasks: [...(task.subtasks || []), subtask] } : task )); }; }
React で信頼性の高い状態更新を行うには、useState でコールバック関数を使用することが不可欠です。これらは、競合状態を防止し、状態の更新が最新の値に基づいて行われるようにし、コードをより予測しやすくするのに役立ちます。最初は構文が冗長に見えるかもしれませんが、信頼性と保守性の点での利点はそれだけの価値があります。
覚えておいてください: 新しい状態が前の状態に何らかの形で依存している場合は、コールバック パターンを使用してください。将来のあなた (そしてあなたのチーム) はあなたに感謝するでしょう!
ご質問やご意見がありますか?お気軽にお問い合わせいただくか、下記にコメントを残してください!
以上がコールバック関数を使用した React の useState の理解: ディープダイブの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。