javascript - React setState-funksjon
Hva er forskjellen mellom disse to funksjonene for oppdatering av tilstand, og hva er den anbefalte tilnærmingen? Begge funksjonene fungerer bra i applikasjonen min.
Alternativ 1
const [profile, setProfile] = useState<{name: string, age: number}>({
name: 'John Doe',
age: 28,
});
setProfile((prevState) => {
return {
...prevState,
age: profile.age + 100,
}
});
Alternativ 2
const [profile, setProfile] = useState<{name: string, age: number}>({
name: 'John Doe',
age: 28,
});
setProfile({
...profile,
age: profile.age + 100,
});
Svar #1
Normalt, hver gang du ønsker å oppdatere tilstanden din basert på din forrige tilstand, bør du bruke den funksjonelle måten å oppdatere tilstanden på. Det sørger for at den nåværende tilstanden du sender inn, er den 'siste versjonen'.
Når du vil sette en tilstand basert på en annen verdi, uten å avhenge av tidligere tilstand, kan du sette tilstanden direkte uten å bruke den funksjonelle oppdateringen.
Det er ganske godt forklart med eksempler i dokumentasjonen:
https://reactjs.org/docs/hooks-reference.html#usestate
dokumentasjonen inkluderer dette flotte eksempelet:
function Counter({initialCount}) {
const [count, setCount] = useState(initialCount);
return (
<>
Count: {count}
<button onClick={() => setCount(initialCount)}>Reset</button>
<button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
<button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
</>
);
}
Merk at i motsetning til setState i en klassekomponent, slår ikke useState sammen oppdateringer. Også fra dokumentasjonen:
I motsetning til setState-metoden som finnes i klassekomponenter, slår ikke useState automatisk sammen oppdateringsobjekter. Du kan replikere denne oppførselen ved å kombinere funksjonsoppdateringsformen med objekt spredningssyntaks:
const [state, setState] = useState({});
setState(prevState => {
// Object.assign would also work
return {...prevState, ...updatedValues};
});
Alternativ 2 vil fungere i de fleste tilfeller fordi du sjelden har en tilstandsendring som vises før en annen tilstandsendring, men det kan skje i mer komplekse tilfeller eller ved bruk av useEffect- eller setTimeout-funksjoner, og i dette tilfellet er funksjonell oppdatering obligatorisk.
Svar #2
De er i bunn og grunn de samme, men den andre tilnærmingen brukes når du ikke kan være sikker på at du har den oppdaterte verdien av tilstanden din tilgjengelig. For eksempel i en setTimeout- eller useEffect-callback
