Sorunumu kolayca sormak için bu kodun sonucunu açıklayayım.
const ForExample = () => {
const [name, setName] = useState('');
const [username, setUsername] = useState('');
useEffect(() => {
console.log('effect');
console.log({
name,
username
});
return () => {
console.log('cleaned up');
console.log({
name,
username
});
};
}, [username]);
const handleName = e => {
const { value } = e.target;
setName(value);
};
const handleUsername = e => {
const { value } = e.target;
setUsername(value);
};
return (
<div>
<div>
<input value={name} onChange={handleName} />
<input value={username} onChange={handleUsername} />
</div>
<div>
<div>
<span>{name}</span>
</div>
<div>
<span>{username}</span>
</div>
</div>
</div>
);
};
Bağlandığında ForExample component
, 'etki' günlüğe kaydedilecektir. Bu componentDidMount()
.
Ve ad girişini her değiştirdiğimde, hem 'efekt' hem de 'temizlenmiş' günlüğe kaydedilecek. Bunun tersi, [username]
ikinci parametresine eklediğimden beri kullanıcı adı girişini değiştirdiğimde hiçbir mesaj günlüğe kaydedilmeyecek useEffect()
. Bu,componentDidUpdate()
Son olarak, kaldırıldığında ForExample component
, 'temizlendi' günlüğe kaydedilir. Bu componentWillUnmount()
.
Hepimiz bunu biliyoruz.
Özetlemek gerekirse, bileşen her yeniden oluşturulduğunda 'temizlendi' çağrılır (ayırma dahil)
Bu bileşenin yalnızca bağlantısı kesildiği an için 'temizlenmiş' olarak günlüğe kaydedilmesini istersem, ikinci parametresini olarak değiştirmem useEffect()
gerekir []
.
Ama ben değişim [username]
için []
, ForExample component
artık aletlerin componentDidUpdate()
isim girişi için.
Yapmak istediğim şey, bileşenin hem componentDidUpdate()
isim girişi hem de componentWillUnmount()
. (yalnızca bileşenin kaldırıldığı an için günlük 'temizlendi')
username
ikinci bağımsız değişken olarak, içinde, ve ikinci bağımsız değişken olarak boş bir dizi verilir bir.