简体   繁体   English

使用UseEffect ReactJs后清空数据

[英]Empty data after using UseEffect ReactJs

I want to get news but i have an empty dictionary in the first render.我想获取新闻,但在第一次渲染中我有一个空字典。 My useEffect我的使用效果

const [news, setNews] = useState({});
const [page, setPage] = useState(1);
const [user, setUser] = useState({});

useEffect(() =>{
    const getNews = async() =>{
        const newsData = await httpClient.get(`/feed/${pk}/?page=${page.toString()}`)
        setNews(newsData.data);
        const userData = await httpClient.get('/profile/')
        setUser(userData)
    }
    getNews();
}, [page])

How can i get data in the first time render?如何在第一次渲染时获取数据?

because you have [page] in the dependency array - add hook for initial render:因为你在依赖数组中有[page] - 为初始渲染添加钩子:

const [page, setPage] = useState(0);

useEffect(() => setPage(1), [])

You will always have your state what you initialize it as on first render, react won't wait until useEffect is finished before render since that would lock up the UI.您将始终拥有您在第一次渲染时初始化它的 state,反应不会等到 useEffect 在渲染之前完成,因为这会锁定 UI。

You need some sort of loading indicator while data is fetching, you can do this for example在获取数据时您需要某种加载指示器,例如,您可以这样做

const [loading, setLoading] = useState(true);
const [news, setNews] = useState({});
const [page, setPage] = useState(1);
const [user, setUser] = useState({});

useEffect(() =>{
    const getNews = async() =>{
        const newsData = await httpClient.get(`/feed/${pk}/?page=${page.toString()}`)
        setNews(newsData.data);
        const userData = await httpClient.get('/profile/')
        setUser(userData)
        setLoading(false)
    }
    setLoading(true)
    getNews();
}, [page])

if (loading) {
  return <>{"loading"}</>
}

change the return value to whatever you want, maybe you want to just return an empty <></> component so that when it first shows up it'll have all the data.将返回值更改为您想要的任何值,也许您只想返回一个空的<></>组件,这样当它第一次出现时它就会拥有所有数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM