React学习笔记十-生命周期(旧)

此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第十篇,主要介绍React非常重要的组件的生命周期(旧)。要学习react新的生命周期,那必须先学习旧的生命周期。

目录

1.引出生命周期概念

1.1案例

1.1.1案例卸载功能与ReactDOM.unmountComponentAtNode

1.1.2案例透明的渐变功能与componentDidMount(){}

1.1.3案例透明的渐变功能与componentWillUnmount(){}

1.2案例总结

2.生命周期(旧)

2.1react生命周期图(旧)

2.1.1生命周期图片

 2.2生命周期函数执行顺序研究

2.2.1挂载时顺序

 2.2.2setState更新时顺序

2.2.3forceUpdate()更新时顺序

2.2.4父组件render流程

3.总结生命周期(旧)


1.引出生命周期概念

1.1案例

        首先我们写一个小案例,慢慢的引出生命周期的概念。案例:写一个文字标题,一直处于透明度变化当中,透明度由1慢慢变成0,然后瞬间变成1,再慢慢变成0,以此反复,而且是一打开页面就开始变化了。再写一个按钮,点击这个按钮,就会把标题带着按钮一起消失,就是把组件给干掉了(卸载)。

        首先在react官网中对生命周期的介绍:

        当 Clock 组件第一次被渲染到 DOM 中的时候,就为其设置一个计时器。这在 React 中被称为“挂载(mount)”。

        同时,当 DOM 中 Clock 组件被删除的时候,应该清除计时器。这在 React 中被称为“卸载(unmount)”。

所以我们有了两个概念,挂载(mount)和卸载(unmount)。

1.1.1案例卸载功能与ReactDOM.unmountComponentAtNode

首先我们写按钮的功能,也就是卸载组件:

1.我们给按钮添加了点击事件,事件的回调函数是death。在death内,引用了一个react的api,这个api名字非常长,但语义化非常强,ReactDOM.unmountComponentAtNode(被卸载的组件)。

document.getElementById('test1'),找到挂载在test1上面的组件,便可以使用此api对组件卸载。

class Life extends React.Component {
     death = ()=>{
     //卸载组件
          ReactDOM.unmountComponentAtNode(document.getElementById('test1'))
      }
      render() {
          return (
               <div>
                   <h2>React学不会怎么办?</h2>
                   <button onClick={this.death}>不活了</button>
               </div>
           )
       }
}
ReactDOM.render(<Life />, document.getElementById('test1'))

1.1.2案例透明的渐变功能与componentDidMount(){}

然后我们想办法,让标题处于时刻渐变的状态。

状态(state)可以驱动页面的显示和更新,所以在透明度改变这种事上,我们得先定义一个state。

        state = {opacity:0.3}

然后为h2标签写上style:<h2 style={ {opacity:this.state.opacity}}>React学不会怎么办?</h2>

如此,页面上的标题的透明度,就会变成我们state里面写的透明度。

        但我们得想办法,让透明的一直变化。从完全可见到彻底消失,耗时两秒。透明度由1到0,耗时是2s,如果我们使用间隔定时器,那么每次给200毫米,减少0.1。

        那么我们把间隔定时器写在哪呢?我们尝试写在render函数里面(这样写是有问题的,大家不要跟着写,这里只是展示错误)。代码如下:

render() {
      setInterval(()=>{
      //获取原状态
      let {opacity} = this.state
      //减少0.1
      opacity -= 0.1
      if(opacity <= 0){
            opacity = 1
      }
            this.setState({opacity})
      },200)
       return (
            <div>
               <h2 style={
  {opacity:this.state.opacity}}>React学不会怎么办?</h2>
               <button onClick={this.death}>不活了</button>
            </div>
      )
}

这样写后,页面我们写的标题,透明度会改变的越来越快,和闪烁一样,不是我们想要的情况。电脑温度会逐渐增高。

        这个错误,是因为我们引发了一个无限的递归,render函数会执行1+n次,1是我们组件初次挂载到页面上,render会执行一次,而n是state发生更新,render就会重新执行一次,state更新了n次,render就重新执行n次。间隔定时器200毫秒执行一次,定时器里面有state的更新,这就说明200毫秒state就更新一次,引发render更新,而且定时器是写在render里面的,render走一次又开启一个定时器,定时器又在更新state,形成一个无限的递归,计算量呈指数爆炸。

        所以我们得改写定时器的位置,不能放在render里面。在组件初次挂载到页面上时,react会自动调用一次render,也会自动调用一个api,叫做

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊啊啊啊啊威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值