react学习笔记(8)生命周期回顾与再认识
生命周期
- 生命周期是一个组件从创建到销毁的过程。
- 当组建实例被创建并且插入到DOM中,需要调用的函数,就是生命周期函数。
- 也就是说,组件加载完成前后、组件更新数据、组件销毁,所触发的一系列的方法。
1.第一阶段--初始化阶段
组件创建到首次渲染到页面
constructor()
构造函数,在创建组件的时候调用一次componentWillMount()
在组件即将被挂载的时候调用一次render()
渲染componentDidMount()
在组件被挂载完成的时候调用一次,可以在这里使用refs属性,因为组件已经被渲染出来了。- 代码
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')
);
复制代码
打印的顺序:
解析:
- undefined是在componentWillMount()中打印出来的,更新了setState却还是undefined,说明该方法是异步的,所以用了定时器,两秒后打印出来了传的值。
- 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.第二阶段--更新阶段
状态更新引起的变化
componentWillReceiveProps(nextProps)
父组件的更新会触发子组件的这个函数shouldComponentUpdate(nextProps, nextState) return false/true
是否需要重新渲染,默认值为true,表示更新;false会阻止render调用componentWillUpdate(nextProps, nextState)
即将更新,不能修改属性与状态,用于日志打印和数据获取render()
渲染componentDidUpdata()
完成更新参数:
1. nextProps:父组件更新的时候带来的数据 2. nextState:子组件当前的状态 复制代码
代码
//子组件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')
);
复制代码
效果图:
分析:
- 由于List是App的子组件,所以App执行render的时候,会将List也渲染了,所以会打印"02-构造函数01",而List中也会执行render,打印"02-渲染组件05",之后组件完成加载。
- 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;
}
复制代码
点击后的效果:
.第三阶段--销毁阶段
组件在销毁之前
componentWillUnmount()
组件即将销毁
总结
初始化和销毁阶段在组件的整个生命周期中只会出现一次
更新阶段会在组件每次更新中都会执行
转载于:https://juejin.im/post/5c21b20d6fb9a049e93cc0b9
react学习笔记(8)生命周期回顾与再认识相关推荐
- day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法
系列文章目录 day1学习vue2笔记 vue指令 day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios day3 vue2 学习笔记 vue组件 day4 vue 学习笔记 组件 生命 ...
- IOS学习笔记——ViewController生命周期详解
在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...
- android学习笔记---36_Activity生命周期
36_Activity生命周期 ----------------------------- 1.Activity生命周期,用于activity在运行时候受到一些突然事件的影响 ,例如:正在使用一个 ...
- Gavin小黑屋——Vue 学习笔记 :生命周期特点(先渲染HTML标签再渲染数据)
Vue基础 生命周期特点(先渲染HTML标签再渲染数据) 目录 Vue基础 生命周期特点(先渲染HTML标签再渲染数据) 一.Vue生命周期 Vue 的生命周期总共分为8个阶段:创建前/后,载 ...
- React学习笔记2---生命周期
生命周期函数指在某一个时刻组件会自动调用执行的函数,React的生命周期函数主要有 Initialization(初始化) Mounting(挂载) Updation(更新) Unmounting(卸 ...
- react学习笔记1--基础知识
什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...
- react组件卸载调用的方法_好程序员web前端培训分享React学习笔记(三)
好程序员web前端培训分享React学习笔记(三),组件的生命周期 React中组件也有生命周期,也就是说也有很多钩子函数供我们使用, 组件的生命周期,我们会分为四个阶段,初始化.运行中.销毁.错误处 ...
- react render没更新_web前端教程分享React学习笔记(一)
web前端教程分享React学习笔记(一),React的起源和发展:React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写 ...
- React 重温之 组件生命周期
生命周期 任何事物都不会凭空产生,也不会无故消亡.一个事物从产生到消亡经理的各个阶段,我们称之为 生命周期. 具体到我们的前端组件上来,一个组件的生命周期可以大体分为创建.更新.销毁这个三个阶段. 本 ...
最新文章
- SpringBoot在Tomcat下面启动,访问路径
- 【超级实用】程序添加后台执行的选项
- linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...
- JSP脚本与指令元素
- showModalDialog数据缓存问题
- 【渝粤题库】陕西师范大学202011 微观经济学 作业 (专升本、高起本)
- CString LPCTSTR LPTSTR 类型的相互转化
- 在Python中写入文件时,权限被拒绝错误
- docker 环境下通过ocelot和consul 实现服务发现与自治
- match_parent和fill_parent有什么区别?
- 想自学python看哪位的视频比较好-python学习视频好的有哪些
- java 通讯开发_java之接口开发-初级篇-socket通信
- OllyDbg 使用注意事项 (十)
- VS2012错误之 warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/SAFESEH”规范)
- Linux debian利用ifconfig查看IP地址
- DSP大数据精准广告的介绍
- php外语文献有哪些,外语论文参考文献
- 学习编程前需要知道什么?
- android中英文切换功能,Android APP 中英文切换
- 04【结构面】 面试之结构面,什么是结构面?结构面的准备,常见问题分析?
热门文章
- boost::hana::zip_shortest用法的测试程序
- GDCM:读取和转储DICOMDIR文件的测试程序
- VTK:Utilities之VectorArrayKnownLength
- OpenCV视频加速Video acceleration的实例(附完整代码)
- QT的QStatusBar类的使用
- QT的QRadioTuner类的使用
- C++赋值运算符重载
- 去掉字符串中的单引号和双引号_同时搞定Android和iOS的Dart语言(4):字符串类型...
- centos 管道符取第一行_CentOS 7 文件操作命令
- python关键字列表的表达式,python 列表推导和生成器表达式的使用