组件状态

事件

(事件名大写)

注意:组件事件需要配合状态,所以现在无法呈现效果

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)

  1. constructor:构造函数,这时还不算是个组件,只是class自身的初始化
  2. getDerivedStateFromProps:检查需要更新的状态(一个检查函数,不是钩子函数,检查更新,一般不做改变)
  3. render:初始渲染
  4. componentDidMount:组件创建完成,并已挂载到DOM结构中

更新阶段(update)

  1. getDerivedStateFromProps:检查
  2. shouldComponentUpdate:确定组件是否需要更新  (重要)有两个参数(nextProps,nextState)
  3. render
  4. getSnapshoutBeforeUpdate:更新前保存DOM状态
  5. 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组件-事件、状态和生命周期相关推荐

  1. React Native组件的结构和生命周期

    React Native组件的结构和生命周期 一.组件的结构 1.导入引用 可以理解为C++编程中的头文件. 导入引用包括导入react native定义的组件.API,以及自定义的组件. 1.1 导 ...

  2. android生命周期方法,Android零基础入门|Activity状态和生命周期方法

    原标题:Android零基础入门|Activity状态和生命周期方法 前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还 ...

  3. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  4. 一张图弄懂java线程的状态和生命周期

    转载自 一张图弄懂java线程的状态和生命周期 上图是一个线程的生命周期状态流转图,很清楚的描绘了一个线程从创建到终止的过程. 这些状态的枚举值都定义在java.lang.Thread.State下 ...

  5. k8s的Pod状态和生命周期管理

    Pod状态和生命周期管理 一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod pha ...

  6. 微信小程序组件所在页面的生命周期

    一 什么是组件所在页面的生命周期 有时,自定义组件的行为依赖于页面状态的变化,此时就需要用到组件所在页面的生命周期. 例如:每当触发页面的 show 生命周期函数的时候,我们希望能够重新生成一个随机的 ...

  7. [react] React16废弃了哪些生命周期?为什么?

    [react] React16废弃了哪些生命周期?为什么? React16废弃的生命周期有3个will: componentWillMount componentWillReceiveProps co ...

  8. 线程知识点(一)—— 程序、进程、线程之间的区别与联系、Java的线程状态和生命周期

    1 程序.进程.线程之间的区别与联系 三者之间的形象化理解: * 程序:代码实现了功能,就是程序,是静态的: * 进程:执行中的程序就是进程,是动态的: * 线程:进程内的一个执行单元,也是进程内的可 ...

  9. [转]Java 对象锁-synchronized()与线程的状态与生命周期

    线程的状态与生命周期 Java 对象锁-synchronized() ? 1 2 3 4 synchronized(someObject){ //对象锁 } 对象锁的使用说明: 1.对象锁的返还. 当 ...

  10. Hibernate→HQL、query.list()返回数据类型、查询相关语句、分页、原生SQL、@注解、持久化对象状态及生命周期、一多关系、继承映射关系、逆向工程

    HQL Query实例与表 session通用工具类 Query对象 from 类→List<类>接收 映射类 仅查询商品 查询商品及所在商家 别名 返回数据类型定义 Iterator接收 ...

最新文章

  1. python filter过滤器的使用_如何在Python 3中使用过滤器、映射和精简
  2. 以使用QSqlQuery向数据库中插入数据为例,做一个小结
  3. 解决spark中遇到的数据倾斜问题
  4. 攻击面管理(ASM),企业攻击面管理实践指南
  5. 从源码来理解slf4j的绑定,以及logback对配置文件的加载
  6. HTTP知识普及系列:HTTP首部
  7. 参会指南丨3分钟带你玩转2020数据技术嘉年华!
  8. DBMS连接不上 —— 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。
  9. matlab 切割图像像素,matlab – 使用图形切割与种子点的图像分割
  10. 大一c语言图书管理系统查询,大一C语言课程设计图书信息管理系统
  11. 网站被黑被劫持跳转的症状与木马代码清除
  12. 元宇宙价值链解读:元宇宙现实体系映射对未来的影响
  13. AARRR用户运营模型简介
  14. Android Intent详解
  15. leetcode笔记(五)809. Expressive Words
  16. r语言做绘制精美pcoa图_科学网-R语言 PCA PCoA ggplot2-靳泽星的博文
  17. ❤ CSDN榜一博主,半年文章汇总【答谢粉丝、文末送书4本】❤
  18. linux文件重命名命令
  19. 【ANDROID学习】
  20. 终于搞定了stackoverflow的富文本编辑器pagedown

热门文章

  1. Intellij idea添加单元测试工具
  2. SQLServer优化二
  3. 蓝桥杯第三届省赛JAVA真题----取球博弈
  4. Rails 使用 Google Analytics 示例
  5. 计算机一级13点,2013年计算机一级考试MsOffice备考题及答案(13)
  6. h5能调取摄像头吗_高质感的国产中型车,实力能比肩本田雅阁吗?带你看红旗H5...
  7. 迁徙图_虾米音乐上的原住民会迁徙去哪呢?
  8. arccatalog点要素显示不完,shp数据全图显示正常,放大要素不能显示的问题
  9. mysql 值到99999后不增值了_MySQL必知必会3
  10. 地区json文件_【小例子】使用jQuery实现省市区三级联动显示,附源码json文件