博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React-新的生命周期(React16版本)
阅读量:6445 次
发布时间:2019-06-23

本文共 3988 字,大约阅读时间需要 13 分钟。

组件生命周期的三个阶段

  1. Mounting(加载阶段)
  2. Updating(更新阶段)
  3. Unmounting(卸载阶段)

旧的生命周期

图片描述

Mounting(加载阶段:涉及6个钩子函数)

constructor()

加载的时候调用一次,可以初始化state

getDefaultProps()

设置默认的props,也可以用dufaultProps设置组件的默认属性。

getInitialState()

初始化state,可以直接在constructor中定义this.state

componentWillMount()

组件加载时只调用,以后组件更新不调用,整个生命周期只调用一次,此时可以修改state

render()

react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行

componentDidMount()

组件渲染之后调用,只调用一次

Updating(更新阶段:涉及5个钩子函数)

componentWillReceivePorps(nextProps)

组件加载时不调用,组件接受新的props时调用

shouldComponentUpdate(nextProps, nextState)

组件接收到新的props或者state时调用,return true就会更新dom(使用diff算法更新),return false能阻止更新(不调用render)

componentWillUpdata(nextProps, nextState)

组件加载时不调用,只有在组件将要更新时才调用,此时可以修改state

render()

react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行

componentDidUpdate()

组件加载时不调用,组件更新完成后调用

Unmounting(卸载阶段:涉及1个钩子函数)

componentWillUnmount()

组件渲染之后调用,只调用一次

组件的基本写法

import React, { Component } from 'react'export default class OldReactComponent extends Component {    constructor(props) {        super(props)        // getDefaultProps:接收初始props        // getInitialState:初始化state    }    state = {    }    componentWillMount() { // 组件挂载前触发    }    render() {        return (            

Old React.Component

) } componentDidMount() { // 组件挂载后触发 } componentWillReceivePorps(nextProps) { // 接收到新的props时触发 } shouldComponentUpdate(nextProps, nextState) { // 组件Props或者state改变时触发,true:更新,false:不更新 return true } componentWillUpdate(nextProps, nextState) { // 组件更新前触发 } componentDidUpdate() { // 组件更新后触发 } componentWillUnmount() { // 组件卸载时触发 }}

新的生命周期

Mounting(加载阶段:涉及4个钩子函数)

constructor()

加载的时候调用一次,可以初始化state

static getDerivedStateFromProps(props, state)

组件每次被rerender的时候,包括在组件构建之后(虚拟dom之后,实际dom挂载之前),每次获取新的props或state之后;每次接收新的props之后都会返回一个对象作为新的state,返回null则说明不需要更新state;配合componentDidUpdate,可以覆盖componentWillReceiveProps的所有用法

render()

react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行

componentDidMount()

组件渲染之后调用,只调用一次

Updating(更新阶段:涉及5个钩子函数)

static getDerivedStateFromProps(props, state)

组件每次被rerender的时候,包括在组件构建之后(虚拟dom之后,实际dom挂载之前),每次获取新的props或state之后;每次接收新的props之后都会返回一个对象作为新的state,返回null则说明不需要更新state;配合componentDidUpdate,可以覆盖componentWillReceiveProps的所有用法

shouldComponentUpdate(nextProps, nextState)

组件接收到新的props或者state时调用,return true就会更新dom(使用diff算法更新),return false能阻止更新(不调用render)

render()

react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行

getSnapshotBeforeUpdate(prevProps, prevState)

触发时间: update发生的时候,在render之后,在组件dom渲染之前;返回一个值,作为componentDidUpdate的第三个参数;配合componentDidUpdate, 可以覆盖componentWillUpdate的所有用法

componentDidUpdate()

组件加载时不调用,组件更新完成后调用

Unmounting(卸载阶段:涉及1个钩子函数)

组件渲染之后调用,只调用一次

Error Handling(错误处理)

componentDidCatch(error,info)

任何一处的javascript报错会触发

组件的基本写法

import React, { Component } from 'react'export default class NewReactComponent extends Component {    constructor(props) {        super(props)        // getDefaultProps:接收初始props        // getInitialState:初始化state    }    state = {    }    static getDerivedStateFromProps(props, state) { // 组件每次被rerender的时候,包括在组件构建之后(虚拟dom之后,实际dom挂载之前),每次获取新的props或state之后;;每次接收新的props之后都会返回一个对象作为新的state,返回null则说明不需要更新state        return state    }    componentDidCatch(error, info) { // 获取到javascript错误    }    render() {        return (            

New React.Component

) } componentDidMount() { // 挂载后 } shouldComponentUpdate(nextProps, nextState) { // 组件Props或者state改变时触发,true:更新,false:不更新 return true } getSnapshotBeforeUpdate(prevProps, prevState) { // 组件更新前触发 } componentDidUpdate() { // 组件更新后触发 } componentWillUnmount() { // 组件卸载时触发 }}

总结

旧的生命周期

图片描述
新的生命周期
图片描述

  1. React16新的生命周期弃用了componentWillMount、componentWillReceivePorps,componentWillUpdate
  2. 新增了getDerivedStateFromProps、getSnapshotBeforeUpdate来代替弃用的三个钩子函数(componentWillMount、componentWillReceivePorps,componentWillUpdate)
  3. React16并没有删除这三个钩子函数,但是不能和新增的钩子函数(getDerivedStateFromProps、getSnapshotBeforeUpdate)混用,React17将会删除componentWillMount、componentWillReceivePorps,componentWillUpdate
  4. 新增了对错误的处理(componentDidCatch)

参考

转载地址:http://skvwo.baihongyu.com/

你可能感兴趣的文章
2.3-docker网络-如何让外部网络访问容器资源
查看>>
Innodb优化之修改页大小
查看>>
误设置所有程序都默认成一种方式打开
查看>>
ubuntu ctrl+c ctrl+z ctrl+d
查看>>
SpringMVC---Method
查看>>
永中Office2012青年版下载用户反馈(节选二)
查看>>
css特效实现html表格显示部分内容,当鼠标移上去显示全部。
查看>>
oracle-rownum的理解
查看>>
我的友情链接
查看>>
使用cin.get()而不是system("pause")来避免c++程序一闪而过
查看>>
20分钟mysql入门教程
查看>>
简单的交换两个变量的数值
查看>>
Linux服务器上配置2个Tomcat或者多个Tomcat
查看>>
学习计划书
查看>>
CentOS7安装过程中,磁盘大于2T的报错处理
查看>>
第2章 多态
查看>>
2.6 相对和绝对路径 2.7 cd命令 2.8 创建和删除目录mkdir/rmdir 2.9 rm
查看>>
誉天蝉联“2014年度华为十佳培训合作伙伴”奖项
查看>>
单例模式2014-12
查看>>
【算法学习笔记】54.约瑟夫问题 模拟、逆推动规 SJTU OJ 1038 二哥的约瑟夫
查看>>