生命周期

  1. 生命周期是一个组件从创建到销毁的过程。
  2. 当组建实例被创建并且插入到DOM中,需要调用的函数,就是生命周期函数。
  3. 也就是说,组件加载完成前后、组件更新数据、组件销毁,所触发的一系列的方法。

1.第一阶段--初始化阶段

组件创建到首次渲染到页面

  1. constructor() 构造函数,在创建组件的时候调用一次
  2. componentWillMount() 在组件即将被挂载的时候调用一次
  3. render() 渲染
  4. componentDidMount() 在组件被挂载完成的时候调用一次,可以在这里使用refs属性,因为组件已经被渲染出来了。
  5. 代码
class App extends React.Component{constructor(props) {super(props);// 构造函数只执行一行// this.props.title 读取父组件的传递的数据// this.state = {} 初始化一个状态this.state = {a: props.title,b: this.props.title};console.log( '01-构造函数1 ' );}componentWillMount() {console.log('02-组件即将被挂载2');// 这时不能做dom操作,因为还没有渲染// 请求后端接口 真实测试的会出现白屏(页面一直没有图片 文字 html结构 )// this.setState() this.state this.props 都是异步的this.setState({c: '请求的数据'});console.log(this.state.c); //undefinedsetTimeout(()=>{console.log( this.state.c ); //请求的数据},2000);}render() {console.log( '03-开始渲染组件3' )// 可以在这一步对 state数据进行处理//console.log( this.state.c )return (<div>{this.state.a}<hr />{this.state.b}<buttonref={btn=>this._btn=btn}onClick={this.handleClick}>点击 </button></div>);}componentDidMount() {// 可以在网页上能够看到数据(图片 文字)// 真实的场景 会在此请求后端数据接口// 请求回来的数据 会挂载到state里面// 放在state里面的好处// 1. 当前组件是根据state的数据进行渲染// 2. state的数据是响应式数据 ,一但数据变化了,就会自动触发render函数console.log('04-组件挂载完成啦4');console.log( this._btn );this._btn.style.background = 'skyblue';}
};ReactDOM.render(<App title={'传值给App组件'}></App>,document.querySelector('#app')
);
复制代码

打印的顺序:

解析:

  1. undefined是在componentWillMount()中打印出来的,更新了setState却还是undefined,说明该方法是异步的,所以用了定时器,两秒后打印出来了传的值。
  2. componentDidMount()组件已经加载完毕,此时可以操作DOM节点,因此可以获取到button按钮

demo :点击当前组件的元素执行当前的事件函数更新当前的组件数据b,数据变化就是自动触发render数据

class App extends React.Component{constructor(props) {super(props);this.state = {a: props.title,b: this.props.title};console.log( '01-构造函数1 ' );}componentWillMount() {console.log('02-组件即将被挂载2');this.setState({c: '请求的数据'});console.log(this.state.c); setTimeout(()=>{console.log( this.state.c ); },2000);}handleClick = ()=>{this.setState({b: '点击事件改变了b的数据'})}render() {console.log( '03-开始渲染组件3' )//console.log( this.state.c )return (<div>{this.state.a}<hr />{this.state.b}<buttonref={btn=>this._btn=btn}onClick={this.handleClick}>点击 </button></div>);}componentDidMount() {console.log('04-组件挂载完成啦4');this._btn.style.background = 'skyblue';}
};ReactDOM.render(<App title={'传值给App组件'}></App>,document.querySelector('#app')
);
复制代码

点击前:

点击后:

当更新state的时候,会重新触发render();


2.第二阶段--更新阶段

状态更新引起的变化

  1. componentWillReceiveProps(nextProps) 父组件的更新会触发子组件的这个函数

  2. shouldComponentUpdate(nextProps, nextState) return false/true 是否需要重新渲染,默认值为true,表示更新;false会阻止render调用

  3. componentWillUpdate(nextProps, nextState) 即将更新,不能修改属性与状态,用于日志打印和数据获取

