How to fetch the new data in response to React Router change with Redux?
Solution 1:
Now, my question is, Is this really necessary or just a way to keep the architecture react-agnostic? Can I just fetch the information I need from react componentDidMount() and componentDidUpdate() instead?
You can totally do that in componentDidMount()
and componentWillReceiveProps(nextProps)
.
This is what we do in real-world
example in Redux:
function loadData(props) {
const { fullName } = props;
props.loadRepo(fullName, ['description']);
props.loadStargazers(fullName);
}
class RepoPage extends Component {
constructor(props) {
super(props);
this.renderUser = this.renderUser.bind(this);
this.handleLoadMoreClick = this.handleLoadMoreClick.bind(this);
}
componentWillMount() {
loadData(this.props);
}
componentWillReceiveProps(nextProps) {
if (nextProps.fullName !== this.props.fullName) {
loadData(nextProps);
}
/* ... */
}
You can get more sophisticated with Rx, but it's not necessary at all.
Solution 2:
I've did this with custom binding on plain router onEnter/onLeave callback props like this:
const store = configureStore()
//then in router
<Route path='/myRoutePath' component={MyRouteHandler} onEnter={()=>store.dispatch(myRouteEnterAction())} />
It's a bit hacky but works, and I don't know better solution right now.
Solution 3:
1) dispatching optimistic request actions on route changes, i.e. BrowserHistory.listen(location => dispatch(routeLocationDidUpdate(location)));
2) Async Actions: http://redux.js.org/docs/advanced/AsyncActions.html