freeCodeCamp/curriculum/challenges/russian/03-front-end-libraries/react-and-redux/extract-state-logic-to-redu...

4.2 KiB
Raw Blame History

id title challengeType isRequired forumTopicId localeTitle
5a24c314108439a4d4036143 Extract State Logic to Redux 6 false 301429 Извлечь логику состояния в Redux

Description

Теперь, когда вы закончили компонент React, вам нужно переместить логику, которую она выполняет локально в своем state в Redux. Это первый шаг для подключения простого приложения React к Redux. Единственная функциональность вашего приложения - это добавить новые сообщения от пользователя в неупорядоченный список. Пример прост, чтобы продемонстрировать, как React и Redux работают вместе.

Instructions

Сначала определите тип действия «ADD» и установите его в ADD const. Затем определите создателя действия addMessage() который создает действие для добавления сообщения. Вам нужно передать message этому создателю действия и включить сообщение в возвращаемое action . Затем создайте редуктор, называемый messageReducer() который обрабатывает состояние для сообщений. Начальное состояние должно равняться пустующему массиву. Этот редуктор должен добавить сообщение в массив сообщений, находящихся в состоянии, или вернуть текущее состояние. Наконец, создайте свой магазин Redux и передайте ему редуктор.

Tests

tests:
  - text: The const <code>ADD</code> should exist and hold a value equal to the string <code>ADD</code>
    testString: assert(ADD === 'ADD');
  - text: The action creator <code>addMessage</code> should return an object with <code>type</code> equal to <code>ADD</code> and <code>message</code> equal to the message that is passed in.
    testString: assert((function() { const addAction = addMessage('__TEST__MESSAGE__'); return addAction.type === ADD && addAction.message === '__TEST__MESSAGE__'; })());
  - text: <code>messageReducer</code> should be a function.
    testString: assert(typeof messageReducer === 'function');
  - text: The store should exist and have an initial state set to an empty array.
    testString: assert((function() { const initialState = store.getState(); return typeof store === 'object' && initialState.length === 0; })());
  - text: Dispatching <code>addMessage</code> against the store should immutably add a new message to the array of messages held in state.
    testString: 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'); })());
  - text: The <code>messageReducer</code> should return the current state if called with any other actions.
    testString: 'assert((function() { const addState = store.getState(); store.dispatch({type: ''FAKE_ACTION''}); const testState = store.getState(); return (addState === testState); })());'

Challenge Seed

// define ADD, addMessage(), messageReducer(), and store here:

Solution

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);