  4. render() 渲染

  5. componentDidUpdata() 完成更新

  6. 参数:

         1. nextProps:父组件更新的时候带来的数据  2. nextState:子组件当前的状态
    复制代码
  7. 代码

//子组件List
class List extends React.Component {constructor() {super();console.log( '02-构造函数01' );}componentWillReceiveProps(nextProps) {console.log('02-获取父组件更新的时候带来的数据02 ',nextProps);}shouldComponentUpdate(nextProps, nextState) { console.log('02-是否将来更新组件03');return true;}componentWillUpdate(nextProps, nextState) {console.log('02-组件即将被更新04', nextProps, nextState );// 看自己的需求}render() {console.log('02-渲染组件05');return (<div><h2> 这是List组件 </h2></div>);}componentDidUpdate(prevProps, prevState) {console.log( '02-组件更新完成啦06', prevProps,prevState )}componentWillUnmount() {console.log('03-List组件即将被销毁07')}
}//父组件App
class App extends React.Component{constructor(props) {super(props);console.log( '01-构造函数1 ' );this.state = {p: 'App',onOff: true};}componentWillMount() {console.log('01-组件即将被挂载2');}componentDidMount() {console.log('01-组件挂载完成啦4');}render() {console.log( '01-开始渲染组件3' );return (<div><h1>App</h1><List title={this.state.p}></List></div>);}
}
ReactDOM.render(<App></App>,document.querySelector('#app')
);
复制代码

效果图:

分析:

  1. 由于List是App的子组件,所以App执行render的时候,会将List也渲染了,所以会打印"02-构造函数01",而List中也会执行render,打印"02-渲染组件05",之后组件完成加载。
  2. componentWillReceiveProps()是在当父组件更新数据时 才会触发,下一个例子。

设置点击事件,修改父组件的数据,触发更新阶段的方法

class List extends React.Component {constructor(props) {super(props);//console.log( '02-构造函数01' );this.state = {list: '这是list数据',//接收父组件传来的值title : this.props.title};console.log(this.state.title);}componentWillReceiveProps(nextProps) {console.log('02-获取父组件更新的时候带来的数据02 ',nextProps);}shouldComponentUpdate(nextProps, nextState) { console.log('02-是否将来更新组件03',nextProps, nextState);return true;}componentWillUpdate(nextProps, nextState) {console.log('02-组件即将被更新04', nextProps, nextState );// 看自己的需求}render() {console.log('02-渲染组件05');return (<div><h2> 这是List组件 </h2>{this.state.title}</div>);}componentDidUpdate(prevProps, prevState) {console.log( '02-组件更新完成啦06', prevProps,prevState )}
}//父组件App
class App extends React.Component{constructor(props) {super(props);this.state = {p : "abc"};}handleClick = () =>{this.setState({p : "点击事件改变了App的数据"})}render() {return (<div><h1>App</h1><List title={this.state.p}></List><button onClick={this.handleClick}>点击事件</button></div>);}
}
ReactDOM.render(<App ></App>,document.querySelector('#app')
);
复制代码

点击后的效果图;

由打印的结果可知,componentWillReceiveProps()方法得到父组将更新的数据,可是页面上并没有改变,也就是说子组件的数据并没有更新,此时通过shouldComponentUpdate()方法更新。

代码分析:
判断当前子组件的title属性是否与父组件传来的数组相同,如果不同,走if判断,更新数据,因为数据更新了,所以会再次触发render方法,更新页面

shouldComponentUpdate(nextProps, nextState) {if( this.state.title !== nextProps.title){this.setState({title : nextProps.title})};return true;
}
复制代码

点击后的效果:

.第三阶段--销毁阶段

组件在销毁之前

  1. componentWillUnmount() 组件即将销毁

总结

初始化和销毁阶段在组件的整个生命周期中只会出现一次
更新阶段会在组件每次更新中都会执行

转载于:https://juejin.im/post/5c21b20d6fb9a049e93cc0b9

react学习笔记(8)生命周期回顾与再认识相关推荐

