Introduction
Dans ce laboratoire, nous allons apprendre à utiliser le hook usePersistedState dans React, qui nous permet de conserver une valeur d'état dans localStorage. Nous allons explorer comment initialiser et mettre à jour la valeur stockée, ainsi que comment gérer les modifications du nom de la clé. À la fin de ce laboratoire, vous serez capable d'utiliser ce hook dans vos applications React pour vous assurer que certaines données sont stockées et peuvent être récupérées même après un rafraîchissement de page.
React usePersistedState Hook
index.htmletscript.jsont déjà été fournis dans la machine virtuelle. En général, vous n'avez qu'à ajouter du code àscript.jsetstyle.css.
Ce hook renvoie une valeur d'état qui est conservée dans localStorage, ainsi qu'une fonction qui peut être utilisée pour la mettre à jour. Pour l'utiliser, suivez ces étapes :
- Utilisez le hook
useState()pour initialiser lavalueàdefaultValue. - Utilisez le hook
useRef()pour créer une réf qui contiendra lenamede la valeur dansWindow.localStorage. - Utilisez 3 instances du hook
useEffect()pour l'initialisation, le changement devalueet le changement denamerespectivement. - Lorsque le composant est monté pour la première fois, utilisez
Storage.getItem()pour mettre à jourvalues'il existe une valeur stockée, ouStorage.setItem()pour conserver la valeur actuelle. - Lorsque
valueest mise à jour, utilisezStorage.setItem()pour stocker la nouvelle valeur. - Lorsque
nameest mis à jour, utilisezStorage.setItem()pour créer la nouvelle clé, mettre à jour lanameRef, et utilisezStorage.removeItem()pour supprimer la clé précédente deWindow.localStorage. - Notez que le hook est destiné à être utilisé avec des valeurs primitives (c'est-à-dire pas des objets) et ne tient pas compte des changements apportés à
Window.localStoragepar d'autres codes. Ces deux problèmes peuvent être facilement gérés (par exemple, la sérialisation JSON et la gestion de l'événement'storage').
Voici le code :
const usePersistedState = (name, defaultValue) => {
const [value, setValue] = React.useState(defaultValue);
const nameRef = React.useRef(name);
React.useEffect(() => {
try {
const storedValue = localStorage.getItem(name);
if (storedValue !== null) {
setValue(storedValue);
} else {
localStorage.setItem(name, defaultValue);
}
} catch {
setValue(defaultValue);
}
}, []);
React.useEffect(() => {
try {
localStorage.setItem(nameRef.current, value);
} catch {}
}, [value]);
React.useEffect(() => {
const lastName = nameRef.current;
if (name !== lastName) {
try {
localStorage.setItem(name, value);
nameRef.current = name;
localStorage.removeItem(lastName);
} catch {}
}
}, [name]);
return [value, setValue];
};
const MyComponent = ({ name }) => {
const [value, setValue] = usePersistedState(name, 10);
const handleInputChange = (event) => {
setValue(event.target.value);
};
return <input value={value} />;
};
const MyApp = () => {
const [name, setName] = React.useState("my-value");
const handleInputChange = (event) => {
setName(event.target.value);
};
return (
<>
<MyComponent name={name} />
<input value={name} />
</>
);
};
ReactDOM.createRoot(document.getElementById("root")).render(<MyApp />);
Veuillez cliquer sur 'Go Live' dans le coin inférieur droit pour exécuter le service web sur le port 8080. Ensuite, vous pouvez rafraîchir l'onglet Web 8080 pour prévisualiser la page web.
Résumé
Félicitations ! Vous avez terminé le laboratoire sur le hook React usePersistedState. Vous pouvez pratiquer d'autres laboratoires dans LabEx pour améliorer vos compétences.