React 新特性 03

前言:

       本系列文章主要以知识总结为主及梳理,不是面试题,主要目的是方便自己复习以及为大家提供便利,所以大部分知识点来源于网上,侵权联系删除。如有不对的地方欢迎大家评论区批评指正,一起进步!


正文

     去年3月份,React 18正式版发布,也正是放弃了对IE11的支持,如果需要兼容IE11,估计还是要使用17版本


如何使用React18

  • 老项目:把package.json文件中react版本号改成最新的,然后删除node_modules文件,重新
​npm i

yarn
  • 新项目:直接安装最新依赖即可
npm i react react-dom --save

npm i @types/react @types/react-dom -D

react18新特性

1. setState自动批量处理

 a. 在18之前,只有react事件处理函数中,才会自动批量处理,其他情况会进行多次render,其余事件例如setTimeout、document.body.addEventListener('click',()=>{})等都会出现多次渲染
 b. 在18之后这些不是react事件处理的函数也会进行批量渲染,减少render,提高了整体的性能,除非在一个事件中,一个set使用await,一个不用,那这会出现两次render

2. flushSync

a. 如果你不需要批量处理怎么办,那就可以使用flushSync,

<div
onClick={() => {
  flushSync(() => {
    setCount1(count => count + 1);
  });
  // 第一次更新
  flushSync(() => {
    setCount2(count => count + 1);
  });
  // 第二次更新
}}
>

注意:flushSync回调中还是会进行批量处理

3. Reac组件的返回值

a. 在17版本中,如果你需要返回一个空组件,React只允许返回一个null,如果你返回一个undefined,控制台则会在运行的时候抛出一个错误
b. 在18版本中,既支持返回null,也支持返沪undefined,返回undefined也不会导致页面崩溃。但在18版本中的dts文件还是会进行检查,返回undefined会进行报错,你可以忽略这个错误。

4. Strict Mode

a. 我们都知道在使用严格模式时,React会对每个组件进行两次渲染,以便我们观察意想不到的效果,17版本中,React取消了一次渲染的日志,方便阅读
b. 在18版本中,第二次渲染的日志信息显示为灰色,以柔和的方式出现在控制台中

5. Suspense不再需要fallback来捕获

a. Suspense 组件没有提供 fallback 属性,React 就会悄悄跳过它,继续向上搜索下一个边界:

// React 17
const App = () => {
  return (
    <Suspense fallback={<Loading />}> // <--- 这个边界被使用,显示 Loading 组件
      <Suspense>                      // <--- 这个边界被跳过,没有 fallback 属性
        <Page />
      </Suspense>
    </Suspense>
  );
};

export default App;

React 工作组发现这可能会导致混乱、难以调试的情况发生。例如,你正在debug一个问题,并且在没有 fallback 属性的 Suspense 组件中抛出一个边界来测试一个问题,它可能会带来一些意想不到的结果,并且不会警告说它 没有fallback 属性,让你难以定位问题的存在。
b.  React将使用当前组件的 Suspense 作为边界,即使当前组件的 Suspense 的值为 null 或 undefined

6. useId(新增API)

const id = useId();同一个组件在客户端和服务端生成相同的唯一ID,避免hydration 的不兼容,这解决了react17之前中的问题,因为在我们服务器渲染时提供的HTML,是无序的,useId的原理就是每个id代表改组件在组件树中的层级结构。

7. Concurrent Mode(并发模式)

a. Concurrent Mode中文并发模式。他不是一个功能而是一个底层设计
b. 并发模式可帮助应用保持响应,并根据用户设备性能和网速进行适当的调整,该模式通过渲染可中断修复阻塞渲染限制,在CM模式中,React可以同时有多个状态,我们可以理解成,在17版本中从同步不可中断变成了现在的异步可中断

8. Render API 

为了更好管理root节点,18中引入了一个新的API root API,新的root api支持并发模式的渲染(new concurrent renderer),它允许你进入并发模式。
  a. 挂载组件时

// React 17
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

const root = document.getElementById('root')!;

ReactDOM.render(<App />, root);

// React 18
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = document.getElementById('root')!;

ReactDOM.createRoot(root).render(<App />);


   b. 卸载组件时

// React 17
ReactDOM.unmountComponentAtNode(root);

// React 18
root.unmount();

备注:开启了并发模式并不是开启了并发更新,17版本中的确是这样,在18中,不在有多种模式,而是以是否使用并发特性,作为是否开启并发更新的依据。

从架构的方面看:

● v15以前:采用Stack架构,不可中断的递归方式
● v16 v17: 采用的Fiber架构,中断可遍历,未开启并发更新,
● v18:采用的Fiber架构,中断可遍历,默认情况下未开启并发更新,但是可以通过Render API 开启并发模式,和并发更新
开启并发模式后有两个新的api
● startTransition
● useDeferredValue
如果有兴趣的可以自行查阅

仅仅是本人的一些学习笔记,如有错误,欢迎一起交流。


题外话: 

​最近朋友开发了个副业网站(https://gaoqian.xwbdktzm.top/#/),分享给准备做副业的铁子们,里面有各样的网创项目,感兴趣的可以看下,如果进不去的可以换个网络。如果觉得用不着的直接忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值