useEffect 钩子完成后如何渲染组件?

Posted

技术标签:

【中文标题】useEffect 钩子完成后如何渲染组件?【英文标题】:How can I render the components after useEffect hook is finished? 【发布时间】:2021-08-25 00:12:38 【问题描述】:

我正在从 api 获取数据,并且我有一个存储数据的钩子。我想在 useEffect 挂钩获取数据并将数据设置为 data 挂钩后渲染组件。我该怎么做?

编辑:在渲染组件之前我需要数据。

export const App = () => 
  const [data, setData]

  useEffect(() => 
  axios.get("/data").then((res) => setData(res.data)).catch((err) => console.log(err))
  , [])

  return (
    <div>
      <Home />
    </div>
  )

【问题讨论】:

【参考方案1】:

你可以这样做

export const App = () => 
  const [data, setData] = useState(null);

  useEffect(() => 
  axios.get("/data").then((res) => setData(res.data)).catch((err) => console.log(err))
  , [])

  return (
    <div>
      <Home setData=setData/> //here you can pass data to the home component and play with the data
    </div>
  )

【讨论】:

哦,忘了说我使用 react-router,这就是为什么我在渲染路由之前需要数据。你知道怎么做吗? 哦好的,你拿到数据后需要渲染home组件吗? 我的意思是在渲染之前我需要数据:return ( )。 @EnigmaState 是的,数据存储在setData 变量中,因此您可以在返回之前从该变量访问 然后 return 渲染两次。【参考方案2】:

您可以根据状态有条件地渲染组件。这样它只有在状态不为空时才存在。

export const App = () => 
  const [data, setData] = useState(null);

  useEffect(() => 
  axios.get("/data").then((res) => setData(res.data)).catch((err) => console.log(err))
  , [])

  return (
    <div>
      data ? <Home setData=setData/> : null  // here you can pass data to the home component
    </div>
  )

【讨论】:

【参考方案3】:

您可以在渲染前添加 if 语句来检查您的数据是否尚未加载到状态中,因此如果您不希望组件渲染,则可以返回 null。

export const App = () => 
  const [data, setData] = useState(null)

  useEffect(() => 
    axios.get("/data")
      .then((response) => setData(response.data))
      .catch((error) => console.log(error))
  , [])

  if (data === null) return null

  return (
    <div>
      <Home />
    </div>
  )

【讨论】:

以上是关于useEffect 钩子完成后如何渲染组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 React 钩子(useContext、useEffect)与 Apollo 反应钩子(useQuery)结合起来

使用 useEffect 渲染的钩子比上一次渲染时更多

停止重新渲染反应功能组件(使用钩子)

React的Effect Hook解决函数组件的性能问题和潜在bug!

如何在数组依赖中正确使用 useEffect 挂钩。我从 redux 商店传递了状态,但我的组件仍然无限渲染

在使用 graphql 的 useQuery 获取的数据更新 useEffect 钩子内的状态变量时防止无限渲染