【问题标题】:react redux split reducer change prev statereact redux split reducer 更改 prev 状态
【发布时间】:2016-01-30 10:55:38
【问题描述】:

看图是什么意思

我正在做一个项目,我从react-redux-starter-kit 开始 它是使用 react react-router react-router-redux redux ...

有些页面需要用户登录, 所以在 route.js 1.如果没有登录,我检查用户,导航到登录页面, 如果用户登录成功将用户信息保存到存储
2.如果用户登录但刷新页面,商店丢失了用户信息,所以我发送一个动作来重新加载用户信息

一切正常

但是当用户进入仪表板之类的页面时 触发另一个操作,存储中的用户信息将丢失

我不知道为什么

路由器

export default function (store) {
 const requireAuth = (nextState, replace, cb) => {
    function checkAuth () {
      const user = store.getState().user
      if (!user.user_id) {
        replace(__DEV__ ? SiteUrl + 'login' : '/login')
      }
      cb()
    }
    if (!isAuthLoaded(store.getState())) {
      store.dispatch(loadAuth()).then(checkAuth)
    } else {
      checkAuth()
    }
  }
  return (
      <Route path='/'} >
         <IndexRoute component={HomeView} />
        <Route path='setitems' component={SetItemsView} onEnter={requireAuth}/>
        <Route path='404' component={NotFoundView} />
        <Redirect from='*' to='404' />
      </Route>
    )
}

auth.js

function requestLogin () {
  return {
    type: LOGIN_REQUEST
  }
}
function loginSuccess (user) {
  return {
    type: LOGIN_SUCCESS,
    user
  }
}

function loginError () {
  return {
    type: LOGIN_FAILURE
  }
}

export function isLoaded (globalState) {
  return globalState.user && globalState.user.user_id
}

export function getUserLoad () {
  return function (dispatch) {
    dispatch(requestLogin())
    return getUserAction()
      .then(function (response) {
        var data = response.data
        if (data.msg) {
          dispatch(loginError())
          return {}
        }
        return data.res
      })
      .then(function (user) {
        dispatch(loginSuccess(user))
      })
  }
}

function getUserAction () {
  return axios.get(GetUser)
}

userReducer.js
function user (state = {}, action) {
  switch (action.type) {
    case 'LOGIN_SUCCESS' :
      return action.user
    case 'LOGIN_REQUEST':
      console.log('LOGIN_REQUEST')
      return state
    case 'LOGIN_FAILURE':
      console.log('LOGIN_FAILURE')
      return state
    default:
      return {}
  }
}

export default user

   dashboard page load items list
function requestItems (setitems) {
  return {
    type: ITEMS_REQUEST,
    items: setitems.items
  }
}
function itemsSuccess (items) {
  return {
    type: ITEMS_SUCCESS,
    items
  }
}
function itemsFailure () {
  return {
    type: ITEMS_FAILURE
  }
}

export function loadItemsAction (page) {
  return function (dispatch, getState) {
    dispatch(requestItems(getState().setitems))
    return axios.get(GetItemsUrl, page)
      .then(function (response) {
        var data = response.data
        return data
      })
      .then(function (data) {
        if (data.msg) {
          dispatch(itemsFailure())
        } else {
          dispatch(itemsSuccess(data.res.items))
        }
      })
  }
}

【问题讨论】:

    标签: reactjs react-router redux


    【解决方案1】:

    问题是减速器:

    function user (state = {}, action) {
      switch (action.type) {
        case 'LOGIN_SUCCESS' :
          return action.user
        case 'LOGIN_REQUEST':
          console.log('LOGIN_REQUEST')
          return state
        case 'LOGIN_FAILURE':
          console.log('LOGIN_FAILURE')
          return state
        default:
          return {} // <-- should be return state
      }
    }
    

    在任何 reducer 中,默认返回必须始终return state

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 2019-07-28
      • 2018-08-09
      • 2017-08-08
      • 2019-07-18
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多