跳到内容

客户端获取

当你的页面不需要 SEO 索引,当你不需要预渲染你的数据,或者当你的页面的内容需要频繁更新时,客户端数据获取非常有用。与服务器端渲染 API 不同,你可以在组件级别使用客户端数据获取。

如果在页面级别完成,则数据在运行时获取,并且页面的内容会随着数据的变化而更新。当在组件级别使用时,数据在组件挂载时获取,并且组件的内容会随着数据的变化而更新。

重要的是要注意,使用客户端数据获取可能会影响你的应用程序的性能和页面的加载速度。这是因为数据获取是在组件或页面挂载时完成的,并且数据没有被缓存。

使用 useEffect 的客户端数据获取

以下示例展示了如何使用 useEffect Hook 在客户端获取数据。

import { useState, useEffect } from 'react'
 
function Profile() {
  const [data, setData] = useState(null)
  const [isLoading, setLoading] = useState(true)
 
  useEffect(() => {
    fetch('/api/profile-data')
      .then((res) => res.json())
      .then((data) => {
        setData(data)
        setLoading(false)
      })
  }, [])
 
  if (isLoading) return <p>Loading...</p>
  if (!data) return <p>No profile data</p>
 
  return (
    <div>
      <h1>{data.name}</h1>
      <p>{data.bio}</p>
    </div>
  )
}

使用 SWR 的客户端数据获取

Next.js 团队创建了一个用于数据获取的 React Hook 库,名为 SWR。如果你在客户端获取数据,强烈推荐使用它。它可以处理缓存、重新验证、焦点跟踪、间隔重新获取等等。

使用与上面相同的示例,我们现在可以使用 SWR 来获取个人资料数据。SWR 将自动为我们缓存数据,并在数据变得陈旧时重新验证数据。

有关使用 SWR 的更多信息,请查看 SWR 文档

import useSWR from 'swr'
 
const fetcher = (...args) => fetch(...args).then((res) => res.json())
 
function Profile() {
  const { data, error } = useSWR('/api/profile-data', fetcher)
 
  if (error) return <div>Failed to load</div>
  if (!data) return <div>Loading...</div>
 
  return (
    <div>
      <h1>{data.name}</h1>
      <p>{data.bio}</p>
    </div>
  )
}