[英]unmount being invoked when dependency is updated in useEffect
我已經從useEffect
掛鈎中的消息服務訂閱了一些更新。 通過 react hooks 文檔和資源,我無法用我的代碼找到一些觀察結果的答案。 這是我的代碼片段:
import React, { useState, useEffect } from "react";
import { messageService } from "../_services";
function App() {
const [count, setCount] = useState(0);
useEffect(() => {
const subscription = messageService.onMessage().subscribe(message => {
setCount(count + 1);
});
return () => {
console.log("unmount");
subscription.unsubscribe();
};
}, [count]);
function sendMessage() {
messageService.sendMessage("message");
}
return (
<div className="jumbotron">
<button onClick={sendMessage} className="btn btn-primary mr-2">
Send Message
</button>
{count}
</div>
);
}
export { App };
現在我無法理解兩種行為:
useEffect
鈎子已count
為依賴項,因此我應該遇到無限循環問題,但我觀察到調用了unmount
。 React 是否會在預期無限循環時卸載App
組件? 如果這樣做的話,我在任何地方都找不到提到的這個unmount
,仍保留count
的值。 這怎么可能我知道解決它的一種方法是,只要有計數更新,我就需要使用useRef
來保留count
並將其從鈎子的依賴項中刪除,同時強制更新。
我正在尋找的是對上述兩個問題的答案,以及是否有更好的方法提前謝謝。
清理效果不僅在組件卸載之前進行清理, 而且如果一個組件多次渲染(就像他們通常做的那樣),前一個效果在執行下一個效果之前被清理。
此外,在您的情況下, count
不應該在useEffect
中,因為您可以使用功能更新。
useEffect(() => {
const subscription = messageService.onMessage().subscribe((message) => {
setCount((p) => p + 1);
});
return () => {
subscription.unsubscribe();
};
}, []);
即使調用了卸載,也會保留 count 的值。 這怎么可能?
那是由於 關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.