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

React 19有哪些新特性?

写在前面

2024.12.5,React 团队在 react.dev/blog 上发表了帖子 react.dev/blog/2024/1… React 19 正式进入了 stable 状态
React 团队介绍了一些新的特性和 Breaking Changes,并提供了升级指南,

React 19: 新更新、新特性和新Hooks

React 19是React框架的最新版本,带来了许多令人兴奋的新更新、新特性和新Hooks。这些改进旨在提高开发效率、增强性能和简化代码结构。在本文中,我们将详细介绍React 19的主要更新和新特性,并提供实际的例子来帮助你更好地理解它们。

1. Concurrent React

Concurrent React是React 19中最重要的更新之一。它允许React在后台渲染多个版本的UI,以便在需要时快速切换。这意味着你的应用程序可以更快地响应用户输入和网络请求,提供更流畅的用户体验。

1.1 Suspense for Data Fetching

Suspense是Concurrent React的核心概念之一。它允许你在等待异步数据时显示一个加载指示器,而不是阻塞整个UI。以下是一个使用Suspense进行数据获取的示例:

import { Suspense } from 'react';function ProfilePage() {return (<Suspense fallback={<div>Loading...</div>}><ProfileDetails /></Suspense>);
}function ProfileDetails() {const user = useAsyncData(() => fetchUser());return <div>{user.name}</div>;
}function useAsyncData(loaderFn) {const [data, setData] = useState(null);const [error, setError] = useState(null);const [loading, setLoading] = useState(true);useEffect(() => {setLoading(true);loaderFn().then((data) => {setData(data);setLoading(false);}).catch((error) => {setError(error);setLoading(false);});}, [loaderFn]);if (loading) throw new Promise(() => {});if (error) throw error;return data;
}

在这个例子中,ProfileDetails组件使用useAsyncData Hook来获取用户数据。如果数据还在加载中,useAsyncData会抛出一个Promise,触发Suspense机制并显示加载指示器。

1.2 useTransition Hook

useTransition Hook是另一个重要的Concurrent React特性。它允许你在进行昂贵的UI更新时,暂停其他更新,以避免阻塞用户输入。以下是一个使用useTransition Hook的示例:

import { useTransition } from 'react';function SearchResults({ query }) {const [isPending, startTransition] = useTransition();const results = useSearchResults(query);return (<div>{isPending? (<div>Loading...</div>) : (<ul>{results.map((result) => (<li key={result.id}>{result.title}</li>))}</ul>)}</div>);
}

在这个例子中,SearchResults组件使用useTransition Hook来暂停其他更新,直到搜索结果加载完成。

2. Server Components

Server Components是React 19中引入的一种新型组件类型。它们允许你在服务器端渲染UI,并将其发送到客户端。这可以提高性能和SEO友好性。以下是一个简单的Server Component示例:

import { server } from 'react';function ServerComponent() {return <div>Hello, Server!</div>;
}export default server(ServerComponent);

在这个例子中,ServerComponent是一个Server Component,它将在服务器端渲染并发送到客户端。

3. Automatic Batching

在React 19中,所有的state更新都将被自动批处理。这意味着如果你在一个事件处理程序中多次调用setState,React将只会执行一次重新渲染操作。这可以大大提高性能。以下是一个示例:

function MyComponent() {const [count1, setCount1] = useState(0);const [count2, setCount2] = useState(0);function handleClick() {setCount1(count1 + 1);setCount2(count2 + 1);}return (<div><p>Count 1: {count1}</p><p>Count 2: {count2}</p><button onClick={handleClick}>Increment</button></div>);
}

在这个例子中,handleClick函数中有两个setState调用。但是,由于自动批处理,React只会执行一次重新渲染操作。

4. New Hooks

React 19还引入了一些新的Hooks,包括:

4.1 useId Hook

useId Hook生成一个唯一的ID,用于标识DOM元素或其他用途。以下是一个示例:

import { useId } from 'react';function MyComponent() {const id = useId();return <div id={id}>Hello, World!</div>;
}

在这个例子中,useId Hook生成一个唯一的ID,并将其分配给div元素的id属性。

4.2 useSyncExternalStore Hook

useSyncExternalStore Hook允许你在React组件中使用外部存储(如Redux或MobX)。以下是一个示例:

import { useSyncExternalStore } from 'react';
import { store } from './store';function MyComponent() {const state = useSyncExternalStore(store.subscribe, store.getState, store.getSnapshot);return <div>{state.count}</div>;
}

在这个例子中,useSyncExternalStore Hook订阅了Redux存储的更新,并在组件中使用最新的状态。

结论

React 19带来了许多令人兴奋的新更新、新特性和新Hooks。这些改进将帮助你构建更高效、更流畅和更可维护的React应用程序。通过使用Concurrent React、Server Components、自动批处理和新的Hooks,你可以提高你的开发效率和应用程序的性能。

相关文章:

React 19有哪些新特性?

写在前面 2024.12.5&#xff0c;React 团队在 react.dev/blog 上发表了帖子 react.dev/blog/2024/1… React 19 正式进入了 stable 状态 React 团队介绍了一些新的特性和 Breaking Changes&#xff0c;并提供了升级指南&#xff0c; React 19: 新更新、新特性和新Hooks Reac…...

视频生成缩略图

文章目录 视频生成缩略图使用ffmpeg 视频生成缩略图 最近有个需求&#xff0c;视频上传之后在列表和详情页需要展示缩略图 使用ffmpeg 首先引入jar包 <dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><vers…...

