React JS стал лучшим выбором для создания современных динамических веб-приложений. Одним из важнейших аспектов React является управление состоянием, которое может быть довольно сложным по мере роста размера и сложности приложения. Redux — это популярная библиотека управления состоянием, которая упрощает обработку и поддержку состояния приложения. В этом уроке мы проведем вас через создание собственной упрощенной версии Redux с нуля, что поможет вам лучше понять, как это работает.

Оглавление:

  1. Понимание основ Redux
  2. Настройка проекта React
  3. Создание магазина
  4. Реализация действий
  5. Строительные редукторы
  6. Подключение компонентов React к магазину
  7. Последние мысли

Понимание основ Redux

Redux — это контейнер предсказуемого состояния для приложений JavaScript, что означает, что он помогает вам управлять и поддерживать состояние вашего приложения предсказуемым образом. Основные концепции Redux:

  • Хранилище: Хранилище хранит состояние приложения и позволяет компонентам получать к нему доступ.
  • Действия. Действия — это простые объекты JavaScript, описывающие, что произошло в приложении.
  • Редюсеры: редукторы — это чистые функции, которые принимают текущее состояние и действие и возвращают следующее состояние.

Настройка проекта React:

Для начала создайте новый проект React с помощью Create React App:

npx create-react-app my-redux-app cd my-redux-app

После настройки проекта установите необходимые зависимости:

npm install - save react-redux

Создание магазина:

Магазин отвечает за управление состоянием вашего приложения. Чтобы создать простое хранилище, добавьте следующий код в новый файл с именем store.js:

const createStore = (reducer) => {
  let state;
  let listeners = [];

  const getState = () => state;

  const dispatch = (action) => {
    state = reducer(state, action);
    listeners.forEach((listener) => listener());
  };

  const subscribe = (listener) => {
    listeners.push(listener);
    return () => {
      listeners = listeners.filter((l) => l !== listener);
    };
  };

  dispatch({});

  return { getState, dispatch, subscribe };
};

export default createStore;

Выполнение действий:

Действия используются для связи с хранилищем и инициирования изменений состояния. Чтобы создать действия, добавьте новый файл с именем actions.js со следующим кодом:

export const INCREMENT = 'INCREMENT';
export const DECREMENT = 'DECREMENT';

export const increment = () => ({
  type: INCREMENT,
});

export const decrement = () => ({
  type: DECREMENT,
});

Создание редукторов:

Редьюсеры — это чистые функции, которые обрабатывают переходы состояний на основе отправленных действий. Создайте новый файл с именем reducers.js и добавьте следующий код:

import { INCREMENT, DECREMENT } from './actions';

const initialState = {
  count: 0,
};

const rootReducer = (state = initialState, action) => {
  switch (action.type) {
    case INCREMENT:
      return { ...state, count: state.count + 1 };
    case DECREMENT:
      return { ...state, count: state.count - 1 };
    default:
      return state;
  }
};

export default rootReducer;

Подключение компонентов React к магазину:

Теперь пришло время подключить хранилище к компонентам React. Начните с импорта и инициализации хранилища в файле index.js:

import { createStore } from './store';
import rootReducer from './reducers';

const store = createStore(rootReducer);

Создайте простой компонент счетчика в новом файле с именем Counter.js:

import { increment, decrement } from './actions';

const Counter = ({ count, onIncrement, onDecrement }) => (
  <div>
    <h1>{count}</h1>
    <button onClick={onIncrement}>+</button>
    <button onClick={onDecrement}>-</button>

  </div>
);
export default Counter;

Теперь обновите файл App.js, включив в него компонент Counter, и подключите его к хранилищу:

import React, { useEffect } from 'react';
import { createStore } from './store';
import rootReducer from './reducers';
import Counter from './Counter';
import { increment, decrement } from './actions';

const store = createStore(rootReducer);

const App = () => {
  const [state, setState] = React.useState(store.getState());

  useEffect(() => {
    const unsubscribe = store.subscribe(() => {
      setState(store.getState());
    });

    return () => {
      unsubscribe();
    };
  }, []);

  const handleIncrement = () => {
    store.dispatch(increment());
  };

  const handleDecrement = () => {
    store.dispatch(decrement());
  };

  return (
    <div>
      <Counter
        count={state.count}
        onIncrement={handleIncrement}
        onDecrement={handleDecrement}
      />
    </div>
  );
};

export default App;

Заключительные мысли:

Теперь вы успешно создали собственную упрощенную версию Redux в приложении React JS. Это упражнение должно помочь вам понять основные концепции Redux и то, как он работает с React для управления состоянием вашего приложения. Хотя эта базовая реализация хорошо работает для небольших проектов, вам следует рассмотреть возможность использования официальной библиотеки Redux для более крупных и сложных приложений. Официальная библиотека поставляется с более продвинутыми функциями, поддержкой промежуточного программного обеспечения и оптимизацией производительности, что делает ее идеальной для создания масштабируемых и удобных в сопровождении веб-приложений.

Продолжая работать с React и Redux, вы также можете изучить дополнительные библиотеки и инструменты, которые могут улучшить ваш рабочий процесс и архитектуру приложения. Некоторые популярные варианты включают в себя:

  • Redux Toolkit: набор утилит и рекомендаций для более эффективного и организованного управления состоянием Redux.
  • Redux Thunk: промежуточное ПО для обработки асинхронных действий в Redux, позволяющее отправлять функции, которые могут выполнять побочные эффекты или отправлять другие действия.
  • Redux Saga: еще одно промежуточное ПО для управления побочными эффектами в Redux, использующее функции генератора, чтобы сделать асинхронный код более читабельным и простым для тестирования.
  • Reselect: библиотека для создания эффективных и составных селекторов для вычисления производных данных из хранилища Redux.

Поняв основные принципы Redux и изучив различные доступные инструменты и библиотеки, вы будете хорошо подготовлены для решения сложных задач управления состоянием в своих приложениях React. Удачного кодирования!