Настоящим мое решение. Я создал функцию useLocalStorage
, которая хранит и получает или устанавливает элементы в локальном хранилище и сохраняет их в своем собственном состоянии:
import React from "react";
export const useLocalStorage = (key, initialValue) => {
const [storedValue, setStoredValue] = React.useState(() => {
try {
const item = window.localStorage.getItem(key);
return item ? JSON.parse(item) : initialValue;
} catch (error) {
console.log(error);
return initialValue;
}
});
const setValue = value => {
try {
setStoredValue(value);
window.localStorage.setItem(key, JSON.stringify(value));
} catch (error) {
console.log(error);
}
};
return [storedValue, setValue];
};
export default useLocalStorage;
Для компонента searchBar я использовал forwardRef для доступа к значение входа внутри нашего высшего компонента App
. Функция newSearch
и переменная searchTerm
удалены из реквизита. Заполнитель содержит сохраненное значение в localStorage, которое составляет searchTerm
:
export const SearchAppBar = React.forwardRef(
({ newSearch, searchTerm }, ref) => {
return (
<>
<input ref={ref} type="text" placeholder={searchTerm} />
<button onClick={newSearch}> Search </button>
</>
);
}
);
Внутри основного компонента App
Я использую нашу функцию-ловушку useLocalStorage, чтобы получить и установить поиск. Внутри newSearch
Я обновляю поисковый термин, вызывая наш хук со значением перенаправленного ввода ref.
export default function App() {
const ref = React.createRef();
const [searchTerm, setSearchTerm] = useLocalStorage(
"search",
"Not searched yet"
);
const newSearch = () => {
setSearchTerm(ref.current.value);
};
return (
<>
<SearchAppBar ref={ref} newSearch={newSearch} searchTerm={searchTerm} />
<p>Last search: {searchTerm}</p>
</>
);
}
Надеюсь, это подходящее для вас решение.
Пожалуйста, найдите фрагмент кода здесь: https://codesandbox.io/s/cranky-sunset-8fqtm?file= / src / index. js: 387-773