一、新弃用
重命名 Unsafe 生命周期方法
新的 UNSAFE_ 前缀将帮助具有问题的组件在代码在 review 和 debugging 期间脱颖而出
1. `componentWillMount` → `UNSAFE_componentWillMount`
2. `componentWillReceiveProps` → `UNSAFE_componentWillReceiveProps`
3. `componentWillUpdate` → `UNSAFE_componentWillUpdate`
弃用 javascript: URLs
以 javascript: 开头的 URL 很容易遭受攻击,因为它很容易意外在标签中(`<a href>`)引入未经处理的输出,造成安全漏洞。
```
const userProfile = {
website: "javascript: alert('you got hacked')",
};
// This will now warn:
<a href={userProfile.website}>Profile</a>
```
在 React 16.9 中,这种模式将继续有效,但它将输出一个警告,如果你逻辑上需要使用 javascript: 开头的 URL,请尝试使用 React 事件处理程序代替。(万不得已,你可以使用 dangerouslySetInnerHTML 来规避保护,但仍然是不鼓励使用的并且往往会导致安全漏洞。)
在未来的主要版本中,如果遇到 javascript: 形式的 URL,React 将抛出错误
弃用 “Factory” 组件
在用 Babel 编译 JavaScript 类流行前,React 支持 “factory” 组件,它使用 render 方法返回一个对象。
```
function FactoryComponent() {
return { render() { return <div />; } }
}
```
这种模式令人困惑,因为它看起来太像一个函数组件,但它不是一个。(函数组件只会返回像上述示例中的` <div />` )。
这种模式几乎从未在外部使用过,并且支持它会导致 React 变大、变慢。因此,我们在 16.9 中弃用此模式,并且遇到时,输出警告。如果你在项目中依赖此组件,可以添加 FactoryComponent.prototype = React.Component.prototype 作为解决方法。或者,你可以将它转换为 class 组件或函数组件。
二、新特性
- 用于测试的一部函数 act()
- 使用 <React.Profiler> 进行性能评估
三、显著的 bug 修复
- 在
<Suspense> 组件中调用 findDOMNode() 造成崩溃,已修复
- 保存已删除的子树导致内存泄漏,已修复
- 在
useEffect 中,使用 setState 引起的循环引用,现在会输出错误(这与在 class 组件中的 componentDidUpdate 使用 setState 导致的错误一致)