React18 Transition特性详解

Transition 核心概念:Transition是一种标记非紧急任务更新的机制,它允许React在用户交互(如输入)期间保持界面的响应,同时准备后台更新

主要特点:

  • 区分优先级:可以将更新分为紧急非紧急任务
  • 可中断渲染:Transition更新可以被更紧急的交互打断
  • 自动降级:在不支持并发环境中自动回退到同步渲染

场景:
在Input中输入搜索内容,过滤列表,由于数据量比较大10万条数据导致页面卡死
那如何处理此瓶颈:10万条数据分页还是利用虚拟滚动实现假性分页。
如果把同步更新任务变成异步更新任务是不是就可以解决问题。Transition就可以处理多个并发任务

Input表单的并发任务分别为:

  • 更新Input的内容,同时会触发更新任务(高优先级的任务)
  • Input内容改变,过滤列表,重新渲染也是一个任务(低优先级任务)

这里的任务可以分为紧急优先级任务和非紧急任务

紧急任务就是当用户改变Input框的内容时候要立马能够看到更新后的内容,不然就会有卡顿、延迟。会有一种极差的视觉体验
非紧急任务是当input输入内容后,过滤列表并重新渲染列表,这个过程如果有延迟,用户也是可以接受的

什么是紧急任务:直接影响用户即时交互的界面更新,在本例中,输入框value的更新、输入框的光标位置、焦点状态等
什么是非紧急任务:可以稍后处理的计算密集型或网络请求
为什么紧急:每次用户操作后需要立即看到输入后的反馈,否则顿感卡顿,如果延迟处理,会导致输入内容与显示不一致,糟糕的用户体验
为什么非紧急:用户能够容忍短暂的结果延迟,如果与输入框竞争资源,反而会导致输入卡顿

Transition基本用法:

import { startTransition } from 'react';// 在事件处理中
function handleInputChange(e) {const value = e.target.value;// 紧急更新:立即更新输入框setInputValue(value);// 非紧急更新:标记为TransitionstartTransition(() => {setSearchQuery(value); // 可能触发大量计算的更新});
}

使用 useTransition Hook

import { useTransition } from 'react';function SearchBox() {const [isPending, startTransition] = useTransition();const handleChange = (e) => {const value = e.target.value;setInputValue(value);startTransition(() => {setSearchQuery(value);});};return (<div><input onChange={handleChange} />{isPending && <Spinner />} {/* 显示过渡状态 */}</div>);
}

上述案例完整代码:

import { useState, useTransition } from 'react';function SearchComponent() {const [inputValue, setInputValue] = useState('');const [searchResults, setSearchResults] = useState([]);const [isPending, startTransition] = useTransition();// 实际项目中实现的搜索函数async function performHeavySearch(keyword) {const response = await fetch(`/api/search?q=${keyword}`);const data = await response.json();return data.items; // 根据实际API结构调整}const handleChange = async (e) => {const value = e.target.value;setInputValue(value);startTransition(async () => {const results = await performHeavySearch(value);setSearchResults(results);});};return (<div><input value={inputValue} onChange={handleChange} />{isPending ? (<div>Searching...</div>) : (<ul>{searchResults.map(item => (<li key={item.id}>{item.name}</li>))}</ul>)}</div>);
}

典型案例:

  • 搜索输入:输入时保持输入框响应,搜索结果稍后显示
  • 标签页切换:点击切换标签时立即显示激活状态,内容稍后加载
  • 大数据渲染:优先渲染可见部分,其他内容渐进加载

与Suspense的结合使用:Transition 可以与 Suspense 完美配合,实现流畅的异步加载体验:

