Реагирующие крючки состояния dafault генерируют null вместо пустого массива

#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 … Не уверен, что это правильный подход.