我如何在用户获取时保护某些路由

How do i protect certain routes while user is fetching

当我的应用程序安装时,我尝试通过存储在本地存储中的令牌来获取用户。如果令牌有效,则我将用户设置为对商店的响应。我想让用户看到 /profile 页面,只有当用户在商店时。但我似乎对如何实施它一无所知。如果商店中没有用户并且他们在一些 'protected' 页面上,例如 /profile 我想将他们重定向到登录。但问题是,一开始商店里没有用户,所以我不能只检查它,然后在用户重新加载页面时有条件地重定向(或不重定向)到其他页面。

App.js:

useEffect(()=> {
    dispatch(preserveUser())
  }, [dispatch])

User.sagas.js:

export function* handleUserPreserve() {
  try {
    yield put(resetState());
    yield put(setUserLoading(true));
    const user = yield call(
      getItems,
     `query {
      getUserByToken {
        purchasedProducts
        orders
        token
        _id
        email
        firstName
      }
    }`
      )
    yield put(setUser(user.data.getUserByToken));
    yield put(setUserLoading(false));
  } catch (error) {
    yield put(setUserError(error.message.replace('GraphQL error: ', '')));
    yield put(setUserLoading(false));
  }
}
export default function* userSaga() {
  yield takeEvery(PRESERVE_USER, handleUserPreserve);
}

初始状态:

export const initialState = {
  userData: null,
};

您应该在状态中添加另一个字段,例如 isUserLoaded: false。 一旦收到来自 api 的回复,请将其标记为 true。然后在重定向条件中同时使用 userisUserLoaded
如果您将 HOC 用于受保护的路由,那么您可以将条件修改为如下所示以使其适用于您的情况。

function ProtectedRoute ({component: Component, authed, ...rest}) {
return (
  <Route
    {...rest}
    render={(props) => isUserLoaded === true && !user
      ? <Redirect to="/login" />
      : <Component {...props} /> }
   />
 )
}

您可以根据需要对其进行优化,但您肯定需要另一个变量来指示 api 已返回响应,然后您可以检查该用户是否在商店中。