我正在构建一个具有登录功能的项目(待办应用程序),
在这个Home
组件中,我必须判断本地存储中是否没有设置令牌,然后导航到登录组件,
但是在导航之后,Home
组件仍然呈现,并且在该组件中我有一个API调用,因此由于在本地存储中找不到令牌,它抛出一个错误"Underated"
主页组件:发布的帖子:
import React, { useEffect } from "react";
import NotesContainer from "./NotesContainer";
import { useNavigate } from "react-router-dom";
import { toast } from "react-toastify";
function Home() {
const navigate = useNavigate();
useEffect(() => {
if (!localStorage.getItem("token")) {
navigate("/login");
// for toast
toast.error("Please login", {
position: "top-right",
autoClose: 5000,
hideProgressBar: false,
closeOnClick: true,
pauseOnHover: true,
draggable: true,
progress: undefined,
theme: "dark",
});
}
}, []);
return (
<>
<div className=" mt-4 px-2">
<h1 className="text-4xl text-center font-semiboldbold underline underline-offset-2">
Your Notes
</h1>
</div>
<div>
<NotesContainer />
</div>
</>
);
}
export default Home;
在NotesContainer
个组件中,我有API调用.
备注容器:
import React, { useContext, useEffect } from "react";
import Note from "./Note";
import NoteModal from "./NoteModal";
import NoteContext from "../context/notes/NoteContext";
function NotesContainer() {
const { notes, setAdding, setIsOpen, setCurrentNote, getNotes } =
useContext(NoteContext);
useEffect(() => {
getNotes();
}, []);
return (
<div className="px-3">
<NoteModal />
<div className="text-center mt-2 sm:text-end sm:mt-0npm st">
<button
onClick={() => {
setCurrentNote({ title: "", description: "" });
setAdding(true);
setIsOpen(true);
}}
className="bg-slate-700 rounded-lg text-white text-md p-2 hover:scale-105"
>
<span className="fas fa-plus "> </span>
Add New Note
</button>
</div>
<div className="mt-3 flex justify-evenly flex-wrap gap-3">
{notes.map((note) => (
<Note key={note._id} note={note} />
))}
</div>
</div>
);
}
export default NotesContainer;
在当前情况下,当我转到Home组件时,它将判断令牌,如果没有设置Token,则它将导航到Login
组件,但Home组件仍在呈现,且由于我的API调用生成并引发错误.
因此,我希望如果没有在本地存储中设置令牌,那么在呈现Home
组件之前导航到登录,这样我们就可以停止API调用.