You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
import{useData,defineDataLoader,Await}from'ice';import*asReactfrom'React';exportdefaultfunctionHome(){constdata=useData();return(<main><h1>Let's locate your package</h1><React.Suspensefallback={<p>Loading package location...</p>}><Awaitresolve={data}errorElement={<p>Error loading package location!</p>}>{(packageLocation)=>(<p>
Your package is at {packageLocation.latitude}
lat and {packageLocation.longitude} long.
</p>)}</Await></React.Suspense></main>);}exportconstdataLoader=defineDataLoader(async()=>{constpackageLocationPromise=getPackageLocation(params.packageId,);returnpackageLocationPromise;},{defer: true,});
import{useAsyncData,defineDataLoader}from'ice';exportdefaultfunctionHome(){const{ data, error, isLoading }=useAsyncData();if(error){return<div>failed to load</div>;}if(isLoading){return<div>loading...</div>;}return(<main><h1>Let's locate your package</h1><p>
Your package is at {data.latitude}
lat and {data.longitude} long.
</p></main>);}exportconstdataLoader=defineDataLoader(async()=>{constpackageLocationPromise=getPackageLocation(params.packageId,);returnpackageLocationPromise;},{defer: true,});
Summary | 概述
数据加载异步化,不阻塞渲染,从而减少页面白屏时间
Motivation | 背景
DataLoader 提供了前置加载数据请求的能力,目前的设计是页面需要等待 DataLoader 的数据加载完成后,才开始渲染
如果接口过慢,可能导致白屏时间过久
因此,希望也能提供 DataLoader 不阻塞渲染的能力,页面可以先渲染,数据加载完成后,再次更新渲染内容
Usage example | 使用示例
见方案设计
Detailed design | 方案设计
根据对数据消费方式的差异,分为两套方案
方案1:
声明式的方式
方案2:
进行状态判断
如果 defineDataLoader 传入的是数组,useAsyncData 的返回值也对应一个数组,数组中的每一项状态同上
Additional context | 额外信息
两个方案对比
方案1
方案2
其他需要考虑的点是:
和 react use 的区别
使用了 react use 的组件,数据在加载过程中,整个组件是不渲染的,而我们需要的组件内不依赖数据的部分先行渲染
https://github.com/acdlite/rfcs/blob/first-class-promises/text/0000-first-class-support-for-promises.md#resuming-a-suspended-component-by-replaying-its-execution
The text was updated successfully, but these errors were encountered: