我正在努力使用useEffect,它在應用程序加載時不會觸發,但只需單擊按鈕即可。這里是我的代碼:
export default function Person() {
const [person, setPerson] = useState({});
const [hitRandomUser, setHitRandomUser] = useState(0);
const fetchData = setCallback(async () => {
const api = "http://localhost/api/person/random";
const response = await fetch(api);
const data = await response.json();
setPerson(data);
console.log(data);
}, []);
useEffect(() => {
fetchData();
}, [hitRandomUser]);
const pax = {
id: 1549,
name: "Mikel",
sexe: "boy",
pop: 1
};
const onLike = () => {
setHitRandomUser(hitRandomUser + 1);
console.log(hitRandomUser);
console.log("liked");
};
return (
{!person.id && <h1>Loading...</h1>}
<PersonCard person={person} onLike={onLike} />
);
}
因此,這段代碼實際上正在使我的應用程序崩潰。問題是useEffect從來不會在使person
為空dict時觸發,然后在試圖獲取person.id
時在PersonCard
崩潰。然而,如果我將pax
傳遞給PersonCard
,一切都會很好。當我從PersonCard
使用onLike
函數時,hitRandomUser
狀態會發生變化,在這種情況下,useEffect
會正確觸發,因為它是一個依賴項。如何在加載時使用useEffect觸發器,或setPerson
以便使用它進行渲染?
update
我看到的問題是,如果我使用pax
取消讀取person
來呈現我的組件,如下所示:
return (
<PersonCard person={pax} onLike={onLike} />
);
我可以看到useEffect
實際上被正確呈現,因為我可以看到帶有的console.log(data)
的結果被正確顯示。所以應該有什么東西會引發錯誤,但我看不出來。
在這種情況下,
useEffect
很可能由于初始渲染期間發生的錯誤而未運行。組件生命周期可以讓您了解什么在何時何地運行。我建議使用提前返回語句(在我們的討論中,您在JSX中使用了一個標準條件,它也可以工作,但我認為提前返回更適合這個用例)。
您可以這樣做:
就在呈現
PersonCard
的返回語句的正上方。這將停止執行并顯示加載消息,直到滿足前提條件,在這種情況下React將自動re-evaluate和re-render組件。