Допустим, у нас есть простой компонент счетчика, который отображает счетчик и позволяет пользователю увеличивать или уменьшать счетчик с помощью двух кнопок. Вот как мы можем использовать useReducer
для управления состоянием счетчика:
import React, { useReducer } from 'react'; const reducer = (state, action) => { switch (action.type) { case 'INCREMENT': return state + 1; case 'DECREMENT': return state - 1; default: return state; } }; const Counter = () => { const [count, dispatch] = useReducer(reducer, 0); const handleIncrement = () => { dispatch({ type: 'INCREMENT' }); }; const handleDecrement = () => { dispatch({ type: 'DECREMENT' }); }; return ( <div> <h1>Count: {count}</h1> <button onClick={handleIncrement}>Increment</button> <button onClick={handleDecrement}>Decrement</button> </div> ); }; export default Counter;
В этом примере мы определяем функцию reducer
, которая принимает текущее состояние и объект действия и возвращает новое состояние в зависимости от типа действия. Мы также определяем компонент Counter
, который вызывает хук useReducer
и передает функцию reducer
, а также начальное состояние 0
. Хук useReducer
возвращает массив с текущим состоянием (count
) и функцию dispatch
, которая используется для отправки действий, которые будут обновлять состояние.
Мы определяем две вспомогательные функции, handleIncrement
и handleDecrement
, которые вызывают функцию dispatch
с объектами действий, которые имеют типы 'INCREMENT'
и 'DECREMENT'
соответственно. Наконец, мы визуализируем текущее количество и две кнопки, которые вызывают вспомогательные функции при нажатии.
Когда пользователь нажимает кнопку Increment
, функция handleIncrement
отправляет объект действия с типом 'INCREMENT'
, в результате чего функция reducer
возвращает новое состояние, которое на единицу больше текущего состояния. Точно так же, когда пользователь нажимает кнопку Decrement
, функция handleDecrement
отправляет объект действия с типом 'DECREMENT'
, в результате чего функция reducer
возвращает новое состояние, которое на единицу меньше текущего состояния.
В целом, useReducer
позволяет нам управлять состоянием счетчика более лаконичным и структурированным способом, чем использование useState
, особенно когда у нас есть более сложные переходы между состояниями.