• useTransition 和 useDeferredValue 初体验


    useTransition 是一个帮助你在不阻塞 UI 的情况下更新状态的 React Hook。

    通过 transition,UI 仍将在重新渲染过程中保持响应性。例如用户点击一个选项卡,但改变了主意并点击另一个选项卡,他们可以在不等待第一个重新渲染完成的情况下完成操作。

    1. function TabContainer() {
    2. const [isPending, startTransition] = useTransition();
    3. const [tab, setTab] = useState('about');
    4. function selectTab(nextTab) {
    5. startTransition(() => {
    6. setTab(nextTab);
    7. });
    8. }
    9. // ……
    10. }

    useDeferredValue 是一个 React Hook,可以让你延迟更新 UI 的某些部分。

    在组件的初始渲染期间,返回的延迟值将与你提供的值相同。但是在组件更新时,React 将会先尝试使用旧值进行重新渲染(因此它将返回旧值),然后再在后台使用新值进行另一个重新渲染(这时它将返回更新后的值)

    如果不使用 useDeferredValue : 每次按键都会立即强制整个列表以不可中断的方式进行重新渲染。

    下面的例子中, fallback将不会再被触发。

    1. import { Suspense, useState } from 'react';
    2. import SearchResults from './SearchResults.js';
    3. export default function App() {
    4. const [query, setQuery] = useState('');
    5. return (
    6. <>
    7. <label>
    8. Search albums:
    9. <input value={query} onChange={e => setQuery(e.target.value)} />
    10. label>
    11. <Suspense fallback={<h2>Loading...h2>}>
    12. <SearchResults query={query} />
    13. Suspense>
    14. );
    15. }
    -------------------------------------------------------------

    主要针对的优化场景都是跟下图类似, input快速触发,导致渲染吃力时的应用场景

    延迟一个值与防抖和节流之间有什么不同? 

    在上述的情景中,你可能会使用这两种常见的优化技术:

    • 防抖 是指在用户停止输入一段时间(例如一秒钟)之后再更新列表。
    • 节流 是指每隔一段时间(例如最多每秒一次)更新列表。

    虽然这些技术在某些情况下是有用的,但 useDeferredValue 更适合优化渲染,因为它与 React 自身深度集成,并且能够适应用户的设备。

    与防抖或节流不同,useDeferredValue 不需要选择任何固定延迟时间。如果用户的设备很快(比如性能强劲的笔记本电脑),延迟的重渲染几乎会立即发生并且不会被察觉。如果用户的设备较慢,那么列表会相应地“滞后”于输入,滞后的程度与设备的速度有关。

    此外,与防抖或节流不同,useDeferredValue 执行的延迟重新渲染默认是可中断的。这意味着,如果 React 正在重新渲染一个大型列表,但用户进行了另一次键盘输入,React 会放弃该重新渲染,先处理键盘输入,然后再次开始在后台渲染。相比之下,防抖和节流仍会产生不顺畅的体验,因为它们是阻*的:它们仅仅是将渲染阻塞键盘输入的时刻推迟了。

    如果你要优化的工作不是在渲染期间发生的,那么防抖和节流仍然非常有用。例如,它们可以让你减少网络请求的次数。你也可以同时使用这些技术。

    -------

    参考: Quick Start – React

  • 相关阅读:
    uniapp使用uQRCode绘制二维码,下载到本地,调起微信扫一扫二维码核销
    (经典dp) 骨牌问题 2*n 3*n n*m
    Android JNI 异常定位(2)—— addr2line
    探索Semantic Kernel内置插件:深入了解ConversationSummaryPlugin的应用
    React + 项目(从基础到实战) -- 第八期
    Python中的协程是什么以及如何在Python中实现异步编程
    Kotlin快速运用第三阶段
    第六章:存储系统
    Greenplum7一键安装
    染色法判定二分图(with链式前向星)
  • 原文地址:https://blog.csdn.net/weixin_43416349/article/details/132834459