在您的情况下,当数据更新时,此事件没有事件侦听器。例如,您已经更新了数据,但没有反映在代码中。
首先定义状态变量,然后更新它
将use effect事件监听器添加到监听器并更新组件。
这是React组件的更新版本,具有适当的状态更新和useEffect挂钩,用于监听更改并在必要时更新组件:
import React, { useState, useEffect } from "react";
export default function Recommend() {
const [animeName, setAnimeName] = useState("");
const [anilistURL, setAnilistURL] = useState("");
const [errorMsg, setErrorMsg] = useState("");
const [loading, setLoading] = useState(false);
const [loadingReviews, setLoadingReviews] = useState(false);
const [reviewTitles, setReviewTitles] = useState([]);
useEffect(() => {
if (anilistURL) {
getReviews();
}
}, [anilistURL]);
const handleSubmit = async () => {
try {
setLoading(true);
setReviewTitles([]);
setAnilistURL("");
setErrorMsg("");
const response = await fetch("http://localhost:8000/get-anilist-url", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
anime_title: animeName,
}),
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || "Unable to get response");
}
const data = await response.json();
setAnilistURL(data.anilist_url || "No URL found");
} catch (error) {
setErrorMsg("An error occurred: " + error.message);
} finally {
setLoading(false);
}
};
const getReviews = async () => {
try {
setLoadingReviews(true);
setErrorMsg("");
const anilistReviewsURL = `${anilistURL}/reviews`;
const response = await fetch(
"http://localhost:3000/api/v1/scrape/get-review-titles",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ reviewsLink: anilistReviewsURL }),
}
);
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || "Unable to get response");
}
const data = await response.json();
setReviewTitles(data.reviewTitles || []);
} catch (error) {
setErrorMsg("An error occurred: " + error.message);
} finally {
setLoadingReviews(false);
}
};
return (
<div className="flex flex-col h-screen bg-slate-700">
<div className="flex-grow bg-slate-600 p-5 font-mono">
{loading && <div className="text-white">Loading...</div>}
{errorMsg && <div className="text-red-500">{errorMsg}</div>}
{anilistURL && (
<div className="text-yellow-100">
<p>Anilist URL:</p>
<a href={anilistURL} target="_blank" rel="noopener noreferrer">
{anilistURL}
</a>
</div>
)}
{loadingReviews && <div className="text-white">Loading...</div>}
{reviewTitles.length > 0 && (
reviewTitles.map((reviewTitle, index) => (
<div key={index} className="text-yellow-500 pt-3">
{reviewTitle}
</div>
))
)}
</div>
<div className="p-4 flex items-center justify-between bg-slate-800">
<h3 className="text-gray-500 text-3xl font-mono">
Enter anime to be analyzed
</h3>
<textarea
type="text"
className="bg-slate-700 font-mono text-white text-2xl p-3 border-none outline-none w-full rounded-full"
placeholder="Enter your prompt..."
value={animeName}
onChange={(e) => setAnimeName(e.target.value)}
/>
<button
className="bg-slate-700 font-mono text-white text-2xl p-4 rounded-full hover:bg-slate-600 transition duration-200 ml-5"
onClick={handleSubmit}
>
Analyze
</button>
</div>
</div>
);
}