开发者问题收集

从状态中提取数据时无法读取 null 属性

2022-03-01
51

我尝试在标志为真时显示导航项,但问题是,当我尝试从中获取以下数据时,它返回了未定义的值,为此我创建了以下内容:

let navigate = useNavigate();

  const userSignin = useSelector((state: RootStateOrAny) => state.userSignin);
  const { userInfo } = userSignin;

  const checkAdmin = useCallback(() => {
    if (userInfo) {
      if (typeof userInfo.user === "undefined") {
        return null;
      } else {
        return userInfo.user.isAdmin;
      }
    } else {
      return null;
    }
  }, []);

useEffect(() => {
    checkAdmin();
    if (!userInfo.user.isAdmin) {
      navigate("/");
    }
  }, [checkAdmin]);

我执行了 checkAdmin 函数,因为在此之前我有 userInfo.user.isAdmin,它返回了未定义的值。

{checkAdmin() && (
            <NavbarItem
              component='li'
              onMouseEnter={() => setTopMenuIndex(4)}
              onMouseLeave={() => setTopMenuIndex(-1)}
            >
              <Box
                style={{ whiteSpace: "nowrap" }}
                component='a'
                {...{ href: "/createItem" }}
              >
                {topMenuIndex === 4 && <Tippy topMenuIndex={topMenuIndex} />}
                Admin Dashboard
              </Box>
            </NavbarItem>
          )}

现在我想确保如果您没有该标志,您将被重定向到主页,但使用 userInfo.user.isAdmin 现在返回 null。我如何重新编码此逻辑以使其更好,或者我如何至少使此 useEffect 正常工作。

1个回答

首先,您要在数组内的 useEffect 中传递 checkAdmin,但它是一个函数。据我所知,您只能传递状态或道具来刷新组件或重新渲染。

我不确定具体要求是什么,但据我所知。


let navigate = useNavigate();

const userSignin = useSelector((state: RootStateOrAny) => state.userSignin);
const { userInfo } = userSignin;

// Old Node Version
const checkAdmin = () => {
  if(userInfo) {
    if(userInfo.user) {
      return userInfo.user.isAdmin
    }
  };
  return false;
};

// New Node Version
const checkAdmin = () => {
  if(userInfo?.user?.isAdmin) {
    return userInfo.user.isAdmin
  };
  return false;
};

useEffect(() => {
    if (!checkAdmin()) {
      navigate("/");
    }
  }, [userInfo]);


Siddharth Sunchu
2022-03-01