react v16.3终于出来了,最大的变更莫过于生命周期去掉了如下三个html
同时为了弥补失去上面三个周期的不足又加了两个前端
固然,这个更替是缓慢的,在整个16版本里都能无障碍的使用旧的三生命周期,但值得注意的是,旧的生命周期(unsafe)不能和新的生命周期同时出如今一个组件,不然会报错“你使用了一个不安全的生命周期”。react
旧的生命周期十分完整,基本能够捕捉到组件更新的每个state/props/ref,没有什从逻辑上的毛病。安全
可是架不住官方本身搞事情,react打算在17版本推出新的Async Rendering,提出一种可被打断的生命周期,而能够被打断的阶段正是实际dom挂载以前的虚拟dom构建阶段,也就是要被去掉的三个生命周期。bash
生命周期一旦被打断,下次恢复的时候又会再跑一次以前的生命周期,所以componentWillMount,componentWillReceiveProps, componentWillUpdate都不能保证只在挂载/拿到props/状态变化的时候刷新一次了,因此这三个方法被标记为不安全。dom
class Example extends React.Component {
static getDerivedStateFromProps(nextProps, prevState) {
// 没错,这是一个static
}
}
复制代码
class Example extends React.Component {
getSnapshotBeforeUpdate(prevProps, prevState) {
// ...
}
}
复制代码
初始化state — Initializing state异步
请求数据 — Fetching external dataasync
添加事件监听 — Adding event listeners (or subscriptions)ide
根据props更新state — Updating state based on props性能
if (this.props.currentRow !== nextProps.currentRow) {
...
}
复制代码
取而代之的是,额外写一个state来记录上一个props (` ^ ‘)
if (nextProps.currentRow !== prevState.lastRow) {
return {
...
lastRow: nextProps.currentRow,
};
// 不更新state
return null
}
复制代码
触发请求 — Invoking external callbacks
props更新引发的反作用 — Side effects on props change
// 在didUpdate中根据props更新的确很不适应
// props变了也是能够触发update的
componentDidUpdate(prevProps, prevState) {
if (this.props.isVisible !== prevProps.isVisible) {
logVisibleChange(this.props.isVisible);
}
}
复制代码
props更新时从新请求 — Fetching external data when props change
// old
componentWillReceiveProps(nextProps) {
if (nextProps.id !== this.props.id) {
this.setState({externalData: null});
this._loadAsyncData(nextProps.id);
}
}
复制代码
// new
static getDerivedStateFromProps(nextProps, prevState) {
// Store prevId in state so we can compare when props change.
if (nextProps.id !== prevState.prevId) {
return {
externalData: null,
prevId: nextProps.id,
};
}
// No state update necessary
return null;
}
componentDidUpdate(prevProps, prevState) {
if (this.state.externalData === null) {
this._loadAsyncData(this.props.id);
}
}
复制代码
在更新前记录原来的dom节点属性 — Reading DOM properties before an update
static getDerivedStateFromProps(nextProps, prevState) {
4. Updating state based on props
7. Fetching external data when props change // Clear out previously-loaded data so we dont render stale stuff
}
constructor() {
1. Initializing state
}
componentWillMount() {
// 1. Initializing state
// 2. Fetching external data
// 3. Adding event listeners (or subscriptions)
}
componentDidMount() {
2. Fetching external data
3. Adding event listeners (or subscriptions)
}
componentWillReceiveProps() {
// 4. Updating state based on props
// 6. Side effects on props change
// 7. Fetching external data when props change
}
shouldComponentUpdate() {
}
componentWillUpdate(nextProps, nextState) {
// 5. Invoking external callbacks
// 8. Reading DOM properties before an update
}
render() {
}
getSnapshotBeforeUpdate(prevProps, prevState) {
8. Reading DOM properties before an update
}
componentDidUpdate(prevProps, prevState, snapshot) {
5. Invoking external callbacks
6. Side effects on props change
}
componentWillUnmount() {
}
复制代码
上面的内容基本就是结合个人一些经验半翻译半总结,有不许确的地方欢迎指正。
对更多细节感兴趣的话能够去看官方文档,https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html
对async-rendering或者对dan小哥哥感兴趣的话能够去看看他在前端大会上的一段小演示:https://reactjs.org/blog/2018/03/01/sneak-peek-beyond-react-16.html