Это вторая часть серии «Реагировать с нуля». На этот раз мы начнем создавать To-Do-приложение с настройкой, которую мы сделали в части 1!
Предпосылки
Часть 2 начнется с того места, где мы остановились в части 1. Если вы еще этого не сделали, продолжайте и закончите часть 1 или просто клонируйте ее из моего репозитория и начните оттуда.
Новые зависимости
Прежде чем мы начнем создавать To-Do-Application, мы добавим bootstrap в качестве библиотеки CSS, чтобы упростить нашу жизнь и наши инструменты маршрутизации:
$ npm i bootstrap react-router react-router-dom
– bootstraps: библиотека CSS для создания адаптивных веб-приложений.
- react-router: основные функции маршрутизации для реакции.
- react-router-dom: привязки DOM для react-router.
Затем мы импортируем bootstrap в наш index.scss, добавив следующую строку вверху файла:
@import “~bootstrap/scss/bootstrap”;
После этого мы создаем два новых каталога в нашей src-folder, один для наших компонентов и один для наших контейнеров:
$ mkdir containers $ mkdir components
Контейнеры и компоненты
Мне нравится проводить четкое различие между контейнерами и компонентами.
- Контейнеры предназначены только для отображения нашего пользовательского интерфейса с использованием функций, которые мы для них предоставляем. Они не реализуют функции.
- Компоненты содержат логику нашего приложения и «решают», какие контейнеры отображать в какое время. Они обеспечивают функциональность контейнеров, передавая их им.
Теперь давайте начнем писать наш первый контейнер:
Единственная работа этого контейнера — возвращать маршруты нашего приложения. Эти маршруты будут отслеживать все различные пары маршрутов-компонентов.
Создайте новый файл в папке-источнике с именем Routes.js со следующим содержимым:
Как видите, в этой функции мы использовали наши недавно добавленные зависимости. Switch содержит все маршруты, которые мы объявим в этом приложении. В настоящее время мы объявили только один маршрут, который указывает на этот адрес http://localhost:8000/. Компонент TodoPage будет отображаться по этому адресу.
Далее нам нужно реализовать TodoPage. Поэтому мы создадим новый файл с именем Todo.js в папке компонентов.
Файл должен выглядеть так:
import React, { Component, Fragment } from ‘react’ import TodoListContainer from ‘../containers/TodoList’; export class Todo extends Component { constructor(props) { super(props); this.state = { todos: [{ id: 1, title: ‘Create Part 1’, text: ‘Starting with project setup’ }, { id: 2, title: ‘Create Part 2’, text: ‘creating the UI with components and containers’ }, { id: 3, title: ‘Create Part 3’, text: ‘To be decided’ }], }; } render() { return ( <Fragment> <div className=”container-fluid”> <TodoListContainer todos={this.state.todos} /> </div> </Fragment> ); } } export default Todo;
В этом файле мы создаем несколько фиктивных задач.
После этого мы передаем задачи в наш TodoListContainer, который мы пишем дальше. Для этого нам нужно создать файл в папке контейнеров с именем TodoList.js и добавить следующее содержимое:
В этом контейнере мы перебираем все задачи, которые мы передали из нашего Todo-компонента. Перебирая их, мы создаем загрузочную карточку для каждой задачи, чтобы отображать заголовок и текст.
Затем мы меняем цвет фона на что-то более подходящее, чем красный. Для этого мы открываем наш index.scss и меняем цвет фона следующим образом:
@import “~bootstrap/scss/bootstrap”; body { background-color: #d7dfdb; }
Теперь мы очищаем наш index.js, избавляясь от App-функции и реализуя наш Root-контейнер следующим образом:
Давайте запустим наш проект через npm start и посмотрим на макет, который мы только что создали. Это должно выглядеть так:
Больше функций
Теперь мы добавим функциональность, чтобы добавить новую задачу в наш список.
Первое, что нам нужно сделать, это настроить наш Todo-Component для отображения кнопки добавления.
Кроме того, нам нужно реализовать функциональность для добавления новой задачи в наш массив задач.
Для этого нам нужно изменить наш Todo.js следующим образом:
Прежде всего, я добавил к нашему состоянию три новых свойства.
showNewTodo — это логическое значение, которое помогает нам переключаться между кнопкой добавления и формой добавления новой задачи.
title и текст будут содержать заголовок и текст новой задачи.
Затем я добавил две новые функции. onChange записывает заголовок и текст нашей новой задачи в состояние.
onSubmit создает новый объект todo и добавляет его в начало массива todos.
И последнее, но не менее важное: мы добавили необходимый HTML-код для отображения кнопки добавления или NewTodoContainer в зависимости от нашего логического значения showNewTodo.
Теперь нам просто нужно создать новый файл в папке-контейнерах с именем NewTodo.js и добавить следующее содержимое:
Это простая форма с двумя полями ввода, которые реализуют нашу функцию onChange и кнопку отправки, которая реализует нашу функцию onSubmit. Теперь, когда это сделано, мы можем перезапустить наш сервер разработки, нажав npm start.
Вы должны увидеть это:
И после нажатия кнопки «Добавить Todo» это должно выглядеть так:
Заключение
Вот и все для части 2 этой серии. Мы реализовали базовую маршрутизацию и компонент, который обрабатывает все, что касается наших задач. Кроме того, мы реализовали некоторые элементы пользовательского интерфейса, такие как форма добавления задач и список всех задач.
Я надеюсь, что вам понравилось!
В следующей части мы, наконец, займемся избыточностью и управлением состоянием в реакции и добавим в наше приложение еще несколько функций.
Весь код этой многосерийной серии можно найти в этом GitHub-Repository.
Обновлять
Третья часть этой серии уже вышла, посмотрите ее здесь: