Hãy để tôi giải thích kết quả của mã này để hỏi vấn đề của tôi một cách dễ dàng.
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>
);
};
Khi thú ForExample component
cưỡi, 'hiệu ứng' sẽ được ghi lại. Điều này có liên quan đến componentDidMount()
.
Và bất cứ khi nào tôi thay đổi đầu vào tên, cả 'hiệu ứng' và 'dọn dẹp' sẽ được ghi lại. Ngược lại, sẽ không có thông báo nào được ghi lại bất cứ khi nào tôi thay đổi đầu vào tên người dùng vì tôi đã thêm vào [username]
tham số thứ hai của useEffect()
. Điều này liên quan đếncomponentDidUpdate()
Cuối cùng, khi các ForExample component
lần ngắt kết nối, 'đã dọn dẹp' sẽ được ghi lại. Điều này có liên quan đến componentWillUnmount()
.
Tất cả chúng ta đều biết điều đó.
Tóm lại, 'đã dọn dẹp' được gọi bất cứ khi nào thành phần được hiển thị lại (bao gồm cả việc ngắt kết nối)
Nếu tôi muốn làm cho thành phần này chỉ ghi nhật ký 'đã dọn dẹp' tại thời điểm nó được ngắt kết nối, tôi chỉ cần thay đổi tham số thứ hai của useEffect()
thành []
.
Nhưng Nếu tôi thay đổi [username]
thành []
, ForExample component
không còn triển khai componentDidUpdate()
đầu vào tên nữa.
Điều tôi muốn làm là làm cho thành phần chỉ hỗ trợ componentDidUpdate()
cho việc nhập tên và componentWillUnmount()
. (chỉ ghi nhật ký 'đã dọn dẹp' tại thời điểm thành phần đang được ngắt kết nối)
username
nó là đối số thứ hai và một cái được cung cấp một mảng trống làm đối số thứ hai.