I'am trying to use suspence to render a fallback while the Promise is not solved.我正在try 使用悬念来在promise 未解决时提供回退.我做错了什么?

它应该在获取promise 不返回数据时呈现回退.但是,当我try 从浏览器获取数据时,回退不会出现.

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>
    )
}

我曾try 将悬疑标签放在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>
    )

推荐答案

就目前而言,Suspense只在实现组件的延迟加载时起作用,它不支持数据获取的用例.在这种情况下,您可以创建一个加载状态,该状态在数据提取函数开始执行时设置为true,然后在完成后设置为false,这样您就可以基于该状态显示加载/提取UI.

Reactjs相关问答推荐

父组件更新后不重新呈现子组件

无法在列表中看到文本

使用筛选器的Primereact DataTable服务器端分页?

Redux Store未触发React组件中的重新呈现

React Router:在没有手动页面刷新的情况下,路由不会更新内容

页面永远加载API/从数据库获取数据

useState导致对函数的无休止调用

状态改变不会触发重新渲染

React 在第一次渲染时为 null

如何在不同的路由中渲染相同的页面组件(包括 getServerSideProps)

获取更多数据后更新 DOM,而不刷新 React.js 中的页面

未处理的拒绝 (TypeError):无法读取未定义的属性(读取协议)

如何使用样式化函数为 TextField 的输入组件设置样式

如何在 ChartJS 中操作 Y 轴

Reactjs 表单未反映提交时的更改

响应式媒体 React Tailwind

谁能根据经验提供有关 useEffect 挂钩的更多信息

如何在props 更改时运行自定义挂钩?

为什么我从另一个组件收到错误?

React-Native PDF 注释