Introdução
Neste laboratório, aprenderemos sobre o hook usePersistedState em React, que nos permite persistir um valor com estado no localStorage. Exploraremos como inicializar e atualizar o valor armazenado, bem como como lidar com as alterações no nome da chave. Ao final deste laboratório, você será capaz de usar este hook em suas aplicações React para garantir que certos dados sejam armazenados e possam ser recuperados mesmo após uma atualização da página.
Hook React usePersistedState
index.htmlescript.jsjá foram fornecidos na VM. Em geral, você só precisa adicionar código ascript.jsestyle.css.
Este hook retorna um valor com estado que é persistido no localStorage, juntamente com uma função que pode ser usada para atualizá-lo. Para usá-lo, siga estes passos:
- Use o hook
useState()para inicializar ovalueparadefaultValue. - Use o hook
useRef()para criar uma ref que irá conter onamedo valor emWindow.localStorage. - Use 3 instâncias do hook
useEffect()para inicialização, mudança devaluee mudança dename, respectivamente. - Quando o componente é montado pela primeira vez, use
Storage.getItem()para atualizar ovaluese houver um valor armazenado, ouStorage.setItem()para persistir o valor atual. - Quando o
valueé atualizado, useStorage.setItem()para armazenar o novo valor. - Quando o
nameé atualizado, useStorage.setItem()para criar a nova chave, atualizar onameRefe useStorage.removeItem()para remover a chave anterior deWindow.localStorage. - Observe que o hook é destinado ao uso com valores primitivos (ou seja, não objetos) e não leva em conta as alterações no
Window.localStoragedevido a outro código. Ambos esses problemas podem ser facilmente resolvidos (por exemplo, serialização JSON e tratamento do evento'storage').
Aqui está o código:
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 />);
Por favor, clique em 'Go Live' no canto inferior direito para executar o serviço web na porta 8080. Em seguida, você pode atualizar a aba Web 8080 para visualizar a página web.
Resumo
Parabéns! Você concluiu o laboratório do Hook React usePersistedState. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.