Калькулятор Заряду Батареї Тесла на Redux [Відгук на Курс – Частина 2]

Тут ітиметься саме про базу Redux. Ти зрозумієш, що лежить у його основі. А зрозумівши базу – розумітимеш документацію Redux і її просунуті розділи.

Це відгук про другу частину курсу, де в розробці Калькулятора заряду батареї Тесла застосовується Redux. А перша частина розповідає про розробку Калькулятора лише на React.

Щоби зрозуміти і засвоїти матеріал цієї частини курсу, треба знати:

  • Базовий JavaScript: об’єкти і функції.
  • Основи React.
  • Компоненти, з яких складається Калькулятор заряду батареї Тесла. Тому спочатку обов’язково ознайомся з першою частиною курсу (про React) і пройди її.

Не зважай, що на Github код Калькулятора ще з 2017 року. Кодувати можеш своїм стилем, як тобі зручно зараз. Але курс дає принципи розробки на Redux, мислення під час проєктування додатку – а таке не застаріває.

Ось, які теми з розробки на Redux розкриваються:

Зміст

Що Відбувається з Даними і Компонентами, Коли Додаток Росте?

Калькулятор заряду батареї Тесла (це додаток, який розробляємо на курсі) складається з однієї сторінки. І всі компоненти розміщуються на ній. А якщо компонентів на сторінці стане дуже багато? Де зберігати дані для їх усіх?

Якщо всі компоненти сторінки будуть у одному-єдиному контейнері, то його стан має містити всі дані. Тому об’єкт стану розростеться, ускладниться. В ньому можуть з’явитися інші – вкладені – об’єкти, масиви. А код для оновлення такого складного стану теж буде складний.

А якщо треба буде щось переробити – уявляєш, скільки це роботи? Ювелірно, щоби не зачепити те, що вже працює.

Передача Даних Між Компонентами Без Спільних Батьків

У моїй практиці інколи треба було передавати дані між компонентами, у яких не було спільного батьківського. І я мусив створювати цей спільний батьківський контейнер лише для того, щоби в його стані зберігати дані для обох компонентів. Це техніка “Lift State Up” із документації React. Але з іншого боку – це додатковий код, збільшення розміру додатку і ускладнення його будови.

А якщо не створювати цих додаткових батьківських контейнерів? І мати доступ до одних і тих самих даних не лише з різних компонентів, а і з будь-яких місць додатку?

Приклад із малюнка з курсу (частина):

Доступ компоненту до даних із різних контейнерів
  • Компонент “Product 1-2” отримує дані від контейнера Products, бо є його дитиною.
  • Так само компонент “Service 1” – від контейнера Services.
  • А якщо у “Product 1-2” треба показати частину даних із “Service 1” – як їх дістати?

Звідки Компоненти Без Спільних Батьків Братимуть Дані?

Курс цитує документацію React, яка радить утворити власну систему обміну інформацією між компонентами:

  • Окреме сховище даних, незалежне від компонентів і контейнерів React.
  • Будь-які компоненти можуть підключатися до цього сховища.
  • Якщо певні дані у сховищі оновилися, то це видно в тих компонентах, які показують ці дані.

Так ти плавно здогадуєшся, що така система вже є, і це Redux.

Redux як Єдине Місце Для Роботи з Даними (Станом) Додатку

Особисто мені Redux часто здавався якимось надлишковим. Бо зберігати дані можна і в станах контейнерів. То навіщо видумувати ще щось?

А от погляд на Redux як спосіб передачі даних компонентам без спільних батьків – це багато чого прояснило. І на курсі ти розглянеш Redux саме з такого боку.

Три Складові, Які Дозволяють Redux Зберігати і Оновлювати Дані

Із цих трьох частин і складається весь Redux. Саме вони забезпечують зберігання, змінювання даних і повідомлення компонентів про їх оновлення:

  • Сховище – в ньому зберігаються дані (і про нього вже трохи знаємо). Ти побачиш, що воно схоже на стан у контейнерах React.
  • Події – це такі шматочки інформації, які лише описують, як треба змінити дані у сховищі. Але самі події не роблять жодних змін!
  • Редюсери – функції, які беруть інформацію з подій і вже змінюють дані у сховищі.

Курс чітко розділяє зони відповідальності кожної складової. Ти побачиш Redux із самого початку як просту і зрозумілу систему. Хоча його документація велика і досить складна.

