Как мне обновить useState и дождаться его завершения, программа выполняется бесконечно

#reactjs #asynchronous #use-effect #use-state

#reactjs #асинхронный #использование-эффект #use-state

Вопрос:

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

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

 import axios from 'axios';
import Navbar from './Navbar';
import { UserContext } from './UserContext';
import React, { useContext, useState, useEffect } from 'react'
function Watchlist() {

    const [user , setUser] = useState(); 

    const [watchlist, setWatchlist] = useState();

    setUser({
        name: sessionStorage.getItem('sessionName'),
        email: sessionStorage.getItem('sessionEmail'),
        passowrd: sessionStorage.getItem('sessionPassword'),
        authenticated: sessionStorage.getItem('sessionAuthenticated')
    })
    useEffect(() => {
        getWatchlist()
    }, [user])


    function getWatchlist() {

        console.log(`axios.post ${user.email} ${user.password}`);
        axios.post(`/api/users/watchlist/id/${user.email}/${user.password}`).then((res) => {
            if (res) {
                setWatchlist(res.data);
                console.log(JSON.stringify(res.data));
            }
        }).catch((err) => {
            console.log(err);
        })

    }





    return (
        <div>
            <Navbar />
            <div>{JSON.stringify(watchlist)}</div>
        </div>
    )
} export default Watchlist; 
 

Ответ №1:

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

Просто по умолчанию ваш объект состояния с объектом, который вы хотите.

 const [user , setUser] = useState({
  name: sessionStorage.getItem('sessionName'),
  email: sessionStorage.getItem('sessionEmail'),
  passowrd: sessionStorage.getItem('sessionPassword'),
  authenticated: sessionStorage.getItem('sessionAuthenticated')
});