ReactJS - Управление состоянием с использованием Flux
Здравствуйте, будущие маги React! Сегодня мы отправимся в увлекательное путешествие в мир управления состоянием с использованием Flux. Не волнуйтесь, если вы новички в программировании – я буду вашим доброжелательным проводником, и мы будем двигаться шаг за шагом. К концу этого учебника вы будете управлять состоянием как профессионал!
Что такое состояние и почему我们需要 управлять им?
Прежде чем мы погрузимся в Flux, давайте поговорим о состоянии. Представьте, что вы создаете приложение для списка задач. Сам список задач – это "состояние" вашего приложения. По мере того как пользователи добавляют или удаляют задачи, состояние изменяется. Эффективное управление этими изменениями имеет решающее значение для плавного пользовательского опыта.
Понимание Flux
Flux – это архитектурный паттерн, разработанный Facebook для управления потоком данных в приложениях React. Представьте его как диспетчера для данных вашего приложения.
Основные концепции Flux
- Действия (Actions): Это как messengers, несущие информацию о том, что произошло в вашем приложении.
- Диспетчер (Dispatcher): Это диспетчер, который принимает действия и отправляет их в соответствующие хранилища.
- Хранилища (Stores): Места, где хранятся данные и логика вашего приложения.
- Виды (Views): React компоненты, которые отображают данные из хранилищ.
Давайте visualize это с помощью простого diagramma:
Пользовательское взаимодействие -> Действие -> Диспетчер -> Хранилище -> Вид
Реализация Flux: Пошаговое руководство
Шаг 1: Настройка вашего проекта
Сначала давайте настроим новый проект React. Откройте ваш terminal и выполните:
npx create-react-app flux-todo-app
cd flux-todo-app
npm install flux
Шаг 2: Создание действий
Действия являются отправной точкой потока данных. Давайте создадим простое действие для добавления задачи:
// src/actions/TodoActions.js
import dispatcher from "../dispatcher";
export function addTodo(text) {
dispatcher.dispatch({
type: "ADD_TODO",
text: text
});
}
Здесь мы создаем функцию addTodo
, которая dispatch-ит действие с типом и текстом задачи.
Шаг 3: Настройка диспетчера
Диспетчер – это центральный узел нашего приложения Flux:
// src/dispatcher.js
import { Dispatcher } from "flux";
export default new Dispatcher();
Это создает новую копию Dispatcher, которую мы будем использовать в нашем приложении.
Шаг 4: Создание хранилища
Хранилища хранят состояние и логику приложения:
// src/stores/TodoStore.js
import { EventEmitter } from "events";
import dispatcher from "../dispatcher";
class TodoStore extends EventEmitter {
constructor() {
super();
this.todos = [];
}
createTodo(text) {
const id = Date.now();
this.todos.push({
id,
text,
complete: false
});
this.emit("change");
}
getAll() {
return this.todos;
}
handleActions(action) {
switch(action.type) {
case "ADD_TODO":
this.createTodo(action.text);
break;
default:
// не делать ничего
}
}
}
const todoStore = new TodoStore();
dispatcher.register(todoStore.handleActions.bind(todoStore));
export default todoStore;
Это хранилище слушает действия, обновляет список задач и инициирует событие "change".
Шаг 5: Создание React компонентов
Теперь давайте создадим наши React компоненты для отображения и взаимодействия с нашими задачами:
// src/components/TodoList.js
import React, { useState, useEffect } from 'react';
import TodoStore from '../stores/TodoStore';
import { addTodo } from '../actions/TodoActions';
function TodoList() {
const [todos, setTodos] = useState(TodoStore.getAll());
const [newTodo, setNewTodo] = useState('');
useEffect(() => {
TodoStore.on("change", () => {
setTodos(TodoStore.getAll());
});
}, []);
const handleNewTodoChange = (e) => {
setNewTodo(e.target.value);
};
const handleAddTodo = () => {
addTodo(newTodo);
setNewTodo('');
};
return (
<div>
<h1>Мой список задач</h1>
<input
type="text"
value={newTodo}
onChange={handleNewTodoChange}
placeholder="Введите новую задачу"
/>
<button onClick={handleAddTodo}>Добавить задачу</button>
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
</div>
);
}
export default TodoList;
Этот компонент слушает изменения в TodoStore, отображает текущие задачи и позволяет пользователям добавлять новые задачи.
Шаг 6: Объединение всего
Наконец, обновим наш App.js
, чтобы использовать новый компонент TodoList:
// src/App.js
import React from 'react';
import TodoList from './components/TodoList';
function App() {
return (
<div className="App">
<TodoList />
</div>
);
}
export default App;
Заключение
Поздравления! Вы только что создали простое приложение для списка задач с использованием React и Flux. Давайте подведем итоги того, что мы узнали:
- Flux – это архитектурный паттерн для управления состоянием в приложениях React.
- Он состоит из Действий, Диспетчера, Хранилищ и Видов.
- Данные流动 в одном направлении: Действие -> Диспетчер -> Хранилище -> Вид.
Этот单向ный поток данных делает наше приложение более предсказуемым и легким для отладки. По мере создания более крупных приложений, вы оцените структуру и clarity, которые предоставляет Flux.
помните, что обучение эффективному управлению состоянием похоже на обучение жонглировать – это требует практики, но как только вы научитесь, это becomes incredibly powerful (и fun)!
Продолжайте программировать, stay curious, и happy React-ing!
Credits: Image by storyset