J'obtiens cette erreur :
warning.js:33 Avertissement : Impossible d'appeler setState (ou forceUpdate) sur un composant non monté. composant non monté. Ce n'est pas une option, mais cela indique une fuite de mémoire dans votre application. Pour le corriger, annulez tous les abonnements et les tâches asynchrones asynchrones dans la méthode componentWillUnmount.
Mais je n'utilise pas de méthode componentWillUnMount.
J'utilise un HOC pour m'assurer que l'utilisateur est authentifié avant d'accéder à sa route /compte.
Voici l'itinéraire :
<StyleRoute props={this.props} path="/account" component=
{RequireAuth(Account)} />
où RequireAuth est le HOC. Voici le HOC :
import { withRouter } from 'react-router';
export default function RequireAuth(Component) {
return class AuthenticatedComponent extends React.Component {
componentWillMount() {
this.checkAuth();
}
checkAuth() {
if ( ! this.props.isAuthenticated) {
this.props.history.push(`/`);
}
}
render() {
return this.props.isAuthenticated
? <Component { ...this.props } />
: null;
}
}
return withRouter(AuthenticatedComponent);
}
Le code fonctionne comme prévu, mais j'obtiens cette erreur lorsque /account est rendu. Comme vous pouvez le constater, il n'y a pas de méthode componentWillUnMount dans mon code direct. Je ne comprends vraiment pas pourquoi cet avertissement continue de s'afficher et toute information serait utile.
Mise à jour 5/23/18 :
Pour se débarrasser de l'erreur et avoir toujours des accessoires en bas, j'ai fait deux choses :
1) J'ai choisi d'avoir deux fonctions d'ordre supérieur dans le composant App parent au lieu d'utiliser le HOC. L'une des fonctions d'ordre supérieur sert à passer les props et l'autre à vérifier l'authentification. J'avais des difficultés à passer des props autres que l'historique du navigateur, d'où la fonction renderProps ci-dessous.
renderProps = (Component, props) => {
return (
<Component {...props} />
);
}
checkAuth = (Component, props) => {
if (props.isAuthenticated) {
return <Component {...props} />
}
if (!props.isAuthenticated) {
return <Redirect to='/' />
}
}
2) Pour les utiliser, j'ai dû utiliser le rendu dans ma route, par opposition au composant.
//I could pass props doing this, sending them through the above functions
<Route exact path="/sitter-dashboard" render={ () => this.checkAuth(SitterDashboard, this.props) } />
<Route exact path={"/account/user"} render={() => this.renderProps(User, this.props)} />
//I couldn't pass props doing this
<Route {...this.props} exact path="/messages" component={Messages} />
Voici la documentation sur le routeur et le composant comme méthode de rendu de la route : https://reacttraining.com/react-router/web/api/Route/route-render-methods
Voici également une bonne explication sur Stack Overflow
Enfin, j'ai utilisé ce code de la documentation de React Router 4 comme modèle pour ce que j'ai fait ci-dessus. Je suis sûr que le code ci-dessous est plus propre, mais je suis encore en train d'apprendre et ce que j'ai fait a un peu plus de sens pour moi.
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={props =>
fakeAuth.isAuthenticated ? (
<Component {...props} />
) : (
<Redirect
to={{
pathname: "/login",
state: { from: props.location }
}}
/>
)
}
/>
);
1 votes
Pouvez-vous essayer la même chose en remplaçant ComponentWillMount par ComponentDidMount ?
0 votes
Je l'ai fait, mais une erreur s'est produite, car il faut savoir s'ils sont authentifiés avant que le composant ne soit rendu.
0 votes
Ok, dans ce cas vous pouvez enlever le history.push de là et mettre un drapeau pour montrer que c'est non authentifié et retourner <Redirect path="/"> dans render() dans les cas non authentifiés. Le histoty.push va essayer de démonter des composants qui ne sont pas montés, d'où l'erreur.
0 votes
Merci pour votre aide. J'ai fini par utiliser render au lieu de component, comme indiqué dans la documentation de React Router 4, et l'erreur a disparu.
0 votes
Que voulez-vous dire par là ? Pourriez-vous écrire un court exemple de votre code ? Je ne trouve aucun point de la doc qui parle de ça.
0 votes
Pibo, c'est fait. Je ne sais toujours pas pourquoi j'ai eu l'erreur initiale, mais elle semble être résolue maintenant.
0 votes
Bonjour @CameronTharp Je crois que je fais exactement la même chose que vous, et je reçois le même avertissement. Voici mon point de vue sur les routes : gist.github.com/ahlusar1989/d46edb1f73987838b358e05649624639 . J'aimerais savoir si ce modèle est similaire à votre implémentation originale. Je me demande en particulier pourquoi vous avez besoin de rendre les composants props dans la route ? Est-ce spécifique à React Router V4 ?