Задать вопрос
@fronter-up

Функция connect() Redux, как правильно использовать?

Добрый день! Объясните пожалуйста как сделать правильно на Redux?
Суть такова:
В приложении в сайдбаре есть селект, который обновляет отображения контента в сайдбаре, соответственно в главном компоненте сайдбра я делаю connect() компонента и диспатчу props.
Сейчас надо еще обновлять основной контент при change селекта.
Вопрос:
  1. Как правильно передавать изменнения в таком случае, чтобы обновлять основной контент (вопрос решится когда перенести connect() на уровень выше где есть сайдбар и main компонент, но правильно ли это)?
  2. Функции connect, их должно быть как можно меньше и должны быть на высших уровнях?
Объясните пожалуйста если я что-то не так понимаю.
Заранее спасибо!)
  • Вопрос задан
  • 1244 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 3
@davidnum95
Тут два варианта:
1. Подписаться на поле которое отвечает за текущий тип сайдбара в main компоненте, например
class MainComponent extends React.Component {
  static propTypes = {
    activeType: PropTypes.string,
  }

  static mapStateToProps(state) {
    return {
      activeType: state.sideBar.activeType,
    };
  }
// ....
export default connect(
  MainComponent.mapStateToProps,
  {})(MainComponent);

2. Подписаться на изменение селекта сайдбара в редьюсере main компонента:
import { CHANGE_TYPE as SIDEBAR_CHANGE_TYPE } from '../SideBar/constants';

const initState = {
  activeType: undefined,
};

export default (state = initState, action) => {
  switch (action.type) {
    case SIDEBAR_CHANGE_TYPE:
      return {
        ...state,
        activeType: action.payload,
      };
    // ....
    default:
      return state;
  }
};
Ответ написан
gadfi
@gadfi
https://gamega.org
1. Как правильно передавать изменнения в таком случае, чтобы обновлять основной контент (вопрос решится когда перенести connect() на уровень выше где есть сайдбар и main компонент, но правильно ли это)?

не уверен что я вас правильно понял но у вас одна стора на все приложение, где вы ее измените не имеет значения (в том смысле что не важно откуда вы дергаете action )

2. Функции connect, их должно быть как можно меньше и должны быть на высших уровнях?

если их экономить то у вас получатся фрагменты с овердофига пропертями которые очень не удобно использовать
Ответ написан
@SuperOleg39ru
Front-end разработчик
Множество connect компонентов, которые передают из store минимально необходимое количество данных - это верный подход, в таком случае компонент, обернутый в connect, будет обновляться только тогда, когда изменились реальные данные, от которых он зависит.

По вашей проблеме:

Представим, что в store у вас есть 2 свойства:
1) options - массив строк для селекта
2) selectedOption - выбранная строка (пустая по дефолту)

И например одно действие - selectOption(option), для обновления selectedOption в store.

Далее условные обернутые компоненты:
// Ваш сайдбар обновится при каждом изменении selectedOption
connect((state, ownProps) => ({ selectedOption: state.selectedOption }))(SidebarComponent)

// Ваш селект обновляется в зависимости от изменения обоих свойств,
// и используя свойство onSelect может обновить selectedOption самостоятельно
connect(
  (state, ownProps) => ({ options: state.options, selectedOption: state.selectedOption }),
  (dispatch, ownProps) => ({ onSelect: (value) => dispatch(selectOption(value)) })
)(SelectComponent)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы