Как легко отделиться от редукции?

Я хочу иметь возможность легко переходить от Redux (использовать другую реализацию, похожую на поток) или повторно использовать наши компоненты React для создания динамических представлений, какое различие мне следует делать и как я могу реализовать эту идею? Для иллюстрации вы можете использовать класс Dashboard.

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
// fetches projects from a remote server using Redux actions
import { fetchProjects } from '../../ducks/projects';

export class Dashboard extends Component {
  static propTypes = {
    dispatch: PropTypes.func.isRequired,
    isFetching: PropTypes.bool.isRequired,
    projects: PropTypes.array.isRequired
  };

  // Voluntarily obfuscated
  componentXXX() {
    this.fetchData();
  }

  fetchData() {
    const { dispatch, status } = this.props;
    dispatch(fetchProjects({ status }));
  }

  render() {
    const { isFetching, projects } = this.props;
    return <ProjectsPane projects = {projects} isFetching = {isFetching} />;
  }
}

function mapStateToProps(state) {
  const { isFetching, projects } = state;
  return {
    isFetching,
    projects
  };
}

export default connect(mapStateToProps)(Dashboard);

export class ProjectsPane extends Component {
  // ...
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
266
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Одна вещь, которую вы можете сделать в приложениях Redux, - это отделить ваши подключенные (контейнерные) компоненты от презентационных компонентов. У Дэна Абрамова, автора Redux, есть отличная статья об этом шаблоне здесь. Подводя итог, вы создаете свой презентационный компонент, не зная Redux. Он получает данные через реквизиты и запрашивает их через реквизиты обратного вызова (например, this.props.onNeedData()). В вашем примере компонент Dashboard уже близок к тому, чтобы быть презентационным компонентом. Вы можете пойти немного дальше, используя mapDispatchToProps для передачи функции fetchProjects в качестве опоры обратного вызова. Вы можете узнать больше об аргументе mapDispatchToPropsздесь. Кроме того, я бы последовал совету Дэна и начал бы с подключения компонента верхнего уровня и передачи данных / обратных вызовов через реквизиты, пока это не станет менее управляемым, и вам нужно будет подключить другие компоненты. Это поможет свести к минимуму объем вашего кода, который знает о Redux.

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
// fetches projects from a remote server using Redux actions
import { fetchProjects } from '../../ducks/projects';

export class Dashboard extends Component {
  static propTypes = {
    dispatch: PropTypes.func.isRequired,
    isFetching: PropTypes.bool.isRequired,
    projects: PropTypes.array.isRequired
  };

  // Voluntarily obfuscated
  componentXXX() {
    this.fetchData();
  }

  fetchData() {
    const { onNeedData, status } = this.props;
    onNeedData({ status });
  }

  render() {
    const { isFetching, projects } = this.props;
    return <ProjectsPane projects = {projects} isFetching = {isFetching} />;
  }
}

function mapStateToProps(state) {
  const { isFetching, projects } = state;
  return {
    isFetching,
    projects
  };
}

const mapDispatchToProps = {
  onNeedData: fetchProjects
};

export default connect(mapStateToProps, mapDispatchToProps)(Dashboard);

Также стоит оценить свой проект и решить, действительно ли вам нужен Redux. Вы используете Redux, потому что оценили его стоимость и преимущества и увидели, что это будет положительно для вашего проекта? Многие учебники по React в Интернете создают впечатление, будто вы не можете создать проект React без Redux или некоторого управления состоянием, но управление состоянием React довольно хорошо из коробки. На самом деле, у Дэна Абрамова есть статья с названием Вам может не понадобиться Redux, которую стоит проверить.

Спасибо, но какой метод жизненного цикла использовать для получения данных в этом случае?

Akash Sawant 04.11.2018 20:05

Это зависит от ситуации. Если для вашей выборки не требуются какие-либо реквизиты или состояние в качестве параметров (например, получение значений раскрывающегося списка), вы можете поместить их один раз в componentDidMount. Если вам нужно автообновление, вы можете использовать setInterval, а затем clearInterval в componentWillUnmount. Если вам нужно обновлять данные в любое время при изменении свойств / свойств (например, компонент User с опорой userId), тогда вам понадобятся componentDiMount и componentDidUpdate для обработки изменений состояния / свойств. Если он основан на некотором входном значении (например, поиске с опережением), вы также должны использовать противодействие, чтобы предотвратить много бесполезных выборок.

Tyler 04.11.2018 23:38

не можем ли мы улучшить вышеупомянутый компонент Dashboard, чтобы отделить redux помимо mapDispatchToProps?

Akash Sawant 05.11.2018 00:50

Самый независимый способ сделать это - подключить только компонент самого высокого уровня (корневой) и просто передать props полностью вниз. Тогда у вас есть только один компонент, который знает о Redux. Это связано с необходимостью передавать все больше и больше свойств по мере роста вашего приложения и снижать производительность в определенных ситуациях. Если вы хотите использовать Redux или любое другое внешнее управление состоянием, ваши компоненты должны знать об этом в какой-то момент. Вы можете попытаться абстрагировать функцию connect в своей собственной «оболочке» для нее, но она, вероятно, будет слишком специфичной для Redux, чтобы служить своей цели.

Tyler 05.11.2018 01:23

Другие вопросы по теме