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

Я упростил шаги до следующего:

шаг 1. createStore
шаг 2. createReducer
шаг 3. CombineReducers
шаг 4. создатель действия
шаг 5. useDispatch, useSelector

давайте начнем с шагов:

шаг 1. создать магазин

Это индексный слой компонента React:

import { createRoot } from "react-dom/client";
import App from "./App";

const rootElement = document.getElementById("root");
const root = createRoot(rootElement);
root.render(
<App />
);

Сначала добавьте следующие две строки:

import { createStore } from "redux";
const store = createStore();

Код становится:

import { createRoot } from "react-dom/client";
import { createStore } from "redux";

import App from "./App";

const rootElement = document.getElementById("root");
const root = createRoot(rootElement);

const store = createStore();

root.render(
<App />
);

Затем оберните все приложение с помощью Provider:

import { Provider } from "react-redux";

...

<Provider store={store}>
<App />
</Provider>

шаг 2. создатьредуктор

Создайте файл, например, todoReducer.js:

const initialState = {
  todos: []
};

function todoReducer(state = initialState, action) {
  console.log(action);
  switch (action.type) {
    case "ADD_TODO": {
      return {
        ...state,
        todos: [
          ...state.todos,
          {
            text: action.text,
            completed: false
          }
        ]
      };
    }
    default:
      return state;
  }
}

export default todoReducer;

Шаг 3. Комбинируйте редукторы

Вернемся к index.js:

import { createRoot } from "react-dom/client";
import { Provider } from "react-redux";
//combineReducers
import { createStore, combineReducers } from "redux";
//The reducer to combine
import todoReducer from "./todoReducer";


import App from "./App";

const rootElement = document.getElementById("root");
const root = createRoot(rootElement);
//Combine the reducers
const rootReducer = combineReducers({
  todos: todoReducer
});

//Pass rootReducer as a parameter
const store = createStore(rootReducer);

root.render(
<Provider store={store}>
<App />
</Provider>
);

Примечание: некоторые люди предпочитают создавать отдельный файл для комбинированной функции и импортировать его.

шаг 4. создатель действия

Тип функции действия соответствует случаю переключения в редукторе:

export function addTodo(text) {
  return {
    type: "ADD_TODO",
    text
  };
}

шаг 5. useDispatch, useSelector

В местах, где вам нужно получить данные, используйте useSelector. В местах, где вам нужно обновить данные, используйте useDispatch и не забудьте импортировать действие при использовании dispatch.

После отправки () вы увидите значение действия в редюсере.

import { useDispatch, useSelector } from "react-redux";
import { addTodo } from "./actions";

import "./styles.css";

export default function App() {
//todos corresponds to the key in your createStore()
  const todos = useSelector((state) => state.todos);
//useDispatch
  const dispatch = useDispatch();

  console.log(todos);

  let input;
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <div>
        <form
          onSubmit={(e) => {
            e.preventDefault();
            if (!input.value.trim()) {
              return;
            }
            dispatch(addTodo(input.value));
            input.value = "";
          }}
        >
          <input
            ref={(node) => {
              input = node;
            }}
          />
          <button type="submit">Add Todo</button>
        </form>
        <ul>
          {todos.todos.map((todo, index) => (
            <li key={index}>{todo.text}</li>
          ))}
        </ul>
      </div>
    </div>
  );
}

примечание: параметр отправки должен быть простым объектом!