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

2022-12-08 0 602

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

日前 React 18 已经正式正式宣布正式正式宣布发布了,增添了许多令人激动的新优点。在这个版中,React 通过其改良的图形控制系统增添了mammalian潜能,并在此此基础上构筑了切换或手动格式化等操控性进一步增强优点。

责任编辑将如是说那些优点的监督机制,和它对 React 开发者有什么样协助。

正式正式宣布正式正式宣布发布成功之路

在深入细致介绍所有优点以后,我们先来简述一下 React 18 正式正式宣布发布另一面的整座操作过程,因为与以后的版较之这一次的正式正式宣布发布历经非常独有。React 17 并没有增添许多新优点。不过它改良了许多此基础模块,全力支持新 React 优点的点对点渐进式选用,进而为未来的预览打下了此基础。那些更动的效用现在就充分体现在了 React 18 中。

React 正式正式宣布发布操作过程中最显著的变动是与非官方 alpha 版一起,正式宣布新设立的 React 组成员(WG)。该组成员的最终目标是搜集源自街道社区的意见反馈,并协助生态系为将要来临的变动搞好预备。此外,它是有关 React 外部工作的重要知

非常感谢 React 17 的改良和组成员的资金投入,React 18 最后成为了一个具有多样优点的版,却只有小量、关键性更动。

关键性更动

由于捷伊mammalian优点是渐进式网络连接并按需资金投入使用的,React 18 中的重大更动仅指几个单纯的 API 更动,和对 React 中数个犯罪行为的灵活性和连续性的一些改良。

应用程序图形 API

最引人瞩目的更动之一是捷伊,暗含createRoot()的root API。它意在代替原有的render()表达式,提供更快的消化控制系统建筑学并资金投入使用捷伊mammalian图形优点。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 也发生了变动。

// 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 的问题,图形回调已经一去不复返了。替代选择(虽然不是一对一的代替)是顶部模块外部的一个效用:

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”); constroot = createRoot(container); root.render(<App />);

手动格式化

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

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()表达式来强制立即刷新更动。

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 将测试模块对可重用状态的弹性,模拟一系列的挂载和卸载犯罪行为。它意在让你的代码为将要推出的优点(可能以<Offscreen>模块的形式)搞好预备,这将在模块的挂载周期中保留这个状态。

虽然它肯定会在未来提供更快的操控性,但就目前而言,资金投入使用 StrictMode 时必须要考虑这个事情。

其他更动

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

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

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

mammalian的 React

mammalian图形器是 React 图形控制系统的一项幕后优点。它允许mammalian图形,即同时在后台预备数个版的 UI。这意味着更快的操控性和更平滑的状态切换。

虽然mammalian似乎只是一个实现细节,但其实它是大多数新优点的动力源泉。事实上,只有当你使用其中一种优点(如 transition、Suspense 或流式 SSR)时,才会资金投入使用mammalian图形。这就是为什么介绍mammalian图形的工作监督机制是非常重要的。

Transition

Transition是由mammalian图形提供全力支持的新优点之一。它意在与原有状态管理 API 一起使用,以区分紧急和非紧急状态预览。通过这种方式,React 知道什么样预览需要优先考虑,什么样预览需要在后台通过mammalian图形预备。

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

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

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()表达式可用——虽然它不会通知你切换的进度。

import { startTransition } from “react”; // …startTransition(() => { // Transition updates }); // …

Suspense 预览

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

import { Suspense } from “react”; // … const App = () => { const [value, setValue] = useState(“a”); consthandleClick =() => { setValue(“b”); }; return ( <> <Suspense fallback={<Loader />}> {value === “a” ?<A /> : <B />} </Suspense> <Button onClick={handleClick}>B</Button> </> ); };

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

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(),你仍然可以逐步选用mammalian图形,因为它只有在你使用它的优点时才会资金投入使用。总体而言,迁移操作过程应该很顺利,甚至会是一桩乐事。

React 的未来

React 18 增添了许多新

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

原文链接:https://blog.openreplay.com/react-18-features-breakdown

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务