import { Suspense, useTransition } from 'react';function App() {const [resource, setResource] = useState(initialResource);const [isPending, startTransition] = useTransition();function fetchNewData() {startTransition(() => {setResource(fetchData()); // 返回一个Suspense兼容的资源});}return (<div><button onClick={fetchNewData}disabled={isPending}>{isPending ? 'Loading...' : 'Load Data'}</button><Suspense fallback={<Spinner />}> {/* Spinner 显示过渡状态 */}<DataDisplay resource={resource} /></Suspense></div>);
}

React中Suspense和核心功能:

1、作用:

  • 用在子组件(懒加载或异步数据请求)完成加载前显示一个后备方案(fallback UI),例如加载动画或者占位符
  • 支持代码分割(通过React.lazy)和异步数据加载(需支持Suspense的库,如react query或relay)

2、关键特性:

  • 代码分割:与react.lazy结合,实现组件按需加载
  • 数据加载:需依赖Suspense库,原生react不支持异步数据Suspense
  • 嵌套使用:允许逐步加载内容,优化用户体验

3、示例:

<Suspense fallback={<Loading />}><LazyComponent />  // 通过 React.lazy 加载
</Suspense>

与vue中的Suspense

1、作用

  • 处理异步组件或异步setup函数加载状态,显示后备内容
  • 支持任意异步逻辑(如数据请求或动态导入组件),不限于组件级懒加载

2、关键特性

  • 插槽设计:通过#default和#fallback插槽管理内容
  • 事件监听:提供pending、resolve等事件、便于控制加载状态
  • 嵌套支持:子组件的异步依赖会触发父级Suspense的fallback

3、示例

<Suspense><template #default><AsyncComponent />  // 异步组件或含 async setup 的组件</template><template #fallback><Loading /></template>
</Suspense>

主要区别:

特性React SuspenseVue Suspense
支持范围主要针对组件懒加载、异步数据请求、数据需要第三方支持支持任意异步逻辑(组件、数据等)
API 设计通过fallback prop定义占位内容使用插槽(#default 和 #fallback
嵌套行为内部Suspense优先处理父级的Suspense等子异步依赖完成再处理
事件监听无内置事件通过pending、resolve、fallback等事件

vue3中Suspense中事件用法

<template><Suspense @pending="onPending"@resolve="onResolve"@fallback="onFallback"><template #default><AsyncComponent /></template><template #fallback><div>Loading...</div></template></Suspense>
</template><script setup>
import { defineAsyncComponent } from 'vue';const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue')
);function onPending() {console.log('开始异步加载');// 可以在这里显示全局加载状态// 发送分析事件analytics.track('DashboardLoadStart');
}function onResolve() {console.log('异步加载完成');// 可以在这里隐藏全局加载状态// 发送性能数据analytics.track('DashboardLoaded', { duration: loadTime });
}function onFallback() {console.log('Fallback内容被展示');// 可以记录fallback显示时间等
}
</script>

备注:这里面可以用作性能监控,当开始的时候发送事件分析,当结束时候获得性能数据

代码分割详解:

代码分割是前端性能优化中的重要技术。
代码分割是将整个应用分割成多个小块,然后按需加载,而不是一次性加载所有代码,这可以:

  • 显著减少初始加载时间
  • 降低首屏资源体积
  • 通过应用交互响应速度

传统代码分割问题:

// 传统动态导入方式
import("./MyComponent.js").then(module => {// 组件加载完成后才能使用
});
  • 需要手动处理加载状态
  • 容易导致布局跳动或空白
  • 代码组织不够直观

Suspense如何分割代码

React:

const MyComponent = React.lazy(() => import('./MyComponent'));function App() {return (<Suspense fallback={<div>Loading...</div>}><MyComponent />  {/* 被代码分割的组件 */}</Suspense>);
}

Vue3:

<script setup>
const AsyncComp = defineAsyncComponent(() => import('./MyComponent.vue')
)
</script><template><Suspense><template #default><AsyncComp /></template><template #fallback><div>Loading...</div></template></Suspense>
</template>
  • 动态导入组件
  • 导入过程中,Suspense显示fallback内容
  • 加载完成后,替换为实际组件

技术实现细节:
Webpack的代码分割:当使用import()语法时,打包工具会自动:

  • 将目标分割成一个独立的chunk文件
  • 生成运行时候加载逻辑
  • 在需要时通过 JSONP动态获取

Suspense的协调机制:

  • React/Vue会自动追踪异步组件加载状态
  • 在模块加载期间暂停渲染
  • 加载完成后重新触发渲染

为什么需要Suspense

无Suspense有Suspense
需要手动维护loading统一处理loading
多个异步加载时状态复杂支持嵌套异步依赖
错误处理困难与错误边界(Error Boundaries)天然集成

性能优化技巧:

预加载策略:

// 鼠标悬停时预加载
function onLinkHover() {import('./ComponentToPrefetch');
}

命名chunks:

const Component = lazy(() => import(/* webpackChunkName: "specific-name" */ './Component'
));

Suspense嵌套:

<Suspense fallback={<AppLoader />}><Layout><Suspense fallback={<SidebarLoader />}><Sidebar /></Suspense></Layout>
</Suspense>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92688.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony概述与使用

1. OpenHarmony Hi3861 学习目标与任务 硬件基础知识&#xff1a;涵盖嵌入式硬件体系架构&#xff08;如 MCU 基础、硬件接口原理 &#xff09;、硬件设计流程&#xff08;原理图绘制、PCB Layout 规范 &#xff09;&#xff0c;了解常见硬件外设&#xff08;传感器、通信模…

大模型提示词工程实践:大语言模型文本转换实践

大模型文本转换 学习目标 在本课程中&#xff0c;我们将探究如何使用大语言模型来完成文本转换任务&#xff0c;例如语言翻译、拼写和语法检查、语气调整以及格式转换。 相关知识点 大模型文本转换 学习内容 1. 大模型文本转换 文本转换的核心定义与范畴 文本转换 是指通过技术…

力扣LCR024:反转链表206.反转链表双解法(经典面试题)

LCR 024. 反转链表 - 力扣&#xff08;LeetCode&#xff09;LCR 024. 反转链表 - 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a;[https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg]输入&#xff1a…

Day 6: CNN卷积神经网络 - 计算机视觉的核心引擎

Day 6: CNN卷积神经网络 - 计算机视觉的核心引擎 📚 核心概念(5分钟理解) 什么是CNN卷积神经网络? 核心概念解释: CNN(Convolutional Neural Network): 专门处理具有网格状拓扑结构数据的深度学习模型,特别擅长图像识别 为什么需要: 传统全连接神经网络处理图像时参数量…

MacBook 本地化部署 Dify 指南

Dify 安装前的准备工作 确认系统满足最低配置要求&#xff0c;包括操作系统版本、内存、CPU 和存储空间。 检查是否已安装必要的依赖项&#xff0c;如 Python、Docker 确保网络环境稳定&#xff0c;能够访问所需的软件源或镜像仓库。 获取 Dify 安装包 https://docs.dify.ai…

疫情可视化:基孔肯雅热风险地图实战解析

> 一只白纹伊蚊的飞行半径是100米,而一套WebGIS系统能将疫情防控范围精确到每平方米。 2025年夏季,基孔肯雅热疫情在广东佛山爆发,短短一个月内感染病例占全省95%以上。这种由伊蚊传播的病毒性疾病,以**突发高热、剧烈关节痛和全身皮疹**为特征,患者关节疼痛可能持续数…

【14-模型训练细节】

训练步骤 1、指定输入和输出&#xff0c;即模型定义&#xff1b; 2、指定损失函数和成本函数&#xff1b; 3、指定训练算法&#xff0c;如梯度下降算法&#xff1b;训练细节 损失函数和成本函数用梯度下降算法训练模型 主要是求成本函数的偏导数&#xff0c;使用的是反向传播算…

ConcurrentDictionary 详解:.NET 中的线程安全字典

什么是 ConcurrentDictionary&#xff1f; ConcurrentDictionary<TKey, TValue> 是 .NET Framework 4.0 和 .NET Core/.NET 5 中引入的线程安全字典实现&#xff0c;位于 System.Collections.Concurrent 命名空间。它解决了多线程环境下操作字典时的同步问题&#xff0c…

集成电路学习:什么是URDF Parser统一机器人描述格式解析器

URDF Parser(URDF解析器)是ROS(Robot Operating System,机器人操作系统)中用于解析URDF(Unified Robot Description Format,统一机器人描述格式)文件的工具。URDF是一种基于XML(Extensible Markup Language,可扩展标记语言)规范的格式,用于描述机器人的结构、关节、…

老式大头显示器(CRT)和当前最高分辨率的LED显示器对比

老式 CRT&#xff08;阴极射线管&#xff09;和当前最顶尖的 LED&#xff08;包括 MicroLED / 高端 MiniLED / OLED&#xff09;显示器在画面清晰度极限相关的参数并列分析。1. 分辨率与像素密度指标老式 CRT&#xff08;PC/电视用&#xff09;顶级 LED 显示器&#xff08;2025…

北京JAVA基础面试30天打卡07

1. 缓存三大问题及解决方案问题场景后果常用解决方案缓存穿透请求的数据在缓存和数据库中都不存在&#xff08;恶意攻击或查询异常 ID&#xff09;每次请求都会打到数据库&#xff0c;导致 DB 压力骤增- 缓存空值&#xff08;短期缓存不存在的 key&#xff09;- 布隆过滤器&…

后量子密码学的迁移与安全保障:迎接量子时代的挑战

在当今数字化时代&#xff0c;信息安全无疑是保障个人隐私、企业运营和国家安全的基石。我们依赖密码学来保护敏感信息&#xff0c;从在线银行交易到机密军事通信&#xff0c;从医疗记录的存储到云计算中的数据传输&#xff0c;传统密码学为我们构筑起一道抵御恶意攻击的防线。…

Android 获取 UserAgent (UA) 的三种方式深度解析:差异、风险与最佳实践

引言 在 Android 开发中&#xff0c;获取 UserAgent (UA) 字符串是常见需求&#xff0c;尤其涉及网络请求和 WebView 交互时。开发者通常使用三种方式获取 UA&#xff1a; new WebView(context).getSettings().getUserAgentString()WebSettings.getDefaultUserAgent(context)…

Apache IoTDB 全场景部署:跨「端-边-云」的时序数据库 DB+AI 实战

时序数据正成为现代工业物联网的核心资产,从设备传感器到业务分析,数据需跨越端、边、云多个层级。本文将深入探讨 **Apache IoTDB** 如何实现全场景统一时序数据管理,并融合AI能力实现智能决策。 --- ### 一、为什么需要「端-边-云」协同? 在工业物联网场景中: - **端侧…

某地渣库边坡自动化监测服务项目

1. 项目简介该矿山主要从事稀有金属钽、铌及合金等的研发、生产、销售和进出口业务。具有科学的管理理念、精良的工艺装备、先进的技术水平、高素质的员工队伍等综合优势&#xff0c;已形成钽、铌金属及其合金材料等主要产业格局。公司产品被广泛应用于电子、通讯、航空、航天、…

redis(2)-java客户端使用(IDEA基于springboot)

一、准备工作首先确保&#xff1a;Linux 服务器上已安装并启动 Redis 服务Redis 已配置允许远程连接&#xff08;修改 redis.conf 文件&#xff09;开发环境&#xff08;IDEA&#xff09;已准备好二、Spring Boot 项目配置 Redis1. 添加依赖在pom.xml中添加 Redis 相关依赖&…

解决 vscode 编辑 markdown 文件时退格键/backspace 删除卡顿问题

文章目录发现问题解决问题发现问题 使用 vscode 编辑 markdown 时&#xff0c;发现有时按下退格键 backspace 后等待很久才会生效&#xff0c;卡顿明显 解决问题 从界面左下角的设置图标&#xff0c;打开 vscode 的键盘快捷键设置页面 Keyboard Shortcuts 搜索 backspace 按…

绿巨人VS Code多开项目单独管理每个项目单独使用一个不限制的augment

绿巨人VS Code多开项目单独管理每个项目单独使用一个不限制的augment 绿巨人VS前言 在AI辅助编程时代&#xff0c;Augment Code作为一款强大的代码助手工具&#xff0c;为开发者提供了智能代码补全、代码生成等功能。然而&#xff0c;免费版本的使用限制&#xff08;通常为每月…

Java 之抽象类和接口

一 、抽象类 1.1 、什么是抽象类&#xff1f; 就是当一个类不能描述具体的对象时&#xff0c;那么这个类就可以写成抽象类。比如说 Animal &#xff0c;我们知道 Animal 不能非常清楚的描述一个具体的动物&#xff0c;所以可以把 Animal 写成抽象类。还有就是我们知道父类中的方…

【运维进阶】WEB 服务器

WEB 服务器 WEB 服务器简介 Web 服务器&#xff08;Web Server&#xff09;是指一种接收客户端&#xff08;如浏览器&#xff09;发送的 HTTP 请求&#xff0c;并返回网页内容或资源的程序或设备。它是万维网&#xff08;WWW&#xff09;的核心组成部分。 Web 服务器的主要功能…