Files

116 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 5a24c314108439a4d4036143
title: Вилучення State Logic в Redux
challengeType: 6
forumTopicId: 301429
dashedName: extract-state-logic-to-redux
---
# --description--
Тепер, коли ви закінчили компонент React, вам потрібно перемістити логіку, яку він виконує локально в його `state` в Redux. Це перший крок, який дозволяє підключити простий додаток React до Redux. Єдину функцію, яку має ваш додаток - це додавання нових повідомлень від користувача до неупорядкованого списку. Приклад простий, для того щоб показати, як React та Redux працюють разом.
# --instructions--
Спершу, визначте значення змінної `ADD` і встановіть її у const `ADD`. Далі, встановіть виконавця дій `addMessage()`, який створює дію для додавання повідомлення. Вам потрібно передати `message` цьому виконавцю дій і додати повідомлення у повернене `action`.
Потім створіть скорочення, яке називається `messageReducer()`, яке обробляє стан для повідомлень. Початковий стан повинен дорівнювати пустому масиву. Це скорочення повинно додавати повідомлення до масиву, який зберігається у стані чи повертати поточний стан. Нарешті, створіть ваше сховище Redux та передайте його до reducer.
# --hints--
Конст `ADD` має існувати і утримувати значення рівне рядку `ADD`
```js
assert(ADD === 'ADD');
```
Виконавець дій `addMessage` має видати об'єкт з `type` рівний до `ADD` і `message` рівний до повідомлення в якому воно передається.
```js
assert(
(function () {
const addAction = addMessage('__TEST__MESSAGE__');
return addAction.type === ADD && addAction.message === '__TEST__MESSAGE__';
})()
);
```
`messageReducer` повинно бути функцією.
```js
assert(typeof messageReducer === 'function');
```
Сховище повинно існувати і мати початковий стан, встановлений на пустому масиві.
```js
assert(
(function () {
const initialState = store.getState();
return typeof store === 'object' && initialState.length === 0;
})()
);
```
Відправлення `addMessage` до сховища повинно незмінно додавати нове повідомлення до масиву повідомлень, які знаходиться у стані.
```js
assert(
(function () {
const initialState = store.getState();
const isFrozen = DeepFreeze(initialState);
store.dispatch(addMessage('__A__TEST__MESSAGE'));
const addState = store.getState();
return isFrozen && addState[0] === '__A__TEST__MESSAGE';
})()
);
```
`messageReducer` має повернутися до поточного стану, якщо викликається з будь-яким іншими діями.
```js
assert(
(function () {
const addState = store.getState();
store.dispatch({ type: 'FAKE_ACTION' });
const testState = store.getState();
return addState === testState;
})()
);
```
# --seed--
## --seed-contents--
```jsx
// Define ADD, addMessage(), messageReducer(), and store here:
```
# --solutions--
```jsx
const ADD = 'ADD';
const addMessage = (message) => {
return {
type: ADD,
message
}
};
const messageReducer = (state = [], action) => {
switch (action.type) {
case ADD:
return [
...state,
action.message
];
default:
return state;
}
};
const store = Redux.createStore(messageReducer);
```