React组件-事件、状态和生命周期
组件状态
事件
(事件名大写)
注意:组件事件需要配合状态,所以现在无法呈现效果
class Cmp1 extends React.Component{constructor(...args){super(..args);this.a=0;//要用状态,属性不行,props也不行}add(){this.a++;//这个函数会执行,a也会变,但是不会重新渲染alert(this.a);}render(){return <div>//强制绑定add的this<input type="button" value="加1" onClick={this.add.bind(this)} /></div>}
} 复制代码
a其实变了,但是只有状态改变能引发重新渲染
状态
组件的状态非常有用
- 属性是只读,状态是可变的
- 状态改变,组件会重新渲染(父级属性变化,强制刷新也可以引起重新渲染)
- 引起组件重新渲染的条件
- state
- props
- 强制渲染. this.forceUpdate()
- 引起组件重新渲染的条件
class Cmp1 entends React.Component{constructor(...args){super(...args);//状态初始化this.state={a:0}}add(){//修改状态this.setState({a:this.state.a+1})}render(){return <div>//强制绑定add的this<input type="button" value="+1" onClick={this.add.bind(this)} />{this.state.a}</div>}
}
let comp=<Cmp1></Cmp1>
ReactDOM.render(comp,root)复制代码
注意⚠️:
- 状态的初始化只能放在constructor中完成
- 必须通过setState修改状态,否则也不能重新渲染——其实是setState在调用render
props变化引起的重新渲染
class Parent extends React.Component{constructor(...args){super(...args);this.state={a:0}}render(){return <div><input type="button" value="+1" onClick={function(){this.setState({a:this.state.a+1})}.bind(this)} /><Child a={this.state.a} /></div>}
}
class Child extends React.Component{constructor(...args){super(...args);}render(){return <div>{this.props.a}</div>}
}
复制代码
强制渲染(forceUpdate)
class Cmp1 extends React.Component{constructor(.;..args){super(...args);this.a=12;}fn(){this.a++//强制渲染this.forceUpdate(); }render(){return <div><input type="button" value="+1" onClick={this.fn.bind(this)} />{this.a}</div>}
}
复制代码
强制重新渲染会打乱React自身的渲染计划,轻则影响性能,重则引发错误,极少使用
组件生存周期
从组件创建到销毁的整个过程
上图中,涉及最重要的两个钩子函数,componentDidMount(组件已挂载)和componentDidUpdate(组件已更新)
完整的生命周期钩子函数
创建阶段(mount)
- constructor:构造函数,这时还不算是个组件,只是class自身的初始化
- getDerivedStateFromProps:检查需要更新的状态(一个检查函数,不是钩子函数,检查更新,一般不做改变)
- render:初始渲染
- componentDidMount:组件创建完成,并已挂载到DOM结构中
更新阶段(update)
- getDerivedStateFromProps:检查
- shouldComponentUpdate:确定组件是否需要更新 (重要)有两个参数(nextProps,nextState)
- render
- getSnapshoutBeforeUpdate:更新前保存DOM状态
- compomentDidUpdate:组件已渲染完成
阻止更新
shouldComponentUpdata(nextProps,nextState){
//当前状态(变化前),新状态(变化后)this.state.nextState//当前属性,新属性this.props.nextPropsreturn true -允许更新/。 false -拒绝更新
}复制代码
使用实例:阻止循环update
class Parent entends React.Component{constructor(...args){super(..args);this.state={id:1}}next(){this.setState{id:this.state.id+1}}render(){return {<div><input type="button" value="下一个" onClick={this.next.bind(this)}/><Child id={this.state.id}/></div>}}
}
class Child extends React.Component{constructor(..args){super(...args);this.state={name:'',age:''}}shouledComponentUpdata(nextProps,nextState){//console.log(nextProps,this.props);renturn{//条件1:属性变了(来自父级)nextProps.id!=this.props.id||//条件2:状态变了(来自自己)nextState.name!=this.state.name};}loadData(id){fetch(`data/data${id}.txt`).then(res=>{res.json().then(data=>{this.setState(data);});});}componentDidMount(){console.log('初始:‘,this.props.id);this.loadData(this.props.id)}componentDidUpdate(){console.log('更新‘,this.props.id)this.loadData(this.props.id);}render(){console.log('渲染‘);return (<div>ID:{this.props.id}<br/>用户名:{this.state.name},年龄:{this.state.age}</div>)}
}复制代码
销毁阶段(Unmount)
- componentWillUnmount:组织已销毁
销毁操作无法阻止
转载于:https://juejin.im/post/5cee854a518825155a23237d
React组件-事件、状态和生命周期相关推荐
- React Native组件的结构和生命周期
React Native组件的结构和生命周期 一.组件的结构 1.导入引用 可以理解为C++编程中的头文件. 导入引用包括导入react native定义的组件.API,以及自定义的组件. 1.1 导 ...
- android生命周期方法,Android零基础入门|Activity状态和生命周期方法
原标题:Android零基础入门|Activity状态和生命周期方法 前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- 一张图弄懂java线程的状态和生命周期
转载自 一张图弄懂java线程的状态和生命周期 上图是一个线程的生命周期状态流转图,很清楚的描绘了一个线程从创建到终止的过程. 这些状态的枚举值都定义在java.lang.Thread.State下 ...
- k8s的Pod状态和生命周期管理
Pod状态和生命周期管理 一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod pha ...
- 微信小程序组件所在页面的生命周期
一 什么是组件所在页面的生命周期 有时,自定义组件的行为依赖于页面状态的变化,此时就需要用到组件所在页面的生命周期. 例如:每当触发页面的 show 生命周期函数的时候,我们希望能够重新生成一个随机的 ...
- [react] React16废弃了哪些生命周期?为什么?
[react] React16废弃了哪些生命周期?为什么? React16废弃的生命周期有3个will: componentWillMount componentWillReceiveProps co ...
- 线程知识点(一)—— 程序、进程、线程之间的区别与联系、Java的线程状态和生命周期
1 程序.进程.线程之间的区别与联系 三者之间的形象化理解: * 程序:代码实现了功能,就是程序,是静态的: * 进程:执行中的程序就是进程,是动态的: * 线程:进程内的一个执行单元,也是进程内的可 ...
- [转]Java 对象锁-synchronized()与线程的状态与生命周期
线程的状态与生命周期 Java 对象锁-synchronized() ? 1 2 3 4 synchronized(someObject){ //对象锁 } 对象锁的使用说明: 1.对象锁的返还. 当 ...
- Hibernate→HQL、query.list()返回数据类型、查询相关语句、分页、原生SQL、@注解、持久化对象状态及生命周期、一多关系、继承映射关系、逆向工程
HQL Query实例与表 session通用工具类 Query对象 from 类→List<类>接收 映射类 仅查询商品 查询商品及所在商家 别名 返回数据类型定义 Iterator接收 ...
最新文章
- python filter过滤器的使用_如何在Python 3中使用过滤器、映射和精简
- 以使用QSqlQuery向数据库中插入数据为例,做一个小结
- 解决spark中遇到的数据倾斜问题
- 攻击面管理(ASM),企业攻击面管理实践指南
- 从源码来理解slf4j的绑定,以及logback对配置文件的加载
- HTTP知识普及系列:HTTP首部
- 参会指南丨3分钟带你玩转2020数据技术嘉年华!
- DBMS连接不上 —— 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。
- matlab 切割图像像素,matlab – 使用图形切割与种子点的图像分割
- 大一c语言图书管理系统查询,大一C语言课程设计图书信息管理系统
- 网站被黑被劫持跳转的症状与木马代码清除
- 元宇宙价值链解读:元宇宙现实体系映射对未来的影响
- AARRR用户运营模型简介
- Android Intent详解
- leetcode笔记(五)809. Expressive Words
- r语言做绘制精美pcoa图_科学网-R语言 PCA PCoA ggplot2-靳泽星的博文
- ❤ CSDN榜一博主,半年文章汇总【答谢粉丝、文末送书4本】❤
- linux文件重命名命令
- 【ANDROID学习】
- 终于搞定了stackoverflow的富文本编辑器pagedown
热门文章
- Intellij idea添加单元测试工具
- SQLServer优化二
- 蓝桥杯第三届省赛JAVA真题----取球博弈
- Rails 使用 Google Analytics 示例
- 计算机一级13点,2013年计算机一级考试MsOffice备考题及答案(13)
- h5能调取摄像头吗_高质感的国产中型车,实力能比肩本田雅阁吗?带你看红旗H5...
- 迁徙图_虾米音乐上的原住民会迁徙去哪呢?
- arccatalog点要素显示不完,shp数据全图显示正常,放大要素不能显示的问题
- mysql 值到99999后不增值了_MySQL必知必会3
- 地区json文件_【小例子】使用jQuery实现省市区三级联动显示,附源码json文件