react学习笔记-05 lifecycle
根据React官网,react有三个生命状态:装载(Mounting),更新(updating),卸载()
一:装载
装载:componentWillMount/componentDidMount(组件即将被装载、组件已经被装载)
export default class blog extends React.Component{ constructor(props){ super(props); this.state = {count:0}; }; componentWillMount(){ console.log("will mount"); }; componentDidMount(){ console.log("did mount");
console.log(ReactDom.findDOMNode(this)); }; render(){
console.log("render"); return ( <div>hello world! {this.state.count}</div> ); } }
输出结果:
可以看出,在componentWillMount里面进行setState,组件不会重新渲染.如果在componentDidMount里面setState,组件会重新渲染。
在render结束之后,就可以获得DOM 节点了。
在componentDidMount通常做一些ajax或者settimeout/setInterval操作,再更新DOM进行update操作
二:卸载
componentWillunMount:取消事件监听,清除定时器
export default class blog extends React.Component{ constructor(props){ super(props); this.state = {count:0}; }; componentWillMount(){ console.log("will mount"); this.setState({ count:3 }); }; componentDidMount(){ console.log("did mount"); console.log(ReactDom.findDOMNode(this)); }; componentWillUnmount(){ console.log("you want kill me?"); }; killMyself(){ ReactDom.unmountComponentAtNode(document.getElementById('blog')); console.log("yes, I want to kill you"); }; render(){ console.log("render"); return ( <div>hello world! {this.state.count} <button onClick = {this.killMyself} value="kill"></button> </div> ); } }
如果在componentWillMount里面使用setInterval:
componentWillMount(){ console.log("will mount"); var self = this; this.timer = setInterval(function(){ self.setState({count:self.state.count+1}); },1000); };
点击清空按钮后会出现下面warning:
该warning的出现是因为DOM被清除了,但是计时器还在。所以这个时候可以在componentWillUnmount里面清空setInterval
componentWillUnmount(){ console.log("you want kill me?"); clearInterval(this.timer); };
三:更新
第一次创建组件的时候,不会调用update相关的方法。
shouldComponentUpdate返回true时,其他的update方法才会被触发。
shouldComponentUpdate(nextProp,nextState){ //判断是否需要重新渲染 console.log("shouldComponentUpdate"); if(nextState >2){ return false; } return true; }; componentWillUpdate(nextProps,nextState){ //做一些数据的处理 console.log("componentWillUpdate"); }; componentDidUpdate(){ //可以获取更新后的DOM结构 console.log("update success"); }; doUpdate(){ this.setState({count:this.state.count+1}); }; render(){ console.log("render"); return ( <div>hello world! {this.state.count} <button onClick = {this.doUpdate.bind(this)}>update</button> </div> ); }
还有一个重要的update方法:
componentWillReceivePops
用props更新子组件的state,判断子组件是否更新
var SubMessage = React.createClass({ componentWillReceiveProps (nextProps){ console.log("子组件将要获得props"); }, shouldComponentUpdate (nextProps,nextState){ if(nextProps.count >4){ return false; } return true; }, render(){ return (<h3>{this.props.count}</h3>); } }); export default class blog extends React.Component{ constructor(props){ super(props); this.state = {count:0}; }; //更新周期 shouldComponentUpdate (nextProp,nextState){ //判断是否需要重新渲染 console.log("shouldComponentUpdate"); if(nextState.count >8){ return false; } return true; }; componentWillUpdate(nextProps,nextState){ //做一些数据的处理 console.log("componentWillUpdate"); }; componentDidUpdate(){ //可以获取更新后的DOM结构 console.log("update success"); }; doUpdate(){ this.setState({count:this.state.count+1}); }; render(){ console.log("render"); return ( <div>hello world! {this.state.count} <button onClick = {this.doUpdate.bind(this)}>update</button> <SubMessage count={this.state.count}></SubMessage> </div> ); } }
react学习笔记-05 lifecycle的更多相关文章
- React学习笔记--程序调试
React学习笔记 二 程序调试 前面我们搭建好了React的基本开发环境,可以编写基本的React js程序了.但完成的开发环境肯定包含调试器,怎么调试用React编写的JS程序呢?有浏览器,比 ...
- react学习笔记1--基础知识
什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...
- React学习笔记(一)- 入门笔记
React入门指南 作者:狐狸家的鱼 本文链接:React学习笔记 GitHub:sueRimn 1.组件内部状态state的修改 修改组件的每个状态,组件的render()方法都会再次运行.这样就可 ...
- 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归
机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归 关键字:Logistic回归.python.源码解析.测试作者:米仓山下时间:2018- ...
- React学习笔记(七)条件渲染
React学习笔记(七) 六.条件渲染 使用if或条件运算符来创建表示当前状态的元素. 可以使用变量来存储元素.比如: let button = null; if (isLoggedIn) { but ...
- React学习笔记(六)事件处理
React学习笔记(六) 五.事件处理 React事件绑定属性的命名采用驼峰写法,不同于传统DOM全部小写. 如果采用JSX的语法,事件函数需要用大括号{}包裹函数名,不同于传统DOM字符串小括号的方 ...
- React学习笔记(五)State&声明周期
React学习笔记(五) 四.State&声明周期 可以为组件添加"状态(state)".状态与属性相似,但是状态是私有的,完全受控于当前组件. 局部状态就是只能用于类(定 ...
- React学习笔记 - 组件&Props
React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...
- React学习笔记 - 元素渲染
React Learn Note 3 React学习笔记(三) 标签(空格分隔): React JavaScript 二.元素渲染 元素是构成react应用的最小单位. 元素是普通的对象. 元素是构成 ...
随机推荐
- IOS开发的内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- gd库不支持jpeg的解决方法
杜工就不在这里啰嗦怎么遇到这个问题的了,如果你确实安装了的gd库,却发现无法支持jpeg格式的图片,可从下面找到答案. 原因是在编译gd库前,配置时未声明jpeg库路径.解决方法如下: 32位系统: ...
- [置顶] SQL注入安全分析
(一) 应用环境列表 网络互联设备操作系统 序号 操作系统名称 设备名称 脆弱性 1 IOS_路由器_内部_1 route1 2 IOS_路由器_VPN_1 路由器_VPN_1 3 IOS ...
- java--九九乘法表
/* * Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:邱学伟 * 完成日期:2013 年 7 月 ...
- POJ 1915 经典马步 双向bfs
拿这个经典题目开刀...........可是双向时间优势在这题上的效果不太明显 #include <iostream> #include <algorithm> #includ ...
- windows下练习linux shell
<---开始学习linux---记录一下---路漫漫其修远兮---加油吧---萌萌达> 使用软件:Cygwin 下载地址(免安装版):链接: http://pan.baidu.com/s ...
- Codeforces 158 D
题目链接 :http://codeforces.com/contest/158/problem/D D. Ice Sculptures time limit per test 3 seconds me ...
- [.net] c# webservice
采用的工具VS2010生成工程 1. 生成webservice工程:建 ASP.NET 空WEB 应用程序. 2. 在建好的ASP.NET 空WEB应用程序中新建项“web 服务”. 完成上述内容工程 ...
- for循环和while循环
for循环和while循环 --道心 for循环 name1_list=['daoxin','wuxin','zhixin']for ele in name1_list: #找到"wuxin ...
- Redmine管理项目3-调整用户显示格式
在 Redmine 中新建用户时是这样的: 必须指定姓氏.名字,然后 Redmine 默认是按“名字 姓氏”这种方式显示用户.比如“张三”,会显示成“三张”……看起来好别扭啊. 怎么调整呢,参看 Re ...