useReducer
est un crochet React introduit dans React 16.8 qui fournit un autre moyen de gérer l'état dans les composants fonctionnels. Il est particulièrement utile pour gérer une logique d'état plus complexe en utilisant une fonction réductrice pour mettre à jour l'état. La fonction de réducteur prend l'état actuel et une action en arguments et renvoie un nouvel état basé sur le type d'action. Cette approche est inspirée par Redux, une bibliothèque de gestion de l'État populaire, et aide à maintenir les mises à jour de l'État organisées et prévisibles.
La syntaxe pour useReducer
est la suivante:
<code class="javascript">const [state, dispatch] = useReducer(reducer, initialArg, init);</code>
init
pour créer l'état initial paresseusement.initialArg
une fois pour définir l'état initial. L'utilisation useReducer
offre plusieurs avantages sur useState
lors de la gestion de l'état complexe, notamment:
useReducer
, vous pouvez séparer la logique de mise à jour de l'état du composant, ce qui facilite le test et le maintien. La fonction de réducteur est une fonction pure qui décrit comment l'état change, qui peut être séparé en son propre fichier si nécessaire.useReducer
brille lorsqu'il s'agit de plusieurs sous-valeurs ou lorsque l'état suivant dépend de la précédente. Il vous permet de décomposer les mises à jour de l'état en types d'action plus petits et plus gérables.useReducer
peut être utilisé avec useCallback
pour mémoriser la fonction de répartition, améliorant potentiellement les performances.useReducer
se marie bien avec useContext
pour gérer l'état global, permettant une solution de gestion d'état plus évolutive sur plusieurs composants. Bien que useReducer
lui-même ne gère pas directement les effets secondaires, il peut être associé à useEffect
pour gérer efficacement les effets secondaires en fonction des changements d'état. Voici comment useReducer
peut faciliter la manipulation des effets secondaires:
useReducer
pour gérer l'état, vous pouvez définir toutes les transitions d'état en un seul endroit. Cela facilite la compréhension des changements d'état qui peuvent déclencher des effets secondaires.useReducer
assure des mises à jour prévisibles d'état, vous pouvez dépendre de ces mises à jour pour déclencher des effets secondaires de manière cohérente. Vous pouvez configurer useEffect
les crochets pour écouter pour des changements d'état spécifiques et exécuter les effets secondaires en conséquence.useReducer
dans un crochet useEffect
pour déclencher des effets secondaires. Par exemple, si le changement d'état consiste à récupérer des données, vous pouvez expédier une action pour mettre à jour l'état, et un crochet useEffect
peut répondre à ce changement d'état en faisant un appel API.Voici un exemple de base:
<code class="javascript">const [state, dispatch] = useReducer(reducer, initialState); useEffect(() => { if (state.fetchData) { // Fetch data here fetchData().then(data => dispatch({ type: 'dataFetched', payload: data })); } }, [state.fetchData]);</code>
Dans cet exemple, lorsque state.fetchData
devient vrai, le crochet useEffect
déclenche une apparition de données, et une fois les données récupérées, il dépasse une autre action pour mettre à jour l'état avec les données récupérées.
Créons une simple application de liste de TODO pour démontrer la mise en œuvre pratique de useReducer
dans un composant React.
Tout d'abord, nous définissons notre réducteur et notre état initial:
<code class="javascript">// Reducer const todoReducer = (state, action) => { switch (action.type) { case 'ADD_TODO': return { ...state, todos: [...state.todos, { id: Date.now(), text: action.payload, completed: false }] }; case 'TOGGLE_TODO': return { ...state, todos: state.todos.map(todo => todo.id === action.payload ? { ...todo, completed: !todo.completed } : todo ) }; case 'REMOVE_TODO': return { ...state, todos: state.todos.filter(todo => todo.id !== action.payload) }; default: return state; } }; // Initial state const initialState = { todos: [] };</code>
Maintenant, créons un composant TodoList
qui utilise useReducer
:
<code class="jsx">import React, { useReducer } from 'react'; const TodoList = () => { const [state, dispatch] = useReducer(todoReducer, initialState); const handleAddTodo = (text) => { dispatch({ type: 'ADD_TODO', payload: text }); }; const handleToggleTodo = (id) => { dispatch({ type: 'TOGGLE_TODO', payload: id }); }; const handleRemoveTodo = (id) => { dispatch({ type: 'REMOVE_TODO', payload: id }); }; return ( <div> <h1>Todo List</h1> <input type="text" onkeypress="{(e)"> { if (e.key === 'Enter') { handleAddTodo(e.target.value); e.target.value = ''; } }} placeholder="Enter a new todo" /> <ul> {state.todos.map(todo => ( <li key="{todo.id}"> <span style="{{" textdecoration: todo.completed : onclick="{()"> handleToggleTodo(todo.id)} > {todo.text} </span> <button onclick="{()"> handleRemoveTodo(todo.id)}>Remove</button> </li> ))} </ul> </div> ); }; export default TodoList;</code>
Dans cet exemple, nous utilisons useReducer
pour gérer l'état de notre liste TODO. La fonction todoReducer
gère trois types d'action: ADD_TODO
, TOGGLE_TODO
et REMOVE_TODO
. La fonction dispatch
est utilisée pour envoyer des actions au réducteur, ce qui à son tour met à jour l'état en conséquence. Cette approche maintient la logique de l'État centralisée et prévisible, ce qui rend le composant plus facile à maintenir et à comprendre.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!