Mon GitHub
useReducer
Il s'agit d'un Hook dans React, utilisé pour gérer la logique d'état complexe des composants. Contrairement à useState
, useReducer
vous permet de gérer plusieurs champs d'état d'un composant de manière plus prévisible.
Utilisation de base
useReducer
Accepte une reducer
fonction et un état initial comme paramètres et renvoie un dispatch
tableau contenant l'état actuel et une méthode. reducer
La fonction prend l'état actuel et a action
et renvoie un nouvel état.
Voici un contre-exemple simple :
import React, { useReducer } from 'react';
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
<button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
</>
);
}
paramètre
reducer
: Il s'agit d'une fonction pure qui accepte l'état actuel et un objet d'action et renvoie un nouvel état.initialState
: C'estreducer
l'état initial de .init
: (facultatif) Si elle est fournie, cette fonction accepterainitialState
comme argument et renverra la valeur de l'état initial.
valeur de retour
useReducer
Renvoie un tableau contenant deux éléments :
state
: Statut actuel.dispatch
: Il s'agit d'une méthode utilisée pour déclencherreducer
une action.
Action
Une action est généralement un type
objet doté d'une propriété qui décrit ce qui s'est passé et d'une payload
propriété qui contient toutes les informations nécessaires pour mettre à jour l'état. Mais en réalité, une action peut être n’importe quelle valeur (comme une chaîne, un nombre ou un objet).
Quand utiliseruseReducer
- Lorsque vous devez gérer plusieurs champs de statut interdépendants.
- Lorsque vous devez gérer une logique d'état complexe qui contient plusieurs sous-valeurs ou que l'état suivant dépend de l'état précédent.
- Lorsque vous devez suivre explicitement la source d'un changement d'état, comme l'implémentation de la fonctionnalité d'annulation/rétablissement.
Dans l’ensemble, useReducer
il offre un moyen plus puissant et plus prévisible de gérer l’état des composants.
Donnez un exemple que usestate ne peut pas faire mais que usereducer peut faire
useReducer
Ceci est généralement plus approprié lorsque vous disposez de plusieurs champs de statut interdépendants et que la logique de mise à jour du statut est assez complexe . Prenons l'exemple d'un composant de panier d'achat avec plusieurs champs de statut : liste d'articles, prix total, remise, etc. Ces champs peuvent dépendre du statut d'autres champs.
import React, { useReducer } from "react";
const initialState = {
items: [], // 商品列表
total: 0, // 总价
discount: 0 // 折扣
};
const reducer = (state, action) => {
switch (action.type) {
case "ADD_ITEM":
const newItems = [...state.items, action.item];
const newTotal = newItems.reduce((acc, item) => acc + item.price, 0);
return {
...state,
items: newItems,
total: newTotal
};
case "APPLY_DISCOUNT":
return {
...state,
discount: action.discount,
total: state.total * (1 - action.discount / 100)
};
default:
return state;
}
};
function ShoppingCart() {
const [state, dispatch] = useReducer(reducer, initialState);
const addItem = (item) => {
dispatch({ type: "ADD_ITEM", item });
};
const applyDiscount = (discount) => {
dispatch({ type: "APPLY_DISCOUNT", discount });
};
return (
<div>
<h1>Shopping Cart</h1>
{/* 商品列表和添加商品操作 */}
{/* ... */}
<button onClick={() => addItem({ name: "Apple", price: 1 })}>
Add Apple
</button>
{/* 显示总价 */}
<p>Total: ${state.total}</p>
{/* 应用折扣 */}
<button onClick={() => applyDiscount(10)}>Apply 10% Discount</button>
</div>
);
}
Dans cet exemple, lorsque vous ajoutez un article ( ADD_ITEM
), non seulement items
son statut change total
(le prix total) doit également être mis à jour. Lorsqu'une réduction ( APPLY_DISCOUNT
) est appliquée, discount
les deux total
et doivent être mis à jour.
Si utilisé useState
, vous devez synchroniser manuellement ces états, ce qui rend le code plus difficile à gérer et à déboguer. En utilisant useReducer
, vous pouvez regrouper toute la logique pertinente au même endroit, rendant les mises à jour d'état plus prévisibles et plus faciles à maintenir.