学习一个门技术,就要搞清楚技术发展的来龙去脉,而不是一头扎进最新的源码,不管不顾的学容易被绕晕,事倍功半。特别是 react 有这么多版本,网上的文章也是各个版本的解读都有,稍有不慎,就被带偏
本篇文章意在列出 react16~react 18 版本发布的功能点,让大家了解 react 主要功能点发布的版本,之后在翻阅网上的文章学习源码时,心里就有数了
React 16.0
时间:2017/09/26
- 支持只返回字符串,而不用 DOM 标签包裹
- 支持将自组建渲染到父组件之外的 DOM 中
- 重写底层逻辑,引入 fiber 架构,正在筹划支持以异步渲染,但是没有正式支持
React 16.2
Fragment
。一个虚拟的 react 元素,用来包裹多个并列的子 DOM
React 16.3
- 为不安全的生命周期引入别名,旧生命周期名称和新别名在此版本中都有效
UNSAFE_componentWillMount
,UNSAFE_componentWillReceiveProps
,UNSAFE_componentWillUpdate
- 新的 context API,
context.provider
,context.consumer
createRef
, 在 react 16.3 版本之前,只能使用字符串,或者回调函数获取 DOMforwardRef
,支持高阶组件 ref 转发StrictMode
,用来识别和报告不安全的生命周期
React 16.5
- 增加了对 DevTools 分析器插件的支持。使用 React 实验性性 Profiler API 来手机有关渲染的每个组件的计时信息。和即将推出的 time slicing and suspense 完美适配
React 16.6.0
时间:2018/10/23
React memo
当props
没有改变的是糊,就可以跳过组件 render 阶段,只对函数组件有用。对于类组件,可以使用PuerComponent
或者ShouldComponentUpdate
React.lazy
与Suspense
结合,可以达到代码分割的功能(可以正式使用了)static contextType
可以更方便的,更符合人体工程学地,让开发者在类组件中获取context
内容static getDerivedStateFromError
, 可以在自组件抛出错误的时候,让当前组件可以在render
函数完成之前(commit
阶段)渲染新的 DOM。不同于componentDidCatch
,该函数会在commit
阶段被调用,并且现在不支持在componentDidCatch
中调用setState
- 可以尝试使用不稳定的并发模式功能,通过
ReactDOM.unstable_createRoot
React 16.8
时间:2019/02/06 超级经典的版本
- 增加了 hoos 功能,即可以在函数组件中记录 state
- 在 react-dom/test-utils 中 增加了
act
函数,建议在测试的时候,使用 act 函数的回调函数包裹触发组件序那然和更新的操作代码
React 16.9
- 重命名不安全的生命周期方法。(在 16.3 似乎已经重命名了,为什么这里还要提一嘴)
- 单元测试中,
act
函数支持异步函数了。在 16.8 的 act 函数中,如果使用了异步函数,还是会报警告:An update to SomeComponent inside a test was not wrapped in act(...).
现在不会了 - 性能测试 API
React.Profiler
。 一个(字符串)和一个onRender
回调(函数),每当树中的组件"提交"更新时,React 都会调用它们。其目的是帮助识别应用程序中速度较慢的部分
React 16.13
- 对字符串 ref 使用方法弃用,并进行警告
- 弃用
React.createFactory
- 启用含有前缀的别名:
ReactDOM.unstable_createPortal
,在 React 16.0 发布的时候,就已经支持了不含前缀的 API
React 17.0
时间:2020/10/20 还是没有正式支持 concurrent 模式
没有新功能,使用 React 17.0.0,相当于享受到了 react 16 版本所有的功能,并且没有额外的大功能。这是一个垫脚石版本
不过还是有些小更新的:
- DOM 事件挂在 React 根 DOM 上,而不是 document 上。可以在一个页面上放多个 react 项目了。并且之前在 react 回调函数中调用
e.stopProgation()
,对直接绑定在document
上的原生事件无效,现在可以了。如果还是需要监听在document
上的事件,可以考虑使用capture
。 - 删除了事件池,即在事件处理中的异步获取 e 对象的属性,将会失败
- 在
forwardRef
和memo
中返回undefined
报错。在 react 16 版本中,只会对类和函数组件报错
React 18 Alpha
2021/06/08
- 已经开始开发 React 18 版本,并且发布 Alpha
- 将会采用自动批处理,不需要手动调用特别 API
- 引入新
API:startTransition
在 react 18 中,并不会全部采用并发模式,为了能够让开发者不改动代码,或者最少的更改,直接升级 React18,只针对其中个别 API 采用了并发渲染。所以React 18 中的并发性是可选的
并发模式是指什么?指低优先级的任务会被高优先级的任务打断,等高优先级任务执行完了,低优先级任务会继续执行。startTransition
就是这样一个 API,里面包裹的任务被赋予了低优先级
React 18
2020/03/29 正式发布
- 自动批处理。在 react18 之前,
promise
,setTimeout
,原生应用的事件处理程序,都不会被批量处理;但现在这些更新内容都会自动批处理 startTransition
过渡更新,将任务区分为紧急和非紧急的更新- 支持了服务端的
Suspense
- 新创建根节点的方法,
ReactDOM.createRoot()
- 新严格模式的行为,会对新挂载组件挂载两次
- 增加了新 Hook,
useId
,useTransition
,useDeferredValue
,useSyncExternalStore
,useInsertionEffect
总结
说了很多年的并发模式和 Suspence 终于实现了,真不容易。
看完本篇文章,你是否和我一样,有很大的收获呢?