Une autre alternative est de gérer cela à l'aide de Thunk de style asynchrone actions (qui sont sûrs/autorisés à avoir des effets secondaires).
Si vous utilisez Thunk, vous pouvez injecter le même history
objet dans votre <Router>
de composants et de Thunk actions à l'aide de thunk.withExtraArgument
, comme ceci:
import React from 'react'
import { BrowserRouter as Router, Route, Redirect} from 'react-router-dom'
import { createBrowserHistory } from "history"
import { applyMiddleware, createStore } from "redux"
import thunk from "redux-thunk"
const history = createBrowserHistory()
const middlewares = applyMiddleware(thunk.withExtraArgument({history}))
const store = createStore(appReducer, middlewares)
render(
<Provider store={store}
<Router history={history}>
<Route path="*" component={CatchAll} />
</Router
</Provider>,
appDiv)
Ensuite, dans votre action, créateurs, vous aurez un history
instance qui est sûr à utiliser avec ReactRouter, de sorte que vous pouvez simplement déclencher régulièrement Redux événement si vous n'êtes pas connecté:
// meanwhile... in action-creators.js
export const notLoggedIn = () => {
return (dispatch, getState, {history}) => {
history.push(`/login`)
}
}
Un autre avantage, c'est que l'url est plus facile à manipuler, maintenant, nous pouvons donc mettre rediriger info sur la chaîne de requête, etc.
Vous pouvez essayer encore de faire cette vérification dans votre Rendu méthodes, mais s'il cause des problèmes, vous pourriez envisager de le faire dans componentDidMount
, ou ailleurs dans le cycle de vie (bien qu'aussi je comprends le désir de coller avec Apatrides Fonctionnelle Compeonents!)
Vous pouvez toujours utiliser Redux et mapDispatchToProps
d'injecter de l'action créateur dans votre comptonent, de sorte que votre composant n'est encore que faiblement connecté pour Redux.