← Назад к вопросам

Как изменять состояние в React?

2.0 Middle🔥 251 комментариев
#React#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Управление состоянием в React

Состояние (state) — это данные, которые изменяются во время жизни компонента. В React есть несколько способов управлять состоянием.

Способ 1: useState Hook

useState — это хук для управления состоянием в функциональных компонентах:

import { useState } from 'react'

export function Counter() {
  const [count, setCount] = useState(0)
  
  const increment = () => {
    setCount(count + 1)
  }
  
  const decrement = () => {
    setCount(count - 1)
  }
  
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
      <button onClick={decrement}>Decrement</button>
    </div>
  )
}

useState возвращает массив с двумя элементами:

  • Текущее значение состояния (count)
  • Функция для обновления состояния (setCount)

Способ 2: Обновление на основе предыдущего состояния

Иногда нужно обновить состояние на основе предыдущего значения:

const [count, setCount] = useState(0)

const increment = () => {
  setCount(prevCount => prevCount + 1)
}

Способ 3: Обновление объектов в состоянии

При обновлении объектов нужно создавать новый объект, а не мутировать существующий:

const [user, setUser] = useState({ name: 'John', age: 30 })

const updateName = (newName) => {
  setUser({ ...user, name: newName })
}

const updateAge = (newAge) => {
  setUser(prevUser => ({ ...prevUser, age: newAge }))
}

Способ 4: Обновление массивов в состоянии

Аналогично объектам, создавай новый массив:

const [items, setItems] = useState(['apple', 'banana', 'cherry'])

const addItem = (item) => {
  setItems([...items, item])
}

const removeItem = (index) => {
  setItems(items.filter((_, i) => i !== index))
}

const updateItem = (index, newValue) => {
  setItems(items.map((item, i) => i === index ? newValue : item))
}

Способ 5: Множественное состояние

Компонент может иметь несколько состояний:

const [firstName, setFirstName] = useState('')
const [lastName, setLastName] = useState('')
const [age, setAge] = useState(0)

return (
  <div>
    <input 
      value={firstName} 
      onChange={e => setFirstName(e.target.value)}
    />
  </div>
)

Способ 6: useReducer для сложной логики

Для сложного состояния с множеством действий используй useReducer:

import { useReducer } from 'react'

const initialState = { count: 0, step: 1 }

function reducer(state, action) {
  switch (action.type) {
    case 'INCREMENT':
      return { ...state, count: state.count + state.step }
    case 'DECREMENT':
      return { ...state, count: state.count - state.step }
    default:
      return state
  }
}

export function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState)
  
  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>
      <button onClick={() => dispatch({ type: 'DECREMENT' })}>-</button>
    </div>
  )
}

Способ 7: Context API для глобального состояния

Для состояния, которое нужно разделить между компонентами:

import { createContext, useContext, useState } from 'react'

const UserContext = createContext()

export function UserProvider({ children }) {
  const [user, setUser] = useState(null)
  
  const login = (userData) => {
    setUser(userData)
  }
  
  const logout = () => {
    setUser(null)
  }
  
  return (
    <UserContext.Provider value={{ user, login, logout }}>
      {children}
    </UserContext.Provider>
  )
}

export function useUser() {
  return useContext(UserContext)
}

Ключевые моменты

  • useState — основной способ управления состоянием
  • Функция обновления — используй при зависимости от предыдущего состояния
  • Неизменяемость — создавай новые объекты/массивы вместо мутирования
  • useReducer — для сложной логики состояния
  • Context API — для глобального состояния

Правильное управление состоянием критично для создания эффективных React приложений.