前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >不再支持 IE,React 新特性详细解读

不再支持 IE,React 新特性详细解读

作者头像
深度学习与Python
发布于 2022-06-13 02:51:27
发布于 2022-06-13 02:51:27
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

作者 | Arek Nawo

翻译 | 王强

策划 | 闫园园

近日,React 18 已经正式发布了,带来了许多令人兴奋的新特性。在这个版本中,React 通过其改进的渲染系统带来了并发能力,并在此基础上构建了转换或自动批处理等性能增强特性。本文将介绍这些特性的机制,以及它们对 React 开发人员有哪些帮助。

正式发布之路

在深入了解所有特性之前,我们先来回顾一下 React 18 发布背后的整个过程,因为与之前的版本相比这一次的发布经历非常独特。React 17 并没有带来很多新特性。然而它改进了很多基础组件,支持新 React 特性的无缝渐进采用,从而为未来的更新奠定了基础。这些更改的效果现在就体现在了 React 18 中。

React 发布过程中最显著的变化是与官方 alpha 版本一起,宣布新成立的 React 工作组(WG)。该小组的目标是收集来自社区的反馈,并帮助生态系统为即将到来的变化做好准备。此外,它是关于 React 内部工作的重要知识来源。

感谢 React 17 的改进和工作组的投入,React 18 最终成为了一个具有丰富特性的版本,却只有少量、重大更改。

重大更改

由于新的并发特性是渐进适配并按需启用的,React 18 中的重大更改仅限于几个简单的 API 更改,以及对 React 中多个行为的稳定性和一致性的一些改进。

客户端渲染 API

最引人注目的更改之一是新的,带有 createRoot() 的 root API。它旨在替换现有的 render() 函数,提供更好的人体工程学并启用新的并发渲染特性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createRoot } from "react-dom/client";
import App from "App";

const container = document.getElementById("app");
const root = createRoot(container);
root.render(<App />);

请注意,这个新的 API 现在已从 react-dom/client 模块导出。

卸载和水合 API 也发生了变化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Unmount component at DOM node:
// ...
root.unmount();

// Hydration
import { hydrateRoot } from "react-dom/client";
// ...

const container = document.getElementById("app");
const root = hydrateRoot(container, <App tab="home" />);

由于使用 Suspense 时会出现不正确 timing 的问题,渲染回调已经一去不复返了。替代选择(虽然不是一对一的替换)是顶部组件内部的一个效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createRoot } from "react-dom/client";
import { useEffect } from "react";
import App from "App";

const App = () => {
  useEffect(() => {
    console.log("render callback");
  });

  return <div></div>;
};
const container = document.getElementById("app");
const root = createRoot(container);
root.render(<App />);

自动批处理

createRoot() API 还是 React 18 中另一个改进的入口——自动批处理。在 React 的早期版本中,状态更新在 React 事件侦听器中完成时已经批量处理了,以优化性能并避免重渲染。从 React 18 开始,状态更新也将被安排到其他地方——比如在 Promise、setTimeout 回调和原生事件处理程序中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const App = () => {
  const handleClick = () => {
    setA((a) => a + 1);
    setB((b) => b - 1);
    // Updates batched - single re-render
  };

  setTimeout(() => {
    setA((a) => a + 1);
    setB((b) => b - 1);
    // New (v18): Updates batched - single re-render
  }, 1000);

  // ...
};

这个更改虽然一般来说符合人们期望,也挺有用,但可能是破坏性的。如果你的代码依赖于在分开的状态更新之间重渲染的组件,那么你必须使其适应新的批处理机制,或使用 flushSync() 函数来强制立即刷新更改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { flushSync } from "react-dom";
// ...

const handleClick = () => {
  flushSync(() => {
    setA((a) => a + 1);
  });
  // Re-render
  flushSync(() => {
    setB((b) => b - 1);
  });
  // Re-render
};

严格模式更新

React 18 带来了大把新特性,此外还有很多新特性正在路上。为了让你的代码为此做好准备,StrictMode 变得更加严格了。最重要的是,StrictMode 将测试组件对可重用状态的弹性,模拟一系列的挂载和卸载行为。它旨在让你的代码为即将推出的特性(可能以组件的形式)做好准备,这将在组件的挂载周期中保留这个状态。