Яким є Redux із Точки Зору JavaScript?

Три складові Redux – це базовий JavaScript. Два об’єкти і одна функція:

  • Сховище – це один великий об’єкт JavaScript.
  • Події – маленькі об’єктики, їх може бути багато.
  • Редюсер – функція JavaScript, яка бере інформацію з подій і змінює дані у об’єкті-сховищі.

От і все! Жодних складних алгоритмів, теорем чи формул.

Коли Найдоцільніше Користати Redux у Веб-Додатку?

В уроці 2.2 буде посилання на допис творця Redux, Дена Абрамова – “You Might Not Need Redux”. Ознайомся з ним.

З Якими Технологіями, Фреймворками Можна Користати Redux?

Найбільше використовують Redux у додатках на React. А курс відповість коротко, з якими ще технологіями можна його користати.

Сховище Redux – Для Зберігання і Оновлення Даних

Ти дізнаєшся, чому в Redux є лише одне сховище даних – навідміну від контейнерів React зі станом, яких може бути багато.

Ось, яке сховище буде в Калькуляторі заряду батареї Тесла:

Калькулятор заряду батареї Тесла: сховище даних у Redux

Зверни увагу на типи даних у сховищі: рядки, цифри, логічне true. Можуть бути всі, які є у JavaScript.

Організація даних усередині сховища і їхні стосунки між собою – теж як у звичайному об’єкті JavaScript. Можуть бути вкладені об’єкти і масиви.

Як Оновити Сховище, Щоб Додаток Відобразив Усі Зміни Даних?

Ти вмітимеш оновлювати дані у сховищі Redux так, щоби вони правильно відображалися в усіх необхідних місцях додатку. Бо в деяких випадках додаток може не помічати частину змін і працюватиме неправильно.

В уроці 2.10 ти побачиш:

  • Два приклади неправильного оновлення сховища, коли додаток не покаже всі зміни даних.
  • Правильне оновлення сховища – коли 100% усі зміни даних відобразяться.
Оновлення стану сховища Redux у Калькуляторі заряду батареї Тесла

Усі три приклади – це дві прості команди JavaScript для роботи з об’єктами:

  • Перший приклад – це одна команда (неправильне оновлення сховища).
  • Приклади 2 і 3 – це друга команда (однакова – для неправильного і правильного оновлення). Приклад 3 (правильне оновлення) відрізняється лише одним додатковим аргументом у команді.

А в новій версії JavaScript (ES6) друга команда (для прикладів 2 і 3) писатиметься ще простіше: без довгих Object.assign() і купи аргументів.

Події як Основа для Оновлення Даних у Сховищі Redux

За суттю події в Redux схожі на об’єкти подій (event objects) у DOM. Ти навчишся передавати у подіях Redux ті дані, які треба змінити чи оновити у сховищі. Зверни увагу на поля:

  • type – у ньому задають тип події. Це щоби зручно відрізняти події одну від одної.
  • Решта полів – суто інформаційні. Вони можуть бути в довільній формі.
Об'єкти подій Redux для калькулятора заряду батареї Тесла

Будову об’єкту події теж краще робити однаковою. Це такий собі внутрішній стандарт коду в додатку. Щоб обробка подій далі була зручнішою.

Іще ти розумітимеш стосунки між сховищем Redux і подіями:

  • Чи мусить кожна подія спричиняти зміни у сховищі? – Ні. Події незалежні від того, зміняться дані у сховищі у відповідь на них чи ні.
  • Чи має сховище Redux обов’язково змінюватися у відповідь на кожну подію?- Ні, воно може пропускати події і не мінятися.

Раніше мені здавалося, що в подіях можна робити і якусь логіку, а не тільки переносити дані. І це плутало. Але курс наголошує, що:

  • Події лише переносять інформацію – і нічого більше. А її обробка буде в редюсерах.
  • Я сам визначаю, які події що змінюють, а які – ні.

Оце і все, що треба знати про об’єкти подій та інформацію, яка переноситься в них.

В уроці 2.5 (заголовок 2.5.2) ти ознайомишся з Redux API, який складається лише з чотирьох методів:

Redux API: всі методи

І серед них немає такого, який би змінював дані сховища напряму. Тільки через події (actions).

Практика: Створення Подій у Redux

