zoukankan      html  css  js  c++  java
  • React-生命周期

    一、创建阶段的生命周期

      ps:只有类组件才有生命周期

      1、constructor:初始化数据、为事件处理程序绑定 this

      2、render:渲染 UI 结构

      3、componentDidMount:获取 DOM 元素、发送网络请求 

    import React from 'react'
    
    export default class App extends React.Component {
      // constructor 是 react 运行阶段遇到的第一个生命周期
      // 这个生命周期的作用:初始化数据、为事件处理程序绑定 this
      constructor() {
        super()
        this.state = {}
        console.warn('constructor首先运行')
      }
    
      // render 是运行阶段执行的第二个生命周期
      // 这个生命周期的作用:渲染 UI 结构
      render() {
        console.warn('render 第二个运行')
        return (
          <div></div>
        )
      }
    
      // componentDidMount 是创建阶段执行的第三个生命周期
      // 这个阶段 DOM 已经完成渲染成功
      // 这个生命周期的作用:获取 DOM 元素、发送网络请求 
      componentDidMount() {
        console.warn('componentDidMount 第三个运行')
      }
    }

    二、更新阶段的生命周期

      更新阶段触发时机:1、props 值发生了改变

               2、this.setState() 更改数据

               3、this.forceUpdate() 强制更新组件 (要写在componentDidMount中)

      ① render:渲染 UI 结构

      ② componentDidUpdate:发送网络请求以及获取 DOM 元素

    import React from 'react'
    
    /**
     * 触发组件更新的时机
     * props 值发生了改变
     * this.setState() 更改数据
     * this.forceUpdate() 强制更新组件 (要写在componentDidMount中)
     */
    
    export default class App extends React.Component {
     state = {
       age: 10
     }
    
     handle = () => {
       this.setState({
         age: this.state.age + 1 
       })
     }
    
     componentDidMount() {
     }
    
      render() {
        console.warn('我是父组件中的 render')
        return (
          <div>
            <h4>父组件</h4>
            <button onClick={this.handle}>更改数据</button>
            <hr/>
            <Son age={this.state.age}/>
          </div>
        )
      }
    }
    
    class Son extends React.Component {
      // 在更新阶段 首先执行的生命周期是 render
      // render 的作用也是渲染 UI 结构
      // 这个 render 实际上和创建阶段的 render 是同一个 render
      render() {
        console.warn('触发了子组件 render')
        return (
          <div>
            <h4>子组件</h4>
            <div>{this.props.age}</div>
          </div>
        )
      }
      // 在更新阶段,第二个执行的生命周期是 componentDidUpdate
      // componentDidUpdate的作用是发送网络请求以及获取 DOM 元素
      // 在这个阶段,更新的 DOM, 也就是 UI 结构已经渲染完成
      componentDidUpdate(prevProps) {
        console.warn('componentDidUpdate:组件更新完成')
        // 注意事项: 在componentDidUpdate 这个生命周期中,不能调用 this.setState
        // 因为容易造成死循环
        console.log('上一次数据:',prevProps,'更新后的数据:',this.props)
    
        // 如果要调用 this.setState 必须加一个 if 判断条件,也就是说,必须有一个终止的条件
        if (prevProps === this.props) {
          this.setState({
    
          })
        }
        // 为什么不能直接调用 this.setState
        // 因为 this.setState 会造成数据以及页面更新
        // 更新之后,就会造成组件更新,name组件只要一更新,就会调用 componentDidUpdate
        // 从而又调用 this.setState , 从而造成死循环
      }
    }

    三、销毁阶段的生命周期

      componentWillUnmount:在组件从页面中卸载,也就是在页面中不在使用该组件的时候

    import React from 'react'
    
    export default class App extends React.Component {
     state = {
       age: 10
     }
    
     handle = () => {
       this.setState({
         age: this.state.age + 1 
       })
     }
    
     componentDidMount() {
     }
    
      render() {
        // console.warn('我是父组件中的 render')
        return (
          <div>
            <h4>父组件</h4>
            <button onClick={this.handle}>更改数据</button>
            <hr/>
            {
              this.state.age === 13 ?
              <div>不渲染组件</div>
              : <Son age={this.state.age}/>
            }
          </div>
        )
      }
    }
    
    class Son extends React.Component {
      componentDidMount () {
        this.timer = setInterval(() => {
          console.log('定时器正在执行')
        },500) 
      }
      
      render() {
        // console.warn('触发了子组件 render')
        return (
          <div>
            <h4>子组件</h4>
            <div>{this.props.age}</div>
          </div>
        )
      }
      // 这是销毁时会执行的生命周期钩子函数
      // 作用:在组件从页面中卸载,也就是在页面中不在使用该组件的时候
      // 执行相关的清理操作,就是清除当前组件产生的一些冗余数据
      componentWillUnmount() {
        clearInterval(this.timer)
      }
    }
  • 相关阅读:
    Oracle 11g db_ultra_safe参数
    How To Configure NTP On Windows 2008 R2 (zt)
    Brocade光纤交换机密码重置 (ZT)
    perl如何访问Oracle (ZT)
    Nagios check_nrpe : Socket timeout after 10 seconds
    oracle10g单机使用ASM存储数据
    Xmanager无法连接Solaris10 (ZT)
    Solaris10配置iscsi initiator
    oracle 11g dataguard 创建过程
    Nagios check_procs pst3 报错
  • 原文地址:https://www.cnblogs.com/xiaowzi/p/12366724.html
Copyright © 2011-2022 走看看