Suspense React 无法获取数据

问题描述 投票:0回答:1

我正在尝试使用 Suspense 在 Promise 未解决时渲染后备。我做错了什么?

它应该在 fetch Promise 不返回数据时呈现后备。但是当我尝试从浏览器获取数据时,回退不会出现。

export const MainFlow = () => {
    const URL_BASE = 'https://api.thedogapi.com/v1/images/search'
    const [data, setData] = useState<any[]>([])

    const fetchData = async () => {
        const response = await httpService.request({
            url: `${URL_BASE}?limit=10`,
            method: 'get',
            headers: { 'x-api-key': 'some-key' }
        })
        setData(response.body)
    }

    useEffect(() => {
        fetchData()
    }, [])

    const DogImage: FC<DogImageProps> = ({ url }) => {
        return (
            <img src={url} alt="I'am a doggo." className="mfone__dog-images" />
        )
    }

    return (
        <div id="mfone__dog-container">
            <Suspense fallback={<div>Loading...</div>}>
                <div id="mfone__images-box">
                    {data
                        ? data.map((element, index) => {
                                return (
                                    <DogImage key={index} url={element.url} />
                                )
                          })
                        : null}
                </div>
            </Suspense>
            <div id="mfone__links-box">
                <Link to="/" className="mfone__dog-links">
                    Back to Home page
                </Link>
                <button
                    onClick={() => fetchData()}
                    className="mfone__dog-links"
                >
                    More Doggos
                </button>
            </div>
        </div>
    )
}

我尝试将 Suspense 标签放入 id 为“mfone__images-box”的 div 中,但仍然不起作用:

return (
        <div id="mfone__dog-container">
            <div id="mfone__images-box">
                <Suspense fallback={<div>Carregando...</div>}>
                    {data
                        ? data.map((element, index) => {
                                return (
                                    <DogImage key={index} url={element.url} />
                                )
                          })
                        : null}
                </Suspense>
            </div>
            <div id="mfone__links-box">
                <Link to="/" className="mfone__dog-links">
                    Back to Home page
                </Link>
                <button
                    onClick={() => fetchData()}
                    className="mfone__dog-links"
                >
                    More Doggos
                </button>
            </div>
        </div>
    )
reactjs promise fetch-api
1个回答
1
投票

到目前为止,

Suspense
仅在实现组件的延迟加载时有效,它不支持您的数据获取用例。在这种情况下,您可以创建一个加载状态,在数据获取函数开始执行时将其设置为
true
,然后在完成后设置为
false
,这样您就可以根据数据显示加载/获取 UI那个状态。

更新:

Suspense
现在可以在实现React服务器组件时用于数据获取,该组件已从实验性转变为完全支持。 Next.js v13 已开始在其仍处于实验阶段的
app
目录功能中实现 React Server Components。

© www.soinside.com 2019 - 2024. All rights reserved.