Калькулятор заряду батареї Тесла опрацьовує багато подій. Треба їх планувати і впорядковувати (задавати їм типи), щоб:

  • Не заплутатись у їхній кількості.
  • Розуміти, за яку зміну даних відповідає кожна подія.

Події одного типу можуть переносити різні значення. А як найзручніше їх створювати, щоби не писати ті поля в об’єкті, які повторюються? Ти навчишся це робити за допомогою звичайних функцій JavaScript, які зватимуться творцями подій (action creators):

  • Функції-творці прийматимуть лише значення, які має переносити подія.
  • Повертатимуть готові об’єкти подій з усіма необхідними полями.

Такі функції-творці ти опишеш у контейнерах React при підключенні до Redux. І передаватимеш їх компонентам-дітям.

В уроці 2.7 буде план усього стану і подій Redux для Калькулятора заряду батареї Тесла:

План стану і всі події Redux для Калькулятора заряду батареї Тесла

Можеш тримати перед очима, щоб орієнтуватися під час розробки.

Функції-Редюсери для Обробки Подій і Оновлення Даних у Сховищі Redux

Ти знатимеш, як редюсери обробляють інформацію з подій і оновлюють дані у сховищі Redux.

Взагалі, стан додатку в Redux утворюють за допомогою редюсерів, а не прямим задаванням об’єкту JavaScript (як у контейнерах React). На курсі буде картинка, яка показує рух подій у редюсер і код самого редюсера:

Робота редюсера в Калькуляторі заряду батареї Тесла

Практика: Написання Редюсера

У Калькуляторі заряду батареї Тесла буде один редюсер. Його достатньо, щоб обробляти всі події.

Ти дізнаєшся:

  • Як приймає редюсер стан і подію?
  • Скільки аргументів може бути в редюсера взагалі?
  • Типову логіку роботи редюсера, використовуючи команду JavaScript – switch. Так пишуться майже всі редюсери, тому просто запам’ятай підхід.

Курс покаже обробку в редюсері лише двох перших випадків: повернення стану за замовчуванням і першої події – зміни клімату. Обробка решти подій – дуже схожа.

Також буде файл із повним кодом редюсера. То обробку решти подій у редюсері допиши, користаючи цей файл як інструкцію.

Зверни увагу на те, що редюсер ЗАВЖДИ має повертати об’єкт стану – оновлений чи той самий.

Як Підключити Redux у Додаток на React?

React (контейнери, компоненти) і Redux (сховище, події, редюсери) – це окремі скриньки. У них немає з’єднання за замовчуванням. Тому ти їх поєднаєш через спеціальний компонент – Provider.

Провайдеру треба передати одну-єдину властивість і поставити його в коді додатку на одне-єдине місце. Три одиничні дії – “один-один-один” – і будь-які контейнери в React можна підключати до Redux, щоб отримувати дані зі сховища.

В уроці 2.12 буде величезна картинка, яка показує підключення Provider у Калькулятор заряду батареї Тесла:

Компонент Provider для Redux у Калькуляторі заряду батареї Тесла

На ній ти побачиш:

  • Звідки береться готовий Provider? Його не треба самостійно створювати.
  • В якому місці додатку вставити Provider і скільки разів?
  • Як створити стан із редюсерів і передати його у Provider?
  • Як контейнери React отримають дані зі сховища Redux?

Redux із Контейнерами і Компонентами React

Ти навчишся під’єднувати контейнери до сховища Redux, вставляти компоненти в контейнери і брати з Redux лише необхідні дані для кожного компоненту.

В уроці 2.6 є картинка з планом усіх контейнерів Redux і компонентів:

Схема контейнерів Redux і компонентів у Калькуляторі заряду батареї Тесла

Свій контейнер призначаємо не просто кожному компоненту, а кожному МІСЦЮ, де використовуватиметься компонент. В Калькуляторі заряду батареї Тесла є два місця з однаковим зовнішнім виглядом (компонентом), але дані треба брати з різних частин сховища Redux. Тому в таких місцях додатку і будуть два окремі контейнери, які використовуватимуть один і той самий компонент.

Багато проєктів моїх замовників змішували код React і Redux. У компонентах поряд із розміткою зі стилями могла бути і логіка. Особисто мені такі компоненти вважались якимись негнучкими, прив’язаними до місць їхнього використання.

