我真的找不到更好的标题为我的问题,但这里是发生了什么.所以,我创建了一个自定义挂钩我的登录在react这样:useLogin.js
:
import React from "react";
import axios from "axios";
import Cookies from "js-cookie";
import { useNavigate } from "react-router";
import useGetUserImage from "hooks/useGetUserImage/useGetUserImage";
export const useLogin = () => {
const [userName, setUserName] = React.useState();
const [password, setPassword] = React.useState();
const [snack, setSnack] = React.useState(false);
const [zoom, setZoom] = React.useState(false);
const navigate = useNavigate();
const cookieFn = (data) => {
Cookies.set("user", JSON.stringify(data), {
path: "/",
expires: 3,
sameSite: "strict",
secure: window.top.location.protocol === "https:",
});
};
const { ImageFetchingHandler } = useGetUserImage();
const HandleLogin = (e) => {
e.preventDefault();
if (Boolean(userName) && Boolean(password))
axios
.post(`${process.env.REACT_APP_API_URL_API_LOGIN}`, {
softWareOrUser: false,
userName: userName,
password: password,
})
.then((r) => {
if (r.data.resCode === 1) {
ImageFetchingHandler(r.data);
cookieFn(r.data.Data);
setSnack(false);
} else {
setSnack(true);
}
})
.then(() => {
navigate({ pathname: "/main" });
})
.catch((e) => {
throw new Error(e.message);
});
else {
alert("fill empty fields");
}
};
return {
HandleLogin,
snack,
zoom,
setUserName,
setPassword,
setZoom,
setSnack,
};
};
正如您所看到的,在我的useLogin.js
中还有另一个钩子,名为useGetUserImage
。
我需要获得用户图像每当我登录并获得不记名令牌,但有2个问题。
首先,因为我将收到base64文本,所以会有延迟。
第二,我需要在登录后立即调用它。这会导致img
标记中的错误。因为src
在我获得base64之前是未定义的。
这是我的useGetUserImage
import axios from "axios";
import Cookies from "js-cookie";
const useGetUserImage = () => {
const ImageFetchingHandler = ({ token }) => {
axios({
method: "post",
url: `${process.env.REACT_APP_API_URL_API_FETCH_IMAGE}`,
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
"DotNet-Timeout": 30000,
},
data: JSON.stringify({
id: "4",
}),
}).then((d) => {
Cookies.set("userImage", JSON.stringify(d.data), {
path: "/",
expires: 3,
sameSite: "strict",
secure: window.top.location.protocol === "https:",
});
});
};
return { ImageFetchingHandler };
};
export default useGetUserImage;
有什么办法处理这个问题吗?
我试图添加这样的东西到我的mainpage.js
,但它没有工作。由于某种原因,它通过了我的条件,虽然当userImage
是未定义的
React.useEffect(() => {
if (
Cookies.get("user") === undefined ||
Cookies.get("userImage" === undefined)
) {
navigate({ pathname: "/Login" });
} else {
console.log(Cookies.get("userImage"));
setuserImage(JSON.parse(Cookies.get("user")));
}
}, [navigate]);
我的意思是userImage
仍然未定义,但它将转到else
块
1条答案
按热度按时间kiz8lqtg1#
我不认为cookie应该是图像的主要来源,它应该是一个状态。然后,不是将其写入cookie,而是将其写入状态。现在,当您收到图像时,应用程序的必要部分将被更新,如果将图像写入cookie,则无法真正实现这一点。通过这种方法,您可以编写一个
useEffect
,它尝试在启动时读取cookie并使用它初始化状态,还可以编写一个useEffect
,它在cookie每次更改时将其写入cookie。另外两个想法:
useEffect
中有一个放错位置的)
:Cookies.get("userImage" === undefined)
与Cookies.get("userImage") === undefined
的比较useGetUserImage
不是一个钩子,因为它没有使用任何其他钩子。它只是一个普通的函数,你可以像你所做的那样使用它,但是为了避免混淆,你可能应该叫它getUserImage
或类似的东西。