虽然它肯定会在未来提供更好的性能,但就目前而言,启用 StrictMode 时必须要考虑这个事情。

其他更改

除了以上提到的更改之外,根据你的 React 代码库,你可能还会发现其他一些更改。

值得一提的是,React 18 将不再支持 Internet Explorer,因为 React 18 现在依赖很多现代浏览器特性,如 Promise 或 Object.assign。鉴于微软将在今年 6 月 15 日停止对该浏览器的支持,React 和其他 JS 库也将停止对它的支持是很自然的。那些仍然需要支持 IE 的人们将不得不继续使用 React 17。

其余的更改与一些 React 行为的稳定性和一致性有关,不太可能影响你的代码库。不管怎样,你可以在此处找到完整更改列表。

并发的 React

并发渲染器是 React 渲染系统的一项幕后特性。它允许并发渲染,即同时在后台准备多个版本的 UI。这意味着更好的性能和更平滑的状态转换。

虽然并发似乎只是一个实现细节,但其实它是大多数新特性的动力源泉。事实上,只有当你使用其中一种特性(如 transition、Suspense 或流式 SSR)时,才会启用并发渲染。这就是为什么了解并发渲染的工作机制是非常重要的。

Transition

Transition 是由并发渲染提供支持的新特性之一。它旨在与现有状态管理 API 一起使用,以区分紧急和非紧急状态更新。通过这种方式,React 知道哪些更新需要优先考虑,哪些更新需要在后台通过并发渲染准备。

要知道何时使用 transition,你必须更好地了解用户是如何与你的应交互的。例如,在字段中键入或单击按钮是用户期望立即获得响应的操作——响应可能是出现在文本字段中的一个值,或是要打开的某个菜单。但对于搜索、加载或处理数据(例如搜索栏、图表、过滤表等)这些事情,用户也会期望它们需要一些时间来完成。后者就是你使用 transition 的场景了。

你可以使用 useTransition() 钩子来创建一个 transition。这个钩子返回一个函数来启动一个 transition,还有一个挂起的指示器来通知你 transition 的进度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useTransition, useState } from "react";

const App = () => {
  const [isPending, startTransition] = useTransition();
  const [value, setValue] = useState(0);

  function handleClick() {
    startTransition(() => {
      setValue((value) => value + 1);
    });
  }

  return (
    <div>
      {isPending && <Loader />}
      <button onClick={handleClick}>{value}</button>
    </div>
  );
};

你在 startTransition() 回调中提交的任何状态更新都将被标记为 transition,从而使其他更新具有优先权。如果你不能使用这个钩子,还有一个单独的 startTransition() 函数可用——虽然它不会通知你转换的进度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { startTransition } from "react";
// ...
startTransition(() => {
  // Transition updates
});
// ...

Suspense 更新

与 React Suspense 结合使用时,transition 的效果是最好的。由于一些改进,Suspense 现在可以很好地与并发渲染集成、在服务器上工作,并且可能很快支持 lazy() 加载组件之外的用例。与 transition 一起使用时,Suspense 将避免隐藏现有内容。考虑以下示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Suspense } from "react";
// ...

const App = () => {
  const [value, setValue] = useState("a");
  const handleClick = () => {
    setValue("b");
  };

  return (
    <>
      <Suspense fallback={<Loader />}>
        {value === "a" ? <A /> : <B />}
      </Suspense>
      <Button onClick={handleClick}>B</Button>
    </>
  );
};

在状态改变时,lazy() 加载的组件将触发 Suspense,导致 fallback 元素的渲染。如果你将状态更改标记为一个 transition,React 将知道它应该在后台准备新视图,同时仍保持当前视图可见。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Suspense, useTransition } from "react";
// ...

const App = () => {
  const [value, setValue] = useState("a");
  const [isPending, startTransition] = useTransition();
  const handleClick = () => {
    startTransition(() => {
      setValue("b");
    });
  };

  return (
    <>
      <Suspense fallback={<Loader />}>
        <div style={{ opacity: isPending ? 0.7 : 1 }}>
          {value === "a" ? <A /> : <B />}
        </div>
      </Suspense>
      <Button onClick={handleClick}>B</Button>
    </>
  );
};