А цей курс показує, як повністю відділити контейнери Redux від компонентів. Щоб у контейнерах була обробка даних, а компоненти займалися відображенням.

Створення Контейнерів для Redux і Передача Даних у Компоненти

Ти дізнаєшся швидкий і простий спосіб створювати контейнери для Redux, щоби вони працювали найпродуктивніше. Це робиться одним рядком коду за допомогою функції connect із пакету react-redux.

В контейнері не буде розмітки JSX, стилів – лише підготовка даних для компоненту. Дані з контейнера передадуться в компонент автоматично. Не треба писати їхню передачу вручну через кожну властивість.

В уроці 2.11 будуть картинки-схеми підключення до Redux кожного контейнера в Калькуляторі заряду батареї Тесла:

Підключення контейнера в Калькуляторі заряду батареї Тесла до Redux

Ось, що ти вмітимеш робити в контейнерах:

  • Отримувати дані зі сховища Redux, опрацьовувати їх і готувати з них такі, які треба для компонентів.
  • Отримувати і обробляти дані від користувачів додатку, формувати з опрацьованих даних події та направляти для оновлення сховища Redux.

Як Бачити Стан Redux у Реальному Часі Під Час Розробки?

Ти зможеш відслідковувати точну історію того, що стається в додатку. І бачити причини, чому і як він змінюється. Правда, це можливо (поки-що) у браузері Chrome. Ти додаси спеціальне розширення для нього, а в коді додатку допишеш два невеликі рядки.

В уроці 2.14 буде рухома картинка зі сторінкою Калькулятора заряду батареї Тесла і відкритою в ній вкладкою розширення:

Калькулятор заряду батареї Тесла з відкритою вкладкою аналізу роботи Redux

Ось, що ти зможеш аналізувати:

  • Дані в сховищі Redux у кожен момент часу.
  • Які відбуваються події та які дані вони переносять?
  • Зміни даних у сховищі Redux внаслідок подій.
  • Історію подій і змін даних у сховищі.

Бонуси: Додаткові Теми з JavaScript

Крім власне Redux, ти вивчиш (або повториш) те, що часто застосовується в розробці або питається на співбесідах.

Незмінні Структури Даних (Immutable Data)

Це для оновлення сховища Redux і станів у React. Один простий принцип із JavaScript, який пояснює, чому оновлювати сховище треба саме через повну заміну старого об’єкту новим. Ти знатимеш:

  • Які типи даних у JavaScript є незмінними, а які – змінними?
  • Команди і оператори JavaScript, які застосовуються для заміни об’єктів повністю.

Розробка Тестами (Test Driven Development)

На прикладі розробки редюсера для Калькулятора заряду батареї Тесла. Якщо тести – це нове для тебе, то просто зроби все, як написано в уроці. У процесі зрозумієш.

Ти почнеш із написання коду, який тестуватиме різні можливі випадки роботи редюсера. Цей код показуватиме успіхи чи провали в результатах цих тестів і де шукати причини.

Одночасно ти розроблятимеш і код самого редюсера. Виправлятимеш його, щоби він проходив усі тести успішно.

В уроці 2.10 будуть знімки екрану з прикладами результатів тестів. І готовий код усього редюсера з тестами – для перевірки твого коду.

Тобі не треба нічого встановлювати і налаштовувати. У Калькуляторі заряду батареї Тесла є вбудований запускач тестів. А ти лише писатимеш їхній код у JavaScript-файлах із розширеннями .spec.js / .test.js або розміщених у спеціальних теках __tests__.

Розроби Свій Калькулятор Заряду Батареї Тесла із Використанням Redux

Переходь на сторінку з безкоштовним курсом, реєструйся і починай проходити.

Ти освоїш базу Redux – три його складові, на яких усе тримається. І побачиш, як уже з цим знанням ти зможеш розробляти додатки. А ще тобі буде легше розуміти офіційну документацію і вивчати наступні, складніші теми Redux.

У твоєму коді будуть:

  • Незмінні структури даних і їхнє застосування в Redux, щоби додаток правильно відображав усі оновлення у сховищі даних.
  • Тести для автоматичної перевірки роботи функції-редюсера.
  • Налаштування можливості бачити й аналізувати роботу додатку в реальному часі.

Навчися працювати з єдиним сховищем Redux для всіх даних додатку, до якого матимуть доступ усі компоненти незалежно від наявності спільних батьків.

Add a Comment

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.