我有一个authState(是一个布尔值),它告诉你用户是否登录了.我有一个主布局,我与我的所有组件共享.它在使用效果中有这样的逻辑

  const isLogged = useSelector(selectAuthState);
  const router = useRouter();

  useEffect(() => {
    if (isLogged) {
      router.push('/')
    }else{
      router.push('/login')
    }
  }, [isLogged])

问题是seltAuthState的缺省值是FALSE,所以第一个呈现它的值是FALSE(即使在本地存储中AuthState的实际值是真的),在第二个呈现中是真实的值(它是真的),所以我的应用程序GET总是重定向到‘/’路径,因为AuthState的缺省值是FALSE.我如何才能判断Reduxstore 是否‘准备好’或任何我需要的东西,以确保我具有实际的Redux状态?

推荐答案

Redux在创建store 、传递给Reaction-Redux Provider组件以及应用程序被挂载和呈现时就准备好了.真的没有什么需要判断的.

问题是您使用的初始isLogged状态与未经身份验证的用户匹配.通常情况下,被验证不是简单的二进制函数,而实际上是一个三元函数,例如已验证、未验证和未知.如果您无法将状态初始化为"已确认"状态,则应从未知状态开始.

const initialState = {
  isLogged: null, // <-- initially unknown
};

const authSlice = createSlice({
  name: "auth",
  initialState,
  reducers: { ... }
});

...
const RouteGuard = () => {
  const isLogged = useSelector(selectAuthState);
  const router = useRouter();

  useEffect(() => {
    // Redirect to login page only if confirmed unauthenticated
    if (isLogged === false) {
      router.replace('/login');
    }
  }, [isLogged]);

  ...

  // Authenticated not confirmed yet
  if (isLogged === null) {
    return null; // or loading indicator/spinner/etc
  }

  // Confirmed authentication
  return isLogged
    ? /* logged in UI */
    : null;
};

您提到过您在本地存储中有一些身份验证状态.您也许能够从本地存储中初始化状态.如果没有存储任何内容,则返回null,因此您仍然需要上面的组件逻辑来处理UI.

示例:

const initialState = {
  isLogged: JSON.parse(localStorage.getItem("authState")), // whatever was persisted, or null
};

const authSlice = createSlice({
  name: "auth",
  initialState,
  reducers: { ... }
});

...

Reactjs相关问答推荐

无法覆盖MUI工具栏上的左右填充,除非使用!重要

使用筛选器的Primereact DataTable服务器端分页?

有没有一种惯用的方式来接受特定的子元素?

React Context未正确更新

我无法通过 useContext 显示值

Mui / Material UI 5:如何从 StaticTimePicker 中删除打开下一个视图/打开上一个视图按钮?

是的验证:使用 useFieldArray 访问表单值

显示我是否加入聊天应用程序时出现问题

React Native 背景动画反转

单击按钮时如何添加或删除 3d 对象

当我在 React Router Dom 中使用两个参数并直接在页面上导航时,数据获取没有发生

将水平滚动视图添加到底部导航选项卡

React 测试库包装器组件

当 React 中的状态发生变化时如何停止重新加载谷歌 map ?

如何在react 中正确销毁上下文?

在复选框中react 检索选中的值

未捕获的类型错误:useSelector 不是函数

如何解决在 react.js 中找不到模块错误

在react 钩子中将数组添加到数组状态给出一个数字

bootstrap 导航栏切换器在 reactjs 中不起作用