首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >redux状态在导航或浏览器后退按钮后恢复到以前的状态

redux状态在导航或浏览器后退按钮后恢复到以前的状态
EN

Stack Overflow用户
提问于 2020-09-24 18:27:05
回答 1查看 590关注 0票数 0

我有一个用react和redux构建的简单的“类似post”的应用程序。当用户登录时,他应该看到一个导航栏,当他没有登录时,他应该看到另一个导航栏。

我使用redux-devtools来跟踪状态变化。

问题是,当我登录时,我设置了一个本地存储令牌,当我注销时,我将该令牌设置为null。这种方法工作得很好,当我单击注销时,我在redux devtools中看到token为nulluser_authenticated为false,但是当我返回主页,或者单击浏览器的back按钮时,它将恢复到login状态,然后我可以看到token的值和is_authenticated被设置为true。

当我刷新页面时,我得到了我想要的行为,即用户注销,标记设置为null,is_authenticated设置为false。

奇怪的是,如果我执行console.log(store.getState()),我会在那里得到更新/预期的状态,但是devtools显示了之前的状态,页面的行为甚至像以前的状态一样。

登录的情况也是如此,在导航中来回切换会得到我第一次访问该页面时的旧状态。

状态从我的redux-devtools,在返回主页后,注销后。

代码语言:javascript
复制
user: {
    is_authenticated: true,
    token: 'c80c632a6529b79d51fd3e2fc915cfb94834aa5237b4e65924c095ea58f289b3',
    is_loading: false
  },

从注销状态移回后,来自同一页面上store.getState()的状态

代码语言:javascript
复制
user:
is_authenticated: false
is_loading: false
token: "null"

下面列出了我的一些组件:

routes.js

代码语言:javascript
复制
import { Switch, Route } from 'react-router-dom';
import React, {Component} from 'react';
import Homepage from './components/homepage';
import Scammer from './components/scammer';
import ScammerCreate from './components/scammer_create'
import Navbar from './components/navbar'
import Register from './components/register'
import Login from './components/login'
import Logout from './components/logout'
import {store} from './index'




class Routes extends Component {

    componentWillMount() {
        store.dispatch({
            type: 'get_user',
        })
        store.getState()
    }
    

        render(){
            return(
                <div>
    
                
                <Navbar />
                <Switch>
                    <Route path="/" exact component={Homepage}/>
                    <Route path="/scammer/create" exact component={ScammerCreate}></Route>
                    <Route path="/scammer/:id" exact component={Scammer}/>
                    <Route path="/auth/register" exact component={Register}></Route>
                    <Route path="/auth/login" exact component={Login}></Route>
                    <Route path="/auth/logout" exact component={Logout}></Route>
                    
                </Switch>
                </div>
            )
        }
}

export default Routes;

Index.js

代码语言:javascript
复制
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';

import { Provider } from 'react-redux';
import { createStore, applyMiddleware, compose } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import promiseMiddleware from 'redux-promise';
import thunkMiddleware from 'redux-thunk'
import Routes from './routes'

import rootReducer from './reducers/index';

//const createStoreWithMiddleware = applyMiddleware(promiseMiddleware)(createStore)
const middleware = [promiseMiddleware,thunkMiddleware]
export const store = createStore(
    rootReducer,
    composeWithDevTools(applyMiddleware(...middleware))
)


ReactDOM.render(
    <Provider store={store}> 
        <BrowserRouter>
            <Routes/>
        </BrowserRouter>
    </Provider>
, document.getElementById('root'));

user_reducer

代码语言:javascript
复制
let initialState = {

}
if (localStorage.getItem('token') != null && localStorage.getItem('token') != 'null'){
    initialState['is_authenticated'] = true;
    initialState['token'] = localStorage.getItem('token');
    initialState['is_loading'] = false;
}

else{
    initialState ={
        'is_authenticated' : false,
        'token' : localStorage.getItem('token'),
        'is_loading' : false,
    }
    
}

export default function user(state=initialState,action){

    if (action.type == "registered") {
        localStorage.setItem('token',action.payload.token);
        return {...state, 'user_details': action.payload.user,'token':localStorage.getItem('token'),'is_authenticated':true,'is_loading':false}

    }

    else if ( action.type == "login" ){
        
        console.log(action.payload)
        localStorage.setItem('token',action.payload.token)
        return {
            ...state,'is_authenticated' : true, 'token' : localStorage.getItem('token'),'is_loading' : false,
            'user_details' : action.payload.user,
        }
    }

    else if( action.type == "logout" ){
        localStorage.setItem("token",null);
        return {
            ...state,'is_authenticated' : false, 'token' : localStorage.getItem('token'), 'is_loading' : false
        }
    }

    else if(action.type == 'get_user'){
       const token = localStorage.getItem('token');
       console.log(token)
       if (token != null && token != 'null'){
           return {
               ...state,'is_authenticated' : true, token : token, is_loading : false,
           }

        }
        else {
            return {
                ...state, is_authenticated : false, token: token, is_loading : false,
            }
    
    }
    }

    else{
        return initialState;
    }


}
EN

回答 1

Stack Overflow用户

发布于 2020-09-24 22:23:13

好了,经过几天的调试,从头到尾看了一遍redux教程,仍然失败。

我终于意识到我是在为默认操作返回initialState。因此,当加载新组件时,它将获得initialState而不是更新的状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64044495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档