zoukankan      html  css  js  c++  java
  • 08.React组件进阶(四)组件的生命周期

    组件的生命周期

    意义:组件的生命周期有助于理解组件的运行方式,完成更复杂的组件功能,分析组件错误原因等

    组件的生命周期:组件从被创建到挂载到页面中运行,再到组件不用时卸载的过程

    生命周期的每个阶段总是伴随着一些方法的调用,这些方法就是生命周期的钩子函数

    钩子函数的作用:为开发人员在不同阶段操作组件提供了时机

    只有类组件 才有生命周期

    生命周期的三个阶段

    1.每个阶段的执行时机
    2.每个阶段钩子函数的执行顺序
    3.每个阶段钩子函数的作用
    

    1.创建时(挂载阶段)

    执行时机:组件创建时(页面加载时)
    执行顺序:constructor() render() componentDidMount()

    钩子函数:constructor()
    触发时机:创建组件时,最先执行
    作用:1.初始化state 2.为事件处理程序绑定this

    钩子函数:render()
    触发时机:每次组件渲染都会触发
    作用:渲染UI(注意:不能调用setState())

    钩子函数:componentDidMount()
    触发时机:组件挂载(完成DOM渲染后)
    作用:1.发送网络请求 2.DOM操作

    2.更新时阶段

    执行时机:1.setState() 2.forceUpdate() 3.组件接收到新的props
    说明:以上三者任意一种变化,组件就会重新渲染
    执行顺序: render() componentDidUpdate()

    钩子函数:render()
    触发时机:每次组件渲染都会触发
    作用:渲染UI(与挂载阶段 是同一个render)

    钩子函数:componentDidUpdate()
    触发时机:组件更新(完成DOM渲染)后
    作用:1.发送网络请求 2.DOM操作 (注意:如果要setState()必须放在一个if条件中,如果直接调用,会导致递归更新)

    class App extends React.Component{
       state={
           count:0
       }
       handleClick=()=>{
           this.setState({
               count:this.state.count+1
           })
       }
       render(){
         return(
             <div>
                 <Child  count={this.state.count}/>
                <button onClick={this.handleClick}>打豆豆</button>
             </div>
         )
       }
        componentDidUpdate(prevProps){
            console.warn('--子组件--生命周期钩子函数:componentDidUpdate')
            //正确做法
            //比较更新前后的props是否相同,来决定是否重新渲染组件
            console.log('上一次的props:',prevProps,',当前的props:‘,this.props)
            if(prevProps.count !== this.props.count){
                this.setState({})
                //发送ajax请求的代码
            }
        }
    }
    
    class Child extends React.Component{
        render(){
            return(
            <h1>打了多少个豆豆:{this.props.count}</h1>
            )
        }
    }
    ReactDOM.render(<App />,document.getElementById('root'))
    

    3.卸载时(卸载阶段)

    执行时机:组件从页面中消失

    钩子函数:componentWillUnmount()
    触发时机:组件卸载(从页面中消失)
    作用:执行清理工作(比如:清理定时器等)

    
    import PropTypes from 'prop-types'
    
    class App extends React.Component{
       state={
           count:0
       }
       handleClick=()=>{
           this.setState({
               count:this.state.count+1
           })
       }
       render(){
         return(
             <div>
                 {
                     this.state.count>3?<p>豆豆被打死了~</p>: <Child  count={this.state.count}/>
                 }
                <button onClick={this.handleClick}>打豆豆</button>
             </div>
         )
       }
    
    }
    
    class Child extends React.Component{
        componentDidMount(){
            //开启定时器
            this.timerId=setInterval(()=>{
                console.log('定时器正在执行。。。')
            },500)
        }
        render(){
            return(
            <h1>打了多少个豆豆:{this.props.count}</h1>
            )
        }
        componentWillUnmount(){
            console.warn('生命周期钩子函数:componentWillUnmount')
            //清理定时器
            clearInterval(this.timerId)
        }
    }
    ReactDOM.render(<App />,document.getElementById('root'))
    
  • 相关阅读:
    ansible 2.2的源码编译安装
    存储过程-快速上手
    从库重启后报1062错误
    删除一张600万记录表的一个索引需要多长时间?
    mysql主从复制Error1205
    浅谈管理(三)如何管理资料库
    kettle之时间字段默认值为空或’0000-00-00’问题
    浅谈管理(二)项目管理
    乌龙之Ignoring query to other database问题
    一、安装
  • 原文地址:https://www.cnblogs.com/foreverLuckyStar/p/12247056.html
Copyright © 2011-2022 走看看