Réagir routeur privé routes / redirection ne fonctionne pas
J'ai légèrement modifié la Réagir Routeur exemple pour le secteur privé, des itinéraires à jouer gentil avec Redux, mais aucun des composants sont rendus lors de la Liaison ou de Rediriger vers d'autres pages. L'exemple peut être trouvé ici:
https://reacttraining.com/react-router/web/example/auth-workflow
Leur PrivateRoute composant ressemble à ceci:
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
fakeAuth.isAuthenticated ? (
<Component {...props}/>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}}/>
)
)}/>
)
Mais, parce que j'ai incorporé dans un Redux de l'application, j'ai dû régler la PrivateRoute un peu afin que je puisse accéder à la redux magasin, ainsi que le parcours des Accessoires:
const PrivateRouteComponent = (props) => (
<Route {...props.routeProps} render={() => (
props.logged_in ? (
<div>{props.children}</div>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}} /> )
)} />
);
const mapStateToProps = (state, ownProps) => {
return {
logged_in: state.auth.logged_in,
location: ownProps.path,
routeProps: {
exact: ownProps.exact,
path: ownProps.path
}
};
};
const PrivateRoute = connect(mapStateToProps, null)(PrivateRouteComponent);
export default PrivateRoute
Chaque fois que je ne suis pas connecté et a frappé un PrivateRoute, je suis correctement redirigé vers /login. Cependant, après par exemple connectant et en utilisant un <Redirect .../>
, ou en cliquant sur l'un <Link ...>
à un PrivateRoute, l'URI de mises à jour, mais la vue n'est pas. Il reste sur le même composant.
Ce que je fais mal?
Juste pour compléter le tableau, dans l'application de la index.js
il y a quelque chose sans pertinence, et les itinéraires sont mis en place comme ceci:
ReactDOM.render(
<Provider store={store}>
<App>
<Router>
<div>
<PrivateRoute exact path="/"><Home /></PrivateRoute>
//... other private routes
<Route path="/login" component={Login} />
</div>
</Router>
</App>
</Provider>,
document.getElementById('root')
);
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'envelopper votre
Route
avec<Switch>
tagexport default connect(mapStateToProps, null, null, { pure: false })(PrivateRoute);
Veuillez aussi voir ce Stack Overflowprops.history.push
à l'intérieur d'un composant connecté avecwithRouter
, et monPrivateRoute
ne fonctionne pas sans leSwitch
. M'a sauvé beaucoup de temps, merci!Ensemble de la voie privée pour ne pas être pur:
Cela permettra à la Composante de re-rendre.
Voir: réagir-routeur-4-x-privateroute-pas-de travail-après-connexion-à-redux.
Juste eu le même problème, je l'ai résolu en faisant mon Application redux conteneur et en passant isAuthenticated comme un accessoire de PrivateRoute
Elle est ici, j'espère que cela aide
Ensuite dans mon PrivateRoute
J'ai réussi à obtenir ce travail à l'aide de la
rest
paramètre d'accéder aux données demapStateToProps
:<Switch>
pour les routes pour le faire fonctionner.Bien, je pense que la réponse à cette question devrait vraiment être plus détaillées, de sorte que je suis ici, après 4 heures de creuser.
Lorsque vous enroulez votre composant avec connect(), Réagir Redux implémente shouldComponentUpdate (sCU si vous cherchez des réponses sur github questions) et de faire peu profonde comparaison sur les accessoires (il va en parcourant chaque clé dans les accessoires de l'objet et de vérifier si les valeurs sont identiques '==='). Ce que cela signifie dans la pratique, c'est que votre composant est considéré comme Pur. Il va maintenant changer seulement quand ses accessoires et ses changements, et seulement ensuite! C'est le message clé ici.
Deuxième message clé, de Réagir routeur fonctionne avec le contexte de passer à l'emplacement, match, et l'histoire des objets à partir d'un Routeur pour l'Itinéraire composant. Il n'a pas utiliser des accessoires.
Maintenant, nous allons voir dans la pratique ce qu'il se passe, parce que même en sachant que, je le trouve toujours assez délicat:
Il y a 3 clés pour votre accessoires après la connexion: chemin d'accès, d'un composant, et auth (donné par la connexion). Donc, en fait, votre enveloppé composant ne sera PAS ré-rendu à tous les changements de route car il n'a pas de soins. Lorsque les modifications d'itinéraire, vos accessoires ne changent pas et il ne sera pas mise à jour.
Il y a maintenant 4 clés pour votre accessoires après la connexion: chemin d'accès, le composant auth et anyprop. L'astuce ici est que anyprop est un objet qui est créé chaque fois que le composant est appelée. Donc à chaque fois que votre composant est appelé cette comparaison est faite: {a:1} === {a:1}, ce qui (vous pouvez essayer de) vous donne de faux, de sorte que votre composant maintenant les mises à jour à chaque fois. Notez toutefois que votre composant ne se soucient pas de la route, ses enfants.
Maintenant c'est le mystère ici, parce que je suppose que vous appelez cette ligne dans votre Application fichier, et il devrait y avoir aucune référence à la "auth" là-bas, et vous devriez avoir un message d'erreur (du moins c'est ce que je suis guetting). Ma conjecture est que "auth" dans votre Application fichier fait référence à un objet qui y sont définies.
Maintenant, que devons-nous faire ?
Je vois deux options ici:
Dire Réagir Redux que votre composant n'est pas pur, cela permettra d'éliminer l'unité d'injection et de votre composant va maintenant mettre à jour correctement.
connect(mapStateToProps, null, null, {
pure: faux
})(PrivateRoute)
Utilisation WithRouter(), qui permettra d'injecter de l'emplacement, la correspondance et l'histoire de l'objet à vos composants comme les accessoires. Maintenant, je ne connais pas le fonctionnement interne, mais je soupçonne Réagir routeur n'est pas muter ces objets de sorte que chaque fois que le changement d'itinéraire, ses accessoires et ses changements (sCU renvoie true (vrai) et ainsi votre composant correctement mises à jour. L'effet secondaire de ceci est que votre Réagissent arbre est maintenant polluée avec beaucoup de WithRouter et de la Route des trucs...
Référence à la github question: Traiter avec la mise à Jour de Blocage
Vous pouvez voir ici que withRouter est conçu comme un quickfix, mais pas une solution recommandée. utilisation pure:faux est pas mentionné donc je ne sais pas comment bon ce correctif pourrait être.
J'ai trouvé une 3ème solution, si c'est pas clair pour moi si c'est vraiment une meilleure solution que withRouter, avec des Composante de l'Ordre. Vous vous connectez à votre Supérieur-Composante de l'ordre de la Redux magasin, et maintenant votre route ne donne pas une merde au sujet de ce qu'il rend, le HOC traite avec elle.
dans votre App.js
Vous pourriez même faire un curry de fonction pour la raccourcir un peu:
De l'utiliser comme ça:
J'ai eu du mal avec cette question, et voici ma solution.
Au lieu de passer isAuthenticated pour chaque < PrivateRoute> composant, vous avez juste besoin de isAuthenticated de l'état dans < PrivateRoute> lui-même.
Selon réaction-la documentation du routeur vous pouvez juste envelopper de votre
connect
fonction avecwithRouter
:Cela a fonctionné pour moi et mon point de vue a commencé à être mis à jour avec des routes dans ce cas.
J'ai le même problème comme @Rein. Dans mon cas, PrivateRoute ressemble presque identiques à la version originale, mais seulement connecté pour Redux et utilisé à la place de fakeAuth dans l'exemple original.
D'utilisation et résultat:-
<PrivateRoute path="/member" component={MemberPage} />
<PrivateRoute path="/member" component={MemberPage} auth={auth} />
<PrivateRoute path="/member" component={MemberPage} anyprop={{a:1}} />