在其他axios函数中使用axios

mbskvtky  于 2022-11-23  发布在  iOS
关注(0)|答案(1)|浏览(244)

我真的找不到更好的标题为我的问题,但这里是发生了什么.所以,我创建了一个自定义挂钩我的登录在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

kiz8lqtg

kiz8lqtg1#

我不认为cookie应该是图像的主要来源,它应该是一个状态。然后,不是将其写入cookie,而是将其写入状态。现在,当您收到图像时,应用程序的必要部分将被更新,如果将图像写入cookie,则无法真正实现这一点。通过这种方法,您可以编写一个useEffect,它尝试在启动时读取cookie并使用它初始化状态,还可以编写一个useEffect,它在cookie每次更改时将其写入cookie。
另外两个想法:

  • useEffect中有一个放错位置的)Cookies.get("userImage" === undefined)Cookies.get("userImage") === undefined的比较
  • useGetUserImage不是一个钩子,因为它没有使用任何其他钩子。它只是一个普通的函数,你可以像你所做的那样使用它,但是为了避免混淆,你可能应该叫它getUserImage或类似的东西。

相关问题