These are chat archives for dev-ua/reactjs

15th
May 2017
Myroslav Tantsyura
@Nahasaki
May 15 2017 14:55
чи нормально в redux писати рекурсивний action creator, який запускає себе ще раз при певних умовах з getState?
з thunk
Myroslav Tantsyura
@Nahasaki
May 15 2017 15:03
В стейті є колекція елементів, в яких є поле status. Цей статус може бути різний, але тільки один елемент може мати статус 'action'. Відповідно перед встановленням статуса 'action' на будь-який елемент потрібно перевірити чи вже є такий статус в іншого елемента і якщо такий є, то змінити його на 'done'. Для встановлень треба звертатися до сервера.
export const setActionStatus = (_key, status) => {
  return (dispatch, getState) => {
    if (status === 'action') {
      const oldElem = getState().someCollection.find(i => i.status === 'action');
      dispatch(setActionStatus(oldElem._key, 'done'));
    }
    // ... set status logic
  }
}
якось так. Це нормально?
Viktor Kenyz
@Skakruk
May 15 2017 15:10
я б виніс логіку по знаходженню активного елемента наверх і викликав просто два рази цей екшн кріейтор, так він був би чистішим)
Myroslav Tantsyura
@Nahasaki
May 15 2017 15:11
ну нажаль в mapDispatchToProps поточний стейт недоступний
Viktor Kenyz
@Skakruk
May 15 2017 15:12
але ж в компоненті доступний, звідки викликається цей екшн кріейтор
Myroslav Tantsyura
@Nahasaki
May 15 2017 15:12
ну хіба шо в самому контейнері то робити
шось воно мені менше подобається ніж в екшн кріейторі
власне треба тоді робити копонент-контейнер замість того, шоб просто викликати connect
Viktor Kenyz
@Skakruk
May 15 2017 15:14
а де ти його викликаєш?
Myroslav Tantsyura
@Nahasaki
May 15 2017 15:15
import { connect } from 'react-redux';

import { setActionStatus } from '../../actions/actions';
import ActionItem from '../../components/ActionItem';

const mapStateToProps = (state) => {
  return {
    actionStatuses: state.actions.statuses
  }
}
const mapDispatchToProps = (dispatch, ownProps) => {
  return {
    setActionStatus: (status) => {
      dispatch(setActionStatus(ownProps.action._key, status));
    }
  }
}

const ActionContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(ActionItem);

export default ActionContainer;
просто так, без компонента
Viktor Kenyz
@Skakruk
May 15 2017 15:16
а якщо прописати в mapStateToProps state.someCollection а потім витягувати з ownProps в mapDispatchToProps?
Myroslav Tantsyura
@Nahasaki
May 15 2017 15:17
тай ну, то збочення якесь
краще вже зробити той компонент-контейнер
Власне тоді питання -- чи не є антипаттерном запускати action creator рекурсивно?
Illia Seheda
@ALF-er
May 15 2017 15:29
у connect() є третій аргумент (можливо, не зрозумів питання)
Myroslav Tantsyura
@Nahasaki
May 15 2017 17:02
Тобто на етапі mergeProps діспатчити екшн?