Tengo este componente NotificationToast que gestiona las notificaciones.
Necesito que siempre se represente cuando el usuario esté autenticado .
Así que esto es lo que hice:
class App extends Component { render() { const state = store.getState(); const { isAuthenticated } = state.auth; return ( <Provider store={store}> <BrowserRouter basename="/"> <Switch> <PublicRoute path="/register-page" component={RegisterPage} /> <PrivateRoute path="/profile-page" component={ProfilePage} /> <Redirect to="/home" /> </Switch> {isAuthenticated && ( <div> <NotificationToast /> </div> )} </BrowserRouter> </Provider> ); } } export default App;El problema es que esto no funciona en el siguiente escenario :
state.auth.isAuthenticated es falsestate.auth.isAuthenticated se establece en true .App no detecta este cambio y, por lo tanto, no se vuelve a procesar.NotificationToast no se procesa. Esto funciona cuando el usuario actualiza la página después de iniciar sesión, porque state.auth.isAuthenticated es true desde el principio.
Esto se debe a este código:
if (localStorage.jwtToken) { // Set auth token header auth setAuthToken(localStorage.jwtToken); // Decode token and get user info and expiration const decoded = jwt_decode(localStorage.jwtToken); // Set User and is Authenticated store.dispatch(setCurrentUser(decoded)); // Now if you reload a page, if the user has already logged-in you will still have his info in he state store.dispatch(clearCurrentProfile()); // Check for expired token const currentTime = Date.now() / 1000; if (decoded.exp < currentTime) { store.dispatch(logoutUser()); store.dispatch(clearCurrentProfile()); // Redirect to login window.location.href = "/login"; } } Comprueba si el usuario ya inició sesión y, si lo hizo, establece state.auth.isAuthenticated en true .
¿Alguna sugerencia?
useStore se utiliza para recuperar la tienda. Pero dicho acceso a la tienda solo se puede usar para la manipulación de la tienda, como el reemplazo del reductor. Cuando se cambia la tienda, el componente que accede a la tienda de esta manera no se actualiza.
Utilice "useSelector"
const isAuthenticated = useSelector(state => state.auth)