Как обновить начальные значения (несколько данных) в react-hooks?

#javascript #reactjs #react-hooks #use-effect

#javascript #reactjs #react-hooks #использование-эффект

Вопрос:

Я получил предупреждающее сообщение после того, как создал функцию для установки значений данных текущего пользователя loggedin и вызвал ее в useEffect. Вот код:

 import React, { useEffect, useState } from "react";
...

const AddPost = () => {
  const userStorage = sessionStorage.getItem('user');
  const [values, setValues] = useState({
    userId: '',
    authorName: '',
    title: '',
    content: '',
    likes: '',
    dislikes: ''
  });

  useEffect(() => {
    getCurrentUserInfo();
  },[]);

  const getCurrentUserInfo = () => {
    if(userStorage !== null) {
      setValues({
        ...values,
        userId: userStorage.id,
        authorName: userStorage.userName,
      })
    }
  }
  ...
export default AddPost;
  

я просто хочу установить userId и AuthorName из данных пользователя, вошедшего в систему, поэтому в функции setValues
я получаю все начальные значения, затем я обновляю только userId и AuthorName.
И вдруг в консоли моего браузера появляется предупреждающее сообщение, в котором говорится

 React Hook useEffect has a missing dependency: 'getCurrentUserInfo'. Either include it or remove the dependency array
  

я пытаюсь удалить [] in useEffect , но это вызывает задержку в моем браузере, потому useEffect что вызывается циклическая функция.
я пытаюсь добавить values и userStorage или один из них внутри [] , все еще безуспешно.
есть ли какие-либо решения для этого?

Ответ №1:

Всегда рекомендуется добавлять все зависимости в массив, необходимые для перехвата useEffect, который в вашем случае является функцией getCurrentUserInfo, поэтому он показывает предупреждение.

Чтобы избежать этого, вы можете определить getCurrentUserInfo внутри крючка useEffect и не указывать это как зависимость. Вы также можете использовать шаблон обратного вызова для обновления состояния, чтобы избежать значений как зависимости, и вам все равно нужно будет предоставить userStorage как зависимость. И для userStorage вы можете запомнить это значение с помощью useMemo, чтобы оно не вызывало повторных отправлений.

      const userStorage = useMemo(() => sessionStorage.getItem('user'), [sessionStorage]);

      useEffect(() => {
        const getCurrentUserInfo = () => {
        if(userStorage !== null) {
          setValues(values => ({
            ...values,
            userId: userStorage.id,
            authorName: userStorage.userName,
          }))
        }
      }

        getCurrentUserInfo();
      },[userStorage]);
    
  
  

Ответ №2:

   useEffect(() => {
    getCurrentUserInfo();
  },[getCurrentUserInfo]);
  

Вы должны добавить функцию внутри массива зависимостей. Но обратите внимание, что это необязательно, если вы не добавите его в массив, он просто запустится один раз. Когда вы добавляете его в массив, он будет запускаться всякий раз, когда функция обновляется, что в данном случае будет один раз.

Официальная документация react:

Если вы используете эту оптимизацию, убедитесь, что массив включает все значения из области видимости компонента (например, props и state), которые меняются со временем и которые используются эффектом.

Комментарии:

1. Если я добавил функцию внутри [] , она по-прежнему отображает предупреждающее сообщение: ‘getCurrentUserInfo’ использовался до его определения

2. Затем вы должны переместить useEffect ниже getCurrentUserInfo()

Ответ №3:

[РЕШИТЬ]

Я хочу дать ответ на свой вопрос, как обновить несколько данных, и удалить функцию вызова цикла, потому что useEffect . Итак, сначала я удаляю функцию и просто устанавливаю значение внутри useEffect.

 useEffect(() => {
  if(userStorage !== null) {
    setValues({
      ...
    })
  }
},[]);
  

и внутри setValues я ставлю так

 setValues(values => ({
  ...values,
  userId: userStorage.id,
  authorName: userStorage.userName,
}))
  

затем окончательный код выглядит следующим образом

 useEffect(() => {
  if(userStorage !== null) {
    setValues(values => ({
      ...values,
      userId: userStorage.id,
      authorName: userStorage.userName,
    }))
  }
},[]);