当前位置: 首页 > Web前端 > HTML

Suspense对React意味着什么?

时间:2023-03-28 10:26:42 HTML

大家好,我是Kason。可能很多朋友没有在项目中使用过Suspense,但是Suspense是React未来发展中非常重要的一环。本文将解释Suspense对React意味着什么。欢迎加入人类优质前端框架群,放飞React的迭代历程。React从v16到v18的主要特性发生了三大变化:v16:AsyncMode(异步模式)v17:ConcurrentMode(并发模式)v18:ConcurrentRender(并发更新)要理解这三个变化的含义,需要理解React中一个很容易混淆的概念——渲染(rendering)。ClassComponent的render函数执行时调用render:classAppextendsComponent{render(){//...thisistherenderfunction}}将render的结果渲染到页面的过程称为commit.异步模式的目的是使渲染异步和可中断。并发模式的目的是让提交在用户看来是并发的。由于ConcurrentMode包含breakingchange,v18提出了ConcurrentRender来降低开发者迁移的成本。那么让commit在用户的认知中并发是什么意思呢?“并发”的含义说到并发,就不得不提到Suspense。考虑以下代码:constApp=()=>{const[count,setCount]=useState(0);useEffect(()=>{setInterval(()=>{setCount(count=>count+1);},1000);},[]);返回(<>loading...

}>
countis{count}
);};其中:每秒会触发一次update,statecount会更新为count=>count+1。Sub中会发起一个异步请求,在请求返回前,Sub会被包裹Suspense渲染回退假设请求在三秒后返回。理想情况下,发起请求前后的页面会依次显示://在Sub中发起请求之前我是sub,count为0
countis0
//Sub中请求的第一秒
loading...
countis1
//Sub中请求的第二秒
loading...
countis2
//Sub中的请求发起第3秒
loading...
countis3
//Sub中请求成功后我是sub,请求成功,count为4
count为4</div>从用户的角度来看,页面上有两个任务并发执行:请求Sub的任务(观察第一个div的变化)和改变count的任务(观察第二个div的变化)带来的通过Suspense页面中多任务并发执行的感觉,就是React中Concurrent(并发)的意思。事实上,在AsyncMode中,Suspense已经被支持了。但是上面的代码在AsyncMode的页面中表现如下://在Sub发起请求之前我是sub,count是0
count是0
//sub请求发起第1秒
loading...
count为0
//sub请求发起第2秒
loading...
countis0
//Sub中的请求发起3秒
loading...
countis0
//之后Sub中请求成功我是sub,请求成功,count为4
count为4
从用户的角度来看,当请求Sub的任务被执行,更改计数的任务被冻结。这就是为什么它被称为Async(异步)而不是Concurrent(并发)的原因。Suspense的意义可见一斑,对于Concurrent来说,Suspense是必不可少的一部分。可以认为Suspense的作用就是划分页面中需要并发渲染的部分。比如上面的例子,请求Sub的任务和改变计数的任务通过Suspense分离,视觉上并发执行。弄清楚Suspense的含义后,你会发现React接下来要做的就是不断扩展Suspense的场景(也就是将更多的场景纳入并发渲染的范围)。比如目前可用的:React.lazy异步请求,通过React提供的fetch库改造。useTransitionuseDeferredvalue以后会补充:ServerComponentSelectiveHydration总结了React的发展历程:从同步到异步,再到并发。实现并发后,接下来的发展方向将是:不断拓展可以使用并发的场景。Suspense的作用是划分页面中需要并发渲染的部分。这条发展路径从React诞生之初就已经确定,因为在架构上,React非常依赖运行时。为了优化性能,并发是这种架构下的最优发展方向。