2017-10-19 12 views
0

J'ai HOC pour la vérification est l'utilisateur connecté.requireAuth avec le routeur de réaction v4 et redux

import React from 'react'; 
import { Redirect } from 'react-router-dom'; 

export default function requireAuthComponent(store, Component, redirectTo = '/') { 
    return class RequireAuthComponent extends React.Component { 
    render() { 
     const state = store.getState(); 
     const auth = state.auth; 

     if (auth.logged) { 
     return <Component {...this.props} />; 
     } 

     return <Redirect to={redirectTo} />; 
    } 
    }; 
} 

Et itinéraire

import PrivatContainer from './container/PrivatContainer'; 
import requireAuth from '../../components/requireAuth'; 

export default store => ({ 
    path: '/privat', 
    exact: true, 
    component: requireAuth(store, PrivatContainer), 
}); 

PrivatComponent

import React from 'react'; 

export default ({ auth: { logged }, toggleLogin }) => (
    <div> 
    <h1>Privat Route</h1> 
    <h3>User is {logged.toString()}</h3> 
    <button onClick={() => toggleLogin()}>Logout</button> 
    </div> 
); 

Lorsque entrez d'abord sur la route fonctionne très bien, mais quand je change de magasin avec logged: false, je reste encore sur cette composante (route) parce que l'appel d'itinéraire une fois et ne pas mettre à jour sur la mise à jour du magasin, comment il fixer ou s'abonner RequireAuthComponent sur la mise à jour du magasin?

+0

j'ai expliqué en détail comment un [Auth HOC] (https://stackoverflow.com/questions/46379934/ reac-router-v4-authorized-routes-avec-hoc) peut être écrit. S'il vous plaît laissez-moi savoir si vous trouvez ma réponse utile. –

Répondre

0

Peut-être que ce n'est pas correctement, donc si vous avez une meilleure idée s'il vous plaît me dire :)

export default function requireAuthComponent(store, Component, redirectTo = '/') { 
    return class RequireAuthComponent extends React.Component { 
    state = { 
     listener: null, 
    } 

    componentWillMount() { 
     const listener = store.subscribe(() => { 
     this.forceUpdate(); 
     }); 

     this.setState({ listener }); 
    } 

    componentWillUnmount() { 
     const { listener } = this.state; 

     listener(); 
     this.setState({ listener: null }); 
    } 

    render() { 
     const state = store.getState(); 
     const auth = state.auth; 

     if (auth.logged) { 
     return <Component {...this.props} />; 
     } 

     return <Redirect to={redirectTo} />; 
    } 
    }; 
} 
+0

Vous pouvez connecter votre composant HOC à Redux avec la fonction 'connect'. De cette façon, vous n'avez pas besoin de vous abonner et de vous désabonner manuellement, et votre composant sera modifié en cas de changement d'état. Si vous avez toujours besoin d'un exemple, je peux le poster comme réponse. –