客户端数据获取
当你的页面不需要 SEO 索引、不需要预渲染数据,或者页面内容需要频繁更新时,客户端数据获取很有用。与服务器端渲染 API 不同,你可以在组件级别使用客户端数据获取。
如果在页面级别完成,数据会在运行时获取,页面内容会随着数据变化而更新。如果在组件级别使用,数据会在组件挂载时获取,组件内容会随着数据变化而更新。
值得注意的是,使用客户端数据获取会影响应用程序的性能和页面的加载速度。这是因为数据获取是在组件或页面挂载时进行的,并且数据没有被缓存。
使用 useEffect 进行客户端数据获取
以下示例展示了如何使用 useEffect 钩子在客户端获取数据。
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>
)
}这有帮助吗?