Lassen Sie mich das Ergebnis dieses Codes erklären, damit ich mein Problem leicht stellen kann.
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>
);
};
Wenn die ForExample component
Reittiere aktiviert sind, wird der Effekt protokolliert. Dies hängt mit dem zusammen componentDidMount()
.
Und wenn ich die Namenseingabe ändere, werden sowohl "Effekt" als auch "Bereinigt" protokolliert. Umgekehrt wird keine Nachricht protokolliert, wenn ich die Eingabe des Benutzernamens ändere, seit ich [username]
den zweiten Parameter von hinzugefügt habe useEffect()
. Dies hängt mit dem zusammencomponentDidUpdate()
Zuletzt wird beim ForExample component
Aufheben der Bereitstellung "bereinigt" protokolliert. Dies hängt mit dem zusammen componentWillUnmount()
.
Wir alle wissen das.
Zusammenfassend wird "bereinigt" immer dann aufgerufen, wenn die Komponente neu gerendert wird (einschließlich Unmount).
Wenn ich möchte, dass diese Komponente nur für den Moment "bereinigt" protokolliert wird, in dem sie nicht gemountet ist, muss ich nur den zweiten Parameter von useEffect()
in ändern []
.
Wenn ich jedoch zu wechsle [username]
, []
wird ForExample component
die componentDidUpdate()
Eingabe für den Namen nicht mehr implementiert .
Was ich tun möchte, ist, dass die Komponente sowohl componentDidUpdate()
nur für die Namenseingabe als auch unterstützt componentWillUnmount()
. (Protokollierung 'bereinigt' nur für den Moment, in dem die Komponente abgemeldet wird)
username
zweiten Argument enthält, und eine, die ein leeres Array als zweites Argument erhält.