#reactjs #react-hooks #use-state
#reactjs #реагирующие крючки #use-state
Вопрос:
Я использую хуки useState и в качестве состояния по умолчанию использую пустой массив. Проблема только в состоянии filteredList, когда я загружаю страницу, мое состояние равно null вместо пустого массива. Если я задаю пустой объект или просто строку, то он показывает реальное состояние по умолчанию, но если я помещаю туда массив со значениями, то сначала он регистрирует правильный массив, а затем превращается в пустой архив. Странно то, что он отлично работал несколько дней назад, когда я его писал, поэтому я не знаю, является ли это причудой или проблемой… Вот мой код:
export default function App() {
const [inputText, setinputText] = useState("");
const [todos, setTodos] = useState([]);
const [filterStatus, setFilterStatus] = useState("all");
const [filteredList, setFilteredList] = useState([]);
useEffect(() => {
getLocalTodos();
}, [])
useEffect(() => {
filterHandler();
saveLocalTodos();
}, [todos, filterStatus]);
const filterHandler = () => {
switch (filterStatus) {
case "completed":
setFilteredList(todos.filter(todo => todo.completed === true));
break;
case "uncompleted":
setFilteredList(todos.filter(todo => todo.completed === false));
break;
default:
setFilteredList(todos);
break;
}
}
const saveLocalTodos = () => {
localStorage.setItem('todos', JSON.stringify(todos));
}
const getLocalTodos = () => {
setTodos(JSON.parse(localStorage.getItem('todos')));
}
А остальное — возврат..
Комментарии:
1. Я полагаю, что в вашем коде есть условие гонки. Оба ваших эффекта выполняются один за другим, один пытается выполнить
get
задачи, другой пытается выполнитьset
задачи.2. Можете ли вы также предоставить
return
код, чтобы мы могли понять больше?
Ответ №1:
Я думаю, что проблема в:
const getLocalTodos = () => {
setTodos(JSON.parse(localStorage.getItem('todos')));
}
Проверьте значение, сохраненное в ключе ‘todos’ в localStorage
Комментарии:
1. Вы правы, значение в локальном хранилище равно null . Почему он устанавливает null в качестве значения, а не просто пустой массив? Чтобы решить эту проблему, я ввел условие для saveLocalStorage(), что если состояние todos пустое, то «todos» в локальном хранилище будет [ ] , иначе оно будет равно состоянию todos … Не уверен, что это правильный подход.