现在,即使在处理 transition 时视图不会改变,你仍然可以使用过渡指示器来向用户提供反馈,例如设置容器不透明度。将上述改进与未来 Suspense 的新能力(与 lazy() 加载的组件之外的异步任务一起使用)相结合,意味着 Suspense 将成为 React 最强大的特性之一。

服务端渲染改进

除了 Suspense 支持之外,React 的 SSR 方面还有很多其他变化。将 Suspense 与 SSR 流式传输和懒惰水合(lazy hydration)相结合,意味着你的服务端渲染应用将尽快水合并可用。不仅如此,零打包体积的服务端组件即将到来。它们目前处于试验阶段,但可能会在以后的次要版本中进入稳定状态。使用它们时,你将能减少提供给客户端的 JS 代码,甚至进一步优化 React 应用程序的性能和加载时间。

渐进采用

由于前文提到的 React 17 的多个更改,即使你的代码库很大,你也应该能够轻松地逐步采用 React 18。你不仅可以在应用程序的选定部分中使用新版本,还可以从 render() 迁移到 createRoot(),来一步步选择加入新的特性和行为。最重要的是,即使使用的是 createRoot(),你仍然可以逐步采用并发渲染,因为它只有在你使用它的特性时才会启用。总体而言,迁移过程应该很顺利,甚至会是一桩乐事。

React 的未来

React 18 带来了许多新特性,你也可以看到一些即将出现的新事物。服务器组件、用于数据获取的 Suspense,和组件渲染都是接下来的新特性的一部分。

React 正在与它的整个生态系统一起发展,我迫不及待地想看看接下来会发生什么!

原文链接:

https://blog.openreplay.com/react-18-features-breakdown

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 InfoQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
React 18快速指南和核心概念解释
React 18为并发渲染api奠定了基础,未来的React特性将在此基础上构建。这个版本主要关注性能的改进和渲染引擎的更新。
小柔
2023/10/14
4500
React 18快速指南和核心概念解释
用案例的方式解释 React 18 新特性——并发渲染、自动批处理等
React 18 于 2022 年 3 月发布。这个版本侧重于性能改进和渲染引擎的更新。同时,React 18 为并发渲染奠定了基础,未来的 React 功能将在此基础上构建。
前端修罗场
2023/10/07
1.2K0
用案例的方式解释 React 18 新特性——并发渲染、自动批处理等
React 18 带给我们的惊喜
1、前言 React 18 的 alpha 版已经发布有段时间了,之前学习后由于没有开发实践结合去思考,对 React 18 的意义认识并不深刻。前段时间做了一些老旧项目迁移,发现复杂项目下每次渲染都要精心调整,否则就会有麻烦的性能或体验瑕疵,而 React 内部渲染顺序和优先级很难调整,就导致总体体验差了点意思。回顾了 React 18 的三个新特性,有种久旱逢甘雨的欣喜。 团队内部推行了 React hook,好处就不在这里赘述了,也陆续收到了一些负面反馈。其一就是 React hook 更加趋向面向数
用户1097444
2022/06/29
7820
React 18 带给我们的惊喜
「React18新特性」深入浅出用户体验大师—transition
在 React 18 中,引进了一个新的 API —— startTransition 还有二个新的 hooks —— useTransition 和 useDeferredValue,本质上它们离不开一个概念 transition 。
用户6835371
2021/11/10
1.9K0
📝  《React性能优化完全手册:从useMemo到并发模式》
React 18的并发模式(Concurrent Mode)不是魔法,而是通过可中断渲染与优先级调度实现流畅交互:
Jimaks
2025/04/28
2400
React 18探秘(上)
React 17 那篇没有任何新特性的博客还历历在目,半年多后,终于等来了 17 铺路许久的 18 发布计划,本来想赶紧看看都有些啥,无奈事情略多,一直拖到现在,最近有点点时间,看看 18 给我们带来了什么。
Teobler
2021/07/08
8700
React 18探秘(上)
详解React的Transition工作原理原理
Transition 是 react18 引入的新概念,用来区分紧急和非紧急的更新。
夏天的味道123
2022/10/18
8570
带你提前理解 React 的下一步:Concurrent Mode 与 Suspense
10 月刚在 Las Vegas 结束的 React Conf 2019带来许多关于 Concurrent Mode、Suspense for Data Fetching 的消息,如果你对于这些议题感到好奇,但还没有时间去吸收,那这篇文章或许值得一读。
苏南
2020/12/16
1.1K0
带你提前理解 React 的下一步:Concurrent Mode 与 Suspense
React18 带来了什么
经历了v17的平缓过渡,React 3月29日正式发布了React v18版本。这个版本带来了一些十分重要的能力。但大家伙不必担心学不动,这个版本无破坏性更新,hooks 还在。以下是核心功能更新。
jadeCarver
2022/08/06
7840
精读《React 18》
React 18 带来了几个非常实用的新特性,同时也没有额外的升级成本,值得仔细看一看。
黄子毅
2022/03/15
1.6K0
React Suspense 进阶用法,结合 useTransition 使用
我们在前面学习了 Suspense。Suspense 的 fallback 与子组件内容的显示是一个互斥关系。因此,当我们在请求过程中,需要显示 Loading 时,内容就会被隐藏掉。
用户6901603
2024/05/17
6710
React Suspense 进阶用法,结合 useTransition 使用
来来来,尝试一下 React 18 !
React 团队最近发布了 React 18 的 alpha 版本。这个版本主要是增强 React 应用程序的 并发渲染 能力,你可以在 React 18 中尝试体验以下几个新特性:
桃翁
2021/06/22
1.4K0
来来来,尝试一下 React 18 !
听说你还不知道React18新特性?看我给你整明白!
目前react的最新版本是18.2.0。React 团队在 2022 年 3 月 29 日正式发布了 React 的第 18 个版本 是 React 框架的最新版本,它主要着眼于解决 React 应用在性能、稳定性、开发体验等方面的问题。本文将介绍 React 18 的升级内容、新特性、新的 API、底层逻辑更新等方面的内容,并通过示例展示其使用效果。 我将在这篇文章里简单介绍 React 18 的新特性,React Concurrent Mode(并发模式)的实现,以及简要的升级指南。
用户6297767
2023/11/21
2.1K0
听说你还不知道React18新特性?看我给你整明白!
React 18 RC 版本发布啦,生产环境用起来!
大家好,我是 ConardLi,今天给大家带来一个令人兴奋的消息:React 18 RC 版本发布啦!
ConardLi
2022/04/08
1.1K0
React 18 RC 版本发布啦,生产环境用起来!
如何升级到 React 18
今天,我们发布了 React 18 RC 版本。正如我们在 React Conf 上分享的那样,React 18 基于 concurrent 模式,带来了更多能力,同时提供了渐进升级的方法。在这篇文章中,我们会一步一步的带您升级到 React 18。
PHP开发工程师
2022/03/25
2.3K0
React19 为我们带来了什么?
截止今日 React 团队已经在 NPM 上发布了关于 19.0.0 版本的 Release Candidate。
19组清风
2024/06/17
4150
React19 为我们带来了什么?
useTransition真的无所不能吗?🤔
之前通过React 并发原理讲解了React如何实现原理。但是在应用层面涉及的不多,而今天我们就对如何正确的使用并发渲染做进一步的梳理。而提起并发渲染,useTransition和useDeferredValue是我们绕不过去的两座大山。
前端柒八九
2023/10/27
5240
useTransition真的无所不能吗?🤔
你必须了解的 React 18 新特性
由于更新经常包括完全改变特性的修改,甚至删除某些特性并添加其他特性,一些开发人员可能会发现很难在不同版本的库之间进行转换。最好使用库的最新版本,以获得尽可能好的性能。
用户8921923
2022/10/24
3.7K0
你必须了解的 React 18 新特性
React 18 如何提升应用性能
最近,无意中看到一篇关于React 18的文章,翻看之后,发现很多东西都是React官网没有细讲的,并且发现有些点也是在实际开发中可以实践和应用的.
前端柒八九
2023/09/10
5040
React 18 如何提升应用性能
concurrent 模式 API 参考(实验版)
本章节为 concurrent 模式的 React API 参考。如果你想找导览,请查看 concurrent UI 模式。
Fonkie
2019/11/30
2.5K0
相关推荐
React 18快速指南和核心概念解释
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验