页面无滚动条,里面div各自有滚动条

一、双滚动条左右布局 实现效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Doc…...

DIY-ESP8266移动PM2.5传感器-带屏幕-APP

本教程将指导您制作一台专业级的空气质量检测仪。这个项目使用经济实惠的ESP8266和PMS5003传感器&#xff0c;配合OLED显示屏&#xff0c;不仅能实时显示PM2.5数值&#xff0c;还能通过手机APP随时查看数据。总成本70元&#xff0c;相比几百的用的便宜&#xff0c;用的心理踏实…...

【Canvas与技法】椭圆画法

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>椭圆的画法 Draft2</title><style type"text/css&quo…...

多核CPU调度是咋搞的?

其实很多情况下都有 这样的疑问 为什么多核CPU用着用着会“躺平”&#xff1f; 为什么手机有 8 核&#xff0c;跑分时性能却不是核心数的翻倍&#xff1f; 答案的钥匙&#xff0c;就藏在多核CPU的调度机制里。 为了更直观地理解&#xff0c;以一个《王者荣耀》游戏服务器为例…...

【Jenkins】pipeline 的基础语法以及快速构建一个 jenkinsfile

Jenkins Pipeline 是 Jenkins 中的一个强大功能&#xff0c;可以帮助你实现自动化构建、测试、部署等流程。Jenkins Pipeline 使用一种名为 Pipeline DSL&#xff08;Domain Specific Language&#xff09;的脚本语言&#xff0c;通常以 Jenkinsfile 形式存在&#xff0c;用于定…...

工作中如何提高技术实力?

点击“硬核王同学”&#xff0c;选择“关注/三连” 福利干货第一时间送达 大家好&#xff0c;我是硬核王同学。 其实这个问题困扰了我很久啊&#xff0c;不知道你们有没有跟我一样。 如何在工作中如何提高技术实力&#xff1f; 随着时间的增加&#xff0c;越来越觉得工作上…...

画图,matlab,

clear;close all;clc;tic;dirOutput dir(*.dat); % 罗列所有后缀-1.dat的文件列表&#xff0c;罗列BDDATA的数据 filenames string({dirOutput.name}); % 提取文件名%% 丢包统计 FILENAMES [""]; LOSS_YTJ [ ]; LOSS_RAD [ ]; LOSS_ETH [ ]…...

Java虚拟机类加载(解析阶段)[虚方法表的生成以及其存在意义]

class字节码文件中的常量池结构详解-CSDN博客Java虚拟机类加载(解析阶段)-CSDN博客...

电子元器件与电路之-MOS管的介绍和作用

一、基本概念 MOS 管&#xff0c;或MOSFET&#xff0c;全称是Metal-Oxide-Semiconductor Field-Effect Transistor&#xff08;金属 - 氧化物 - 半导体场效应晶体管&#xff09;。和三极管利用电流控制电流不同&#xff0c;它是一种利用电场效应来控制电流的半导体器件。和三级…...

python实现word转html

目录 使用mammoth库 使用spire.doc库 使用mammoth库 mammoth库支持将word转为HTML和markdown格式的文件。 import mammothdef word_html(word_file):html_save_name fr{word_file.split(.)[0]}.htmlwith open(word_file, rb) as f:data mammoth.convert_to_html(f)with o…...

nginx模块ngx-fancyindex 隐藏标题中的 / 和遇到的坑

首先下载nginx源码&#xff0c;编译时加上 --add-module/usr/local/src/ngx-fancyindex/ 例如 &#xff1a; ./configure --prefix/usr/local/nginx --with-select_module --with-poll_module --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module…...

第二十四天 循环神经网络(RNN)LSTM与GRU

LSTM&#xff08;长短期记忆网络&#xff09;和GRU&#xff08;门控循环单元&#xff09;是两种流行的循环神经网络变体&#xff0c;它们被设计来解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。这两种网络都通过引入门控机制来控制信息的流动&#xff0c;从而能…...

RocketMQ如何保证消息顺序?

大家好&#xff0c;我是锋哥。今天分享关于【RocketMQ如何保证消息顺序?】面试题。希望对大家有帮助&#xff1b; RocketMQ如何保证消息顺序? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 作为一个分布式消息中间件&#xff0c;提供了高吞吐、低延迟的…...

LabVIEW实现GSM/GPRS通信

目录 1、GSM/GPRS通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联…...

关于如何做技术文档

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它是知识传承的载体&#xff0c;是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。然而&#xff0c;打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼&#xff1f;是否纠结…...

基于多尺度动态卷积的图像分类

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

RK3576 介绍

RK3576 介绍 1 介绍1.1 概述1.2 RK3576、RK3588、RK3568 和 RK3399 的参数对比 2 DataSheet2.1 RK35762.2 RK35882.3 RK35682.4 RK3399 参考 1 介绍 1.1 概述 ARM 64位高性能八核通用处理器&#xff0c;丰富的PCIE/USB3.0/SATA/GMAC等各类高速及CAN FD/DSMC/UART/SPI/I2C/I3C…...

如何评估并持续优化AI呼出机器人的使用效果

如何评估并持续优化AI呼出机器人的使用效果 作者&#xff1a;开源呼叫中心FreeIPCC 随着人工智能技术的发展&#xff0c;AI呼出机器人在企业中的应用越来越广泛。这些智能系统不仅提高了工作效率、降低了成本&#xff0c;还改善了客户体验。然而&#xff0c;要确保AI呼出机器…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...