React 16.x 的三大新特性 Time Slicing、Suspense、 hooks
- Time Slicing(解决 CPU 速度问题)使得在执行任务的期间可以随时暂停,跑去干别的事情,这个特性使得 react 能在性能极其差的机器跑时,仍然保持有良好的性能
- Suspense(解决网络 IO 问题)和 lazy 配合,实现异步加载组件。能暂停当前组件的渲染, 当完成某件事以后再继续渲染,解决从 react 出生到现在都存在的「异步副作用」的问题,而且解决得非的优雅,使用的是 T 异步但是同步的写法,这是最好的解决异步问题的方式提供了一个内置函数 componentDidCatch,当有错误发生时,可以友好地展示 fallback 组件; 可以捕捉到它的子元素(包括嵌套子元素)抛出的异常; 可以复用错误组件。
(1)React16.8
加入 hooks,让 React 函数式组件更加灵活,hooks 之前,React 存在很多问题:
-
在组件间复用状态逻辑很难
-
复杂组件变得难以理解,高阶组件和函数组件的嵌套过深。
-
class 组件的 this 指向问题
-
难以记忆的生命周期
-
hooks 很好的解决了上述问题,hooks 提供了很多方法
useState 返回有状态值,以及更新这个状态值的函数 useEffect 接受包含命令式,可能有副作用代码的函数。 useContext 接受上下文对象(从 React.createContext 返回的值)并返回当前上下文值, useReducer useState 的替代方案。接受类型为 (state,action)=> newState 的 reducer,并返回与 dispatch 方法配对的当前状态。 useCalLback 返回一个回忆的 memoized 版本,该版本仅在其中一个输入发生更改时才会更改。纯函数的输入输出确定性 o useMemo 纯的一个记忆函数 o useRef 返回一个可变的 ref 对象,其 Current 属性被初始化为传递的参数,返回的 ref 对象在组件的整个生命周期内保持不变。 useImperativeMethods 自定义使用 ref 时公开给父组件的实例值 useMutationEffect 更新兄弟组件之前,它在 React 执行其 DOM 改变的同一阶段同步触发 useLayoutEffect DOM 改变后同步触发。使用它来从 DOM 读取布局并同步重新渲染
(2)React16.9
- 重命名 Unsafe 的生命周期方法。新的 UNSAFE_前缀将有助于在代码review 和 debug 期间,使这些有问题的字样更突出废弃
- javascrip:形式的 URL。以 javascript:开头的 URL 非常容易遭受攻击,造成安全漏洞。
- 废弃"Factory"组件。 工厂组件会导致 React 变大且变慢。
- act()也支持异步函数,并且你可以在调用它时使用 await。
- 使用 <React.ProfiLer> 进行性能评估。在较大的应用中追踪性能回归可能会很方便
(3)React16.13.0
-
支持在渲染期间调用 setState,但仅适用于同一组件
-
可检测冲突的样式规则并记录警告
-
废弃 unstable_createPortal,使用 CreatePortal
-
将组件堆栈添加到其开发警告中,使开发人员能够隔离 bug 并调试其程序,这可以清楚地说明问题所在,并更快地定位和修复错误。