当前位置: 首页 > news >正文

HOW - React 处理不紧急的更新和渲染

目录

  • useDeferredValue
  • useTransition
  • useIdleCallback

在 React 中,有一些钩子函数可以帮助你处理不紧急的更新或渲染,从而优化性能和用户体验。

以下是一些常用的相关钩子及其应用场景:

useDeferredValue

  • 用途:用于处理高优先级和低优先级更新。将值的更新推迟到渲染的空闲时间,从而避免卡顿。
  • 示例
    import { useState, useDeferredValue } from 'react';const MyComponent = () => {const [inputValue, setInputValue] = useState('');const deferredValue = useDeferredValue(inputValue);return (<div><input type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} /><ExpensiveComponent value={deferredValue} /></div>);
    };const ExpensiveComponent = ({ value }) => {// 模拟一个开销很大的渲染操作let expensiveCalculation = value.split('').reverse().join('');return <div>{expensiveCalculation}</div>;
    };
    

useTransition

  • 用途:用于标记更新为非紧急更新,并提供用户状态的过渡体验。
  • 示例
    import { useState, useTransition } from 'react';const MyComponent = () => {const [inputValue, setInputValue] = useState('');const [isPending, startTransition] = useTransition();const handleChange = (e) => {startTransition(() => {setInputValue(e.target.value);});};return (<div><input type="text" onChange={handleChange} />{isPending ? "Loading..." : <ExpensiveComponent value={inputValue} />}</div>);
    };const ExpensiveComponent = ({ value }) => {// 模拟一个开销很大的渲染操作let expensiveCalculation = value.split('').reverse().join('');return <div>{expensiveCalculation}</div>;
    };
    

useIdleCallback

通过 polyfill 实现,因为 React 没有内置此钩子:

  • 用途:在浏览器空闲时间执行不紧急的操作,如日志记录或数据预加载。
  • 示例
    import { useEffect } from 'react';const useIdleCallback = (callback) => {useEffect(() => {const id = requestIdleCallback(callback);return () => cancelIdleCallback(id);}, [callback]);
    };const MyComponent = () => {useIdleCallback(() => {console.log('This runs during idle time');});return <div>Idle Callback Example</div>;
    };
    

这些钩子帮助开发者更好地控制 React 应用的性能和响应性,特别是在处理用户交互和长时间运行的计算时。

http://www.lryc.cn/news/405076.html

相关文章:

  • 基于A律压缩的PCM脉冲编码调制通信系统simulink建模与仿真
  • 【入门教程一】基于DE2-115的My First FPGA 工程
  • mysql中的索引和分区
  • 项目实战--C#实现图书馆信息管理系统
  • 信号【Linux】
  • Kafka Producer之ACKS应答机制
  • 【深入理解SpringCloud微服务】深入理解Eureka核心原理
  • 算法——滑动窗口(day7)
  • Django学习第一天(如何创建和运行app)
  • VScode连接虚拟机运行Python文件的方法
  • 通义千问AI模型对接飞书机器人-模型配置(2-1)
  • [k8s源码]6.reflector
  • 前台文本直接取数据库值doFieldSQL插入SQL
  • 【06】LLaMA-Factory微调大模型——微调模型评估
  • 数学建模学习(1)遗传算法
  • NumPy冷知识66个
  • Wi-SUN无线通信技术 — 大规模分散式物联网应用首选
  • 在 Ubuntu Server 22.04 上安装 Docker 的详细步骤
  • 前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段
  • vue3 -layui项目-左侧导航菜单栏
  • Spring AOP(1)
  • 第1关 -- Linux 基础知识
  • tensorflow keras Model.fit returning: ValueError: Unrecognized data type
  • 虚拟机固定配置IP
  • 【Pytorch实用教程】pytorch中random_split用法的详细介绍
  • 第二讲:NJ网络配置
  • pytorch中常见的模型3种组织方式 nn.Sequential(OrderedDict)
  • 达梦数据库DM8-索引篇
  • 【中项】系统集成项目管理工程师-第4章 信息系统架构-4.5技术架构
  • 随机梯度下降 (Stochastic Gradient Descent, SGD)