Создаем приложение на create-react-app, Redux, React Router & Redux Thunk

Влад Скуришин
4 min readJul 3, 2018

--

Вольный перевод статьи Getting started with create-react-app, Redux, React Router & Redux Thunk.

tldr; Вы можете склонировать GitHub репозиторий автора и пропустить руководство или посмотреть его ролик на YouTube.

Мы собираемся создать следующий проект

Наш рабочий пример 🤘

В данном руководстве рассмотрим инструмент, продвигаемый React-сообществом, основная фишка которого “отсутствие необходимости конфигурирования” — Create React App.

Я использую create-react-app для каждого нового приложения на React. Он очень хорош!

Наикрутейшая вещь, идущая в комплекте Create React App — инструментарий для eject, который позволяет вам полностью отвязаться от Create React App (Примечание переводчика: в таком случае вы используете его, как генератор шаблонного кода) и добавить расширенную конфигурацию.

Но чтобы добавить Redux, React Router & Redux Thunk вам не обязательно делать eject.

Дальнейшее прочтение подразумевает, что вы хорошо понимаете принципы Redux. Гляньте это руководство на Egghead от Дена Абрамова, если хотите увидеть почему вокруг Redux столько шума.

Попробуем на практике!

Во-первых, убедитесь, что у вас установлен Create React App и Yarn.

npm install -g create-react-app yarn

Затем создайте новое приложение React.

create-react-app react-redux-example
cd react-redux-example

Прежде чем писать код, забежим вперед и установим все необходимые зависимости.

yarn add redux react-redux react-router-dom react-router-redux@next redux-thunk history redux-devtools-extension

Замечание: Все файлы, которые будут созданы далее, должны находится в папкеsrc.

1. Store

Все в Redux хранится в одном store. Давайте создадим наш store и разберемся с react-router и redux-thunk.

./src/store.js

В пределах store мы импортируем несколько core-модулей из Redux, которые помогают создать кастомный глобальный store. react-router-redux иredux-thunk известны как middleware для Redux. Нам соответственно необходимо сконфигурировать store для работы с ними.

Вы можете заметить, что мы делаем импорт rootReducer (мы вернемся к понятию Reducer позже) из файла, который еще не создан. Исправим это, создав ./src/modules/index.js.

./src/modules/index.js

Нашей переменной store присваивается значение, возвращаемое функцией createStore. В нашем примере она принимает rootReducer, initialState и enhancer.

Переменная history синхронизирует наш browserHistory с store. Для дальнейших нужд необходимо её экспортировать.

Кроме того мы должны экспортировать store как default.

2. Routes

В этом руководстве используется React Router v4, который позволяет устанавливать компонент в любое место нашего приложения в случае, если текущий url соответствует определенным нами значениям.

В предыдущей версии React Router вы могли видеть такие файлы, как routes.js, которые содержат большой список вложенных роутов, но React Router v4 выполняет роутинг иначе.

История роутинга хранится внутри нашего Redux store, который был создан в первой секции и был проброшен с помощью ConnectedRouter, которым мы воспользуемся позже.

Начнем мы с определения в контейнере App того, какой компонент будет выдаваться по какому url.

3. Containers

Изначально, создадим App компоненту, которая будет заниматься отрисовкой навигации и всех соответствующих роутам компонентов внутри тега main .

./src/containers/app/index.js

Теперь создадим компоненту Home, которую будем выводить по пути /.

./src/containers/home/index.js

Это должно быть очевидно для тех, кто уже использовал Redux до этого, но в данном пример мы импортируем push из react-router-redux и используем его без создания экшена.

Так как наш store знает о react-router-redux он может взаимодействовать с routing-экшенами. Магия! 💥

В конечном итоге создаем About компоненту для добавление еще одного роута.

./src/containers/about/index.js

4. Рендеринг приложения

Пришло время завести наше приложение.

Мы должны передать react-dom необходимый store и информацию об истории браузера —history . Для этого экспортируем ConnectedRouter. ConnectedRouter имеет доступ к store, предоставленному с помощьюProvider. Поэтому нет необходимости волноваться о передаче каких-то дополнительных параметров в props.

Магия React Router💥!

src/index.js

5. Добавляем Redux Thunk

Сейчас большинство React приложений работают с асинхронными функциями. Redux Thunk — middleware для Redux, который позволяет возвращать функцию вместо экшена.

Рассмотрим пример, чтоб стало понятно!

Давайте создадим несколько экшенов и редюсеров для счетчика.

./src/modules/counter.js

Функция incrementAsync и decrementAsync возвращают Thunk. Изначально мы пробрасываем экшн (INCREMENT_REQUEST и DECREMENT_REQUEST) и затем обворачиваем другую функцию в setTimeout(), которая вызывает dispatch во время вызова таймера. 🙌

Чтобы наш store был связан со state компонент, мы должны подключить counter.js к rootReducer.

./src/modules/index.js

Закончим наш пример с Thunk, обновив Home контейнер и добавив в него работу с state и экшенами счетчика.

./src/containers/home/index.js

Запускаем!

Пришло время запустить приложение с помощью команды yarn start. Ниже показаны результаты! Вы можете пощупать в живую на Heroku.

Рабочий пример🤘

Вы можете найти больше руководств и видео на канале автора текста. Подписывайтесь! ❤️

--

--

Responses (1)