Хуки React usePersistedState
В ВМ уже предоставлены index.html и script.js. В общем, вам нужно только добавить код в script.js и style.css.
Этот хук возвращает состояние, сохраняемое в localStorage, и функцию для его обновления. Чтобы использовать его, следуйте шагам:
- Используйте хук
useState() для инициализации value значением defaultValue.
- Используйте хук
useRef() для создания ссылки, которая будет хранить name значения в Window.localStorage.
- Используйте 3 экземпляра хука
useEffect() для инициализации, изменения value и изменения name соответственно.
- При первом монтировании компонента используйте
Storage.getItem(), чтобы обновить value, если есть сохраненное значение, или Storage.setItem(), чтобы сохранить текущее значение.
- При обновлении
value используйте Storage.setItem(), чтобы сохранить новое значение.
- При обновлении
name используйте Storage.setItem(), чтобы создать новый ключ, обновить nameRef и использовать Storage.removeItem(), чтобы удалить предыдущий ключ из Window.localStorage.
- Обратите внимание, что хук предназначен для использования с примитивными значениями (то есть не объектами) и не учитывает изменения в
Window.localStorage из-за другого кода. Эти два вопроса могут быть легко обработаны (например, сериализация JSON и обработка события 'storage').
Вот код:
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} onChange={handleInputChange} />;
};
const MyApp = () => {
const [name, setName] = React.useState("my-value");
const handleInputChange = (event) => {
setName(event.target.value);
};
return (
<>
<MyComponent name={name} />
<input value={name} onChange={handleInputChange} />
</>
);
};
ReactDOM.createRoot(document.getElementById("root")).render(<MyApp />);
Пожалуйста, нажмите кнопку "Go Live" в нижнем правом углу, чтобы запустить веб-сервис на порту 8080. Затем вы можете обновить вкладку Web 8080, чтобы просмотреть веб-страницу.