Уважаемые коллеги, требуется помощь с вопросом "рекурсивности" redux.
Описание проблемы:
Суть заключается в том, что компонент получает
props
из
react-router
и в
componentWillMount
загружает первую страницу записей. На этом этапе все отлично.
Далее фильтруем / сортируем данные или используем постраничную разбивку и отправляем пользователя на новый url с измененным qs (пример /news/list?page=2). На этом этапе по логике нужно использовать
componentWillReceiveProps
, так как компонент остался прежним, но пришли новые данные. Если внутри данного метода выполнить
dispatch(actions.чтонибудь())
, то нам придут данные в props и тут возникает рекурсия.
react-router -> componentWillReceiveProps -> dispatch -> componentWillReceiveProps -> dispatch -> ...
Вопрос:
Каким образом вы используете redux в данных ситуациях и как избежать подобной проблемы?
Дополнительная информация:
Так как возможно я не совсем корректно выразил свои мысли, то попробую перефразировать. В componentWillReceiveProps приходят props переданные из N источника, а так же новое состояние state полученного из redux. В конечном итоге state самого компонента не задействован совсем, а вот в props происходит мешанина.
Чтобы избежать рекурсии когда redux dispatch вызывает сам себя, можно использовать Immutable.js, но мне не кажется это решением проблемы, так как 1) Придется сохранять дополнительный ключ-значение в state 2) Сбрасывать значения в определенный момент. И следить за этим конечно же придется руками.
Еще один вариант который мне кажется тоже не совсем адекватный - проверять все руками:
const { params } = nextProps;
if (params.page != this.props.page || params.page_size != this.props.page_size || params.order != this.props.order || ...) {
Вариант не является адекватным решением при сложных проектах или сложных условиях где параметров участвующих в проверке может быть N, либо они вовсе могут быть динамическими.