【问题标题】:React useEffect is not triggering on redirectReact useEffect 不会在重定向时触发
【发布时间】:2023-03-14 03:53:01
【问题描述】:

我有一个名为登录的功能,如果一切正常,它会将用户重定向到主页。然后,在主页上,我想使用用户登录时存储的令牌使用 useEffect 获取一些用户信息,但没有任何反应。只有当我刷新页面时,我才能得到数据。

登录功能

export const login = ({ email, password, history }) => {
  return async (dispatch) => {
    try {
      const response = await fetch("http://localhost:5000/api/login", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          email,
          password,
        }),
      });

      const data = await response.json();

      if (data.status === 200) {
        localStorage.setItem("userToken", data.user);
        history.push("/");
      } else {
        dispatch(
          setNotification({
            variant: "error",
            message: data.message,
          })
        );
      }
    } catch (e) {
      console.log(e.message);
    }
  };
};

获取用户函数

export const fetchUser = () => {
  return async (dispatch) => {
    try {
      const response = await fetch("http://localhost:5000/userInfo", {
        headers: {
          "x-access-token": localStorage.getItem("userToken"),
        },
      });

      const data = await response.json();
      dispatch(setUser({
        id: data.id,
        fullname: data.fullname,
        email: data.email
      }))
    } catch (error) {}
  };
};

在我的主页上使用效果

useEffect(() => {
     dispatch(fetchUser()); 
  }, []);

后端功能

module.exports.getCurrentUser = async (req, res) => {
  const token = req.headers["x-access-token"];
  try {
    const verifyToken = jwt.verify(token, "123");
    const user = await User.findOne({ email: verifyToken.email });
    return res.json({
      id: user._id,
      fullname: user.fullname,
      email: user.email
    })
  
  } catch (error) {}
};

【问题讨论】:

  • 您的isMounted 有什么意义?每次测试值之前都将其设置为 true
  • 我正在使用它来解决我遇到的错误。

标签: javascript reactjs react-redux


【解决方案1】:

useEffect 的第二个参数告诉它何时需要运行。它仅在数组中的值之一发生更改时运行。由于您传递了一个空数组,因此其中的任何值都没有改变。

这是假设您的应用程序可能从“/”开始,然后检测到没有用户因此切换到登录屏幕。当它返回到根时,只有在数组中的某些内容与之前的渲染相比发生了变化时,它才会执行useEffect

事实上,isMounted 没有多大意义。这可能只是:

useEffect(() => {
      dispatch(fetchUser());
  });

【讨论】:

  • 还没有工作:(
  • 您刚刚编辑了问题,最后仍然有[][] 参数是你的问题。
  • 即使我删除 [ ] 也不起作用
【解决方案2】:

您正在调用setUser,但是什么在调用您的登录函数?

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2021-09-10
  • 1970-01-01
  • 2021-04-09
  • 2022-01-11
  • 2023-01-26
相关资源
最近更新 更多