В этом посте мы увидим интеграцию Redux в ReactJS.
Давайте рассмотрим пример, как получение данных из jsonplaceholder (бесплатный онлайн-поставщик REST API для поддельных остальных). При выборке отображать текст как выборка, после получения данных отображать его в листинге.
Живая демонстрация примера.
Мы увидим вышеприведенный пример с состоянием реакции, а затем с состоянием редукции. управление.

Примечание. Вы можете поиграть с ним на StackBlitz. В вашем браузере. Создавайте, редактируйте и развертывайте приложения с полным стеком — всего одним щелчком мыши. Онлайн-редактор кода VS, оперативное развертывание.
Просмотреть код и/или отредактировать и просмотреть предварительный просмотр приведенного выше примера.

В приведенном выше примере на основе флага isFetching мы показываем/обновляем/изменяем пользовательский интерфейс. Не беспокойтесь ни о каких редукционных терминах. Мы пойдем один на один, я объясню все термины. Если какие-либо данные или действия изменяют пользовательский интерфейс, они будут рассматриваться как избыточные действия. Таким образом, с точки зрения сокращения, isFetching будет нашим actionCreator. При вызове getUsers снова меняется пользовательский интерфейс. Таким образом, с точки зрения сокращения, getUsers будет нашим действием сокращения, и мы должны отправить/запустить это действие getUsers.

Теперь давайте начнем с Redux.
Чтобы использовать Redux, нам нужно запустить «npm install redux», а чтобы использовать его, мы должны

import * as Redux from ‘redux’;

В Redux существует только 1 глобальное хранилище уровня приложения, которое считается единым источником достоверной информации. Создайте хранилище избыточности, используя,

const store = Redux.createStore(reducer);

По сути, редьюсер предназначен для каждой страницы, что означает, что для управления любой страницей с помощью редукса вам нужно написать 1 редьюсер. Редуктор, как показано ниже,

const reducer = (state = { users: [], isFetching: false }, action) => {
  switch (action.type) {
    case ActionTypes.STARTED_UPDATING:
      return { ...state, isFetching: true, users: [] };
    case ActionTypes.UPDATED:
      return { ...state, isFetching: false, users: action.payload };
    default:
      return state;
  }
};

По сути, состояние (первый параметр редуктора) является держателем состояния для полного приложения. Теперь давайте попробуем разобраться с редьюсером.
1. редуктор просто повторно отображает пользовательский интерфейс. И в реакции для повторного рендеринга пользовательского интерфейса есть только 2 правила, 1 — изменение состояния (с помощью setState()) или изменение реквизита.
2. Если вы посмотрите на код редуктора, мы в конце , возвращая новый объект для каждого actionCreator. И если какой-либо из actionCreator запускается диспетчером действий, то пользовательский интерфейс повторно отображается с новыми обновленными данными, возвращаемыми редюсером.
3. Для любого экрана есть некоторое взаимодействие с пользователем (в терминах сокращения, которые являются действиями) . Итак, чтобы справиться с этим взаимодействием с пользователем, мы пишем избыточные действия. А с помощью действия redux мы можем обновить пользовательский интерфейс.

Чтобы использовать написанный выше редуктор, давайте посмотрим на синтаксис ниже.

const ConnectedApp = connect(
  (state) => {
    return { ...state };
  },
  (dispatch) => {
    return {
      update: () => {
        dispatch({
          type: ActionTypes.STARTED_UPDATING
        });
        getUsers()
          .then(users => dispatch({
            type: ActionTypes.UPDATED,
            payload: users
          }));
      }
    };
  })(App);

Мы использовали подключение. connect импортируется из «react-redux» (это означает, что мы должны сначала установить,

“npm install react-redux”
connect((state) => (…), (dispatch) => (…)).

connet — это функция (HOC — функция высшего порядка), которая принимает 2 аргумента. Оба аргумента являются функциями.

Argument 1. (state) => {
  return { …state };
 },

Здесь мы получаем состояние уровня приложения из первого аргумента.

Argument 2. (dispatch) => {
 dispatch({
  type: ActionTypes.STARTED_UPDATING,
 })
}

И из второго аргумента (который является функцией, получающей отправку действия от этой функции) мы можем отправить необходимый actionCreator для обновления пользовательского интерфейса.

import React from 'react';
import ReactDOM from 'react-dom';
import * as Redux from 'redux';
import { Provider, connect } from 'react-redux';
const ActionTypes = {
  STARTED_UPDATING: 'STARTED_UPDATING',
  UPDATED: 'UPDATED'
};
const getUsers = () => {
  return new Promise((resolve) => {
    return setTimeout(() => {
      return resolve(fetch('https://jsonplaceholder.typicode.com/users').then((res) => {
        return res.json()
      }).then((data) => {
        return data
      }));
    }, 2000);
  });
};
class App extends React.Component {
render() {
    return (
      <div>
        <button disabled={this.props.isFetching} onClick={this.props.update}>Fetch users</button>
        {this.props.users.length ? (<ol>
          {this.props.users.map((user) => {
            return <li key={user.id}>{user.username}</li>
          })}
        </ol>)
          : this.props.isFetching ? <div>Fetching...</div> : null
        }
      </div>
    );
  }
}
const reducer = (state = { users: [], isFetching: false }, action) => {
  switch (action.type) {
    case ActionTypes.STARTED_UPDATING:
      return { ...state, isFetching: true, users: [] };
    case ActionTypes.UPDATED:
      return { ...state, isFetching: false, users: action.payload };
    default:
      return state;
  }
};
const store = Redux.createStore(reducer);
const ConnectedApp = connect(
  (state) => {
    return { ...state };
  },
  (dispatch) => {
    return {
      update: () => {
        dispatch({
          type: ActionTypes.STARTED_UPDATING
        });
        getUsers()
          .then(users => dispatch({
            type: ActionTypes.UPDATED,
            payload: users
          }));
      }
    };
  })(App);
class Main extends React.Component {
  render() {
    return <Provider store={store}><ConnectedApp /></Provider>;
  }
}
ReactDOM.render(<Main />, document.getElementById('root'));

Активная ссылка

Используемые термины,
Поставщик, соединение, сокращение, реакция-восстановление, хранилище, редуктор, отправка, actionCreators.
1. Провайдер: этот компонент обеспечивает резервное хранилище в качестве реквизита.

<Provider store={store}>
    <ConnectedApp />
</Provider>;

2. connect: для подключения вашего приложения к redux.

connect(mapStateToPropsFun, mapDispatchToPropsFun)

3. redux: вам нужно npm установить redux.
4. react-redux: чтобы использовать redux с react, вам нужно npm установить react-redux
5. store: это единственный источник достоверной информации, полный магазин приложений, созданный

const store = Redux.createStore(reducer);

6. редуктор: редуктор зависит от состояния страницы.
7. actionCreators: уникальный тип действия для возврата данных нового редуктора
8. диспетчеризация: чтобы обновить данные конкретного редуктора хранилища избыточности, вам необходимо вызвать/отправить actionCreators.

Дайте комментарии. Любые типы комментариев всегда приветствуются. Не забудьте похлопать, если вы что-то поняли из этого поста.