  1. day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法

    系列文章目录 day1学习vue2笔记 vue指令 day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios day3 vue2 学习笔记 vue组件 day4 vue 学习笔记 组件 生命 ...

  2. IOS学习笔记——ViewController生命周期详解

    在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...

  3. android学习笔记---36_Activity生命周期

    36_Activity生命周期 ----------------------------- 1.Activity生命周期,用于activity在运行时候受到一些突然事件的影响   ,例如:正在使用一个 ...

  4. Gavin小黑屋——Vue 学习笔记 :生命周期特点(先渲染HTML标签再渲染数据)

    Vue基础   生命周期特点(先渲染HTML标签再渲染数据) 目录 Vue基础   生命周期特点(先渲染HTML标签再渲染数据) 一.Vue生命周期 Vue 的生命周期总共分为8个阶段:创建前/后,载 ...

  5. React学习笔记2---生命周期

    生命周期函数指在某一个时刻组件会自动调用执行的函数,React的生命周期函数主要有 Initialization(初始化) Mounting(挂载) Updation(更新) Unmounting(卸 ...

  6. react学习笔记1--基础知识

    什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...

  7. react组件卸载调用的方法_好程序员web前端培训分享React学习笔记(三)

    好程序员web前端培训分享React学习笔记(三),组件的生命周期 React中组件也有生命周期,也就是说也有很多钩子函数供我们使用, 组件的生命周期,我们会分为四个阶段,初始化.运行中.销毁.错误处 ...

  8. react render没更新_web前端教程分享React学习笔记(一)

    web前端教程分享React学习笔记(一),React的起源和发展:React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写 ...

  9. React 重温之 组件生命周期

    生命周期 任何事物都不会凭空产生,也不会无故消亡.一个事物从产生到消亡经理的各个阶段,我们称之为 生命周期. 具体到我们的前端组件上来,一个组件的生命周期可以大体分为创建.更新.销毁这个三个阶段. 本 ...

最新文章

  1. SpringBoot在Tomcat下面启动,访问路径
  2. 【超级实用】程序添加后台执行的选项
  3. linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...
  4. JSP脚本与指令元素
  5. showModalDialog数据缓存问题
  6. 【渝粤题库】陕西师范大学202011 微观经济学 作业 (专升本、高起本)
  7. CString LPCTSTR LPTSTR 类型的相互转化
  8. 在Python中写入文件时,权限被拒绝错误
  9. docker 环境下通过ocelot和consul 实现服务发现与自治
  10. match_parent和fill_parent有什么区别?
  11. 想自学python看哪位的视频比较好-python学习视频好的有哪些
  12. java 通讯开发_java之接口开发-初级篇-socket通信
  13. OllyDbg 使用注意事项 (十)
  14. VS2012错误之 warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/SAFESEH”规范)
  15. Linux debian利用ifconfig查看IP地址
  16. DSP大数据精准广告的介绍
  17. php外语文献有哪些,外语论文参考文献
  18. 学习编程前需要知道什么?
  19. android中英文切换功能,Android APP 中英文切换
  20. 04【结构面】 面试之结构面,什么是结构面?结构面的准备,常见问题分析?

热门文章

  1. boost::hana::zip_shortest用法的测试程序
  2. GDCM:读取和转储DICOMDIR文件的测试程序
  3. VTK:Utilities之VectorArrayKnownLength
  4. OpenCV视频加速Video acceleration的实例(附完整代码)
  5. QT的QStatusBar类的使用
  6. QT的QRadioTuner类的使用
  7. C++赋值运算符重载
  8. 去掉字符串中的单引号和双引号_同时搞定Android和iOS的Dart语言(4):字符串类型...
  9. centos 管道符取第一行_CentOS 7 文件操作命令
  10. python关键字列表的表达式,python 列表推导和生成器表达式的使用