react生命周期

react生命周期

  • React中组件有生命周期,也就是说也有很多钩子函数供我们使用, 组件的生命周期,我们会分为四个阶段,初始化、运行中、销毁、错误处理(16.3之后)

    生命周期钩子函数一定不要写成箭头函数

1. 初始化阶段

  1. constructor
  2. static getDerivedStateFromProps() ---- 将来会使用,
  3. componentWillMount()
    • UNSAFE_componentWillMount() 带有UNSAFE属于过时的钩子函数
    • componentWillMount会在17版本之后弃用(使用static getDerivedStateFromProps)
  4. render()
  5. componentDidMount()

2.更新阶段

  • propsstate的改变可能会引起组件的更新,组件重新渲染的过程中会调用以下方法:
  1. componentWillReceiveProps()
  2. static getDerivedStateFromProps()
  3. shouldComponentUpdate() // react性能优化第二方案
  4. componentWillUpdate()
  5. render()
  6. getSnapshotBeforeUpdate()---- 将来会使用
  7. componentDidUpdate()

3.卸载阶段

  1. componentWillUnmount()

4.错误处理

  1. componentDidCatch() — 16.3版本之后才有的

各生命周期详解

  • 初始化阶段
  1. constructor
  • 通过super来继承父类身上传递过来的属性,让后代组件通过this.props接收
  • 用来初始化一个状态
  • 用来初始化绑定一个方法,将this传递给这个方法
  • 注意:不写方法的触发(订阅) 不写具有副作用的代码(比如:定时器)
constructor(props){
    super(props)  //props接收
    this.state = {
        msg: 'hello constructor'
    }  // 初始化状态
    this.change = this.change.bind(this)
}

 change () {
    this.setState({
      msg: 'hello slj~~'
    })
  }

2.componentWillMount

  • 提供一次数据修改的机会
  • 进行数据请求(axios fetch)
  • 注意:虽然可以进行数据请求和初始化数据的修改,但是官方建议我们写在componentDidMount中。(可以减少副作用和订阅)
 componentWillMount(){
        //数据请求
        fetch('./data.json')
        .then(res=>res.json())
        .then(data=>console.log(data))
        .catch(error=>{if(error) throw error});
        
        //修改数据
        this.setState({
            msg:'睡懒觉'
        })
    }

3.render

  • 计算this.prop this.stare
  • 返回一种类型
    • react元素 通过jsx创建,既可以是dom元素,也可以是用户自定义的组件。
    • 字符串或数字,他们将以文本节点的形式渲染到dom中。
    • Portals react16版本中提出的新的解决方案,可以施组件脱离父组件层级直接挂载在DOM树的任何位置。
    • null 什么都不渲染
    • 布尔值 是什么都不渲染
  • render()方法必须是一个纯函数,他不应该改变state,也不能直接和浏览器进行交互,应该将事件放在其他生命周期函数中。
  • 如果shouldComponentUpdate()返回false,render()不会被调用
  • jsx->vdom 对象
  render(){
        return (
            <Fragment>
                <h3>Father组件</h3>
                <button onClick={this.change}>点击</button>
                <p>constructor: { this.state.msg}</p>
            </Fragment>
        )
    }

4.componentDidMount(组件挂载结束)

  • 数据请求
  • 数据修改
  • 将render函数生成的vdom对象渲染成真实dom,然后挂载在id为root的容器中
  • 如果要初始化第三方的dom库,也在这里进行初始化。只有到这里才能获取到真实的dom.
  • 通常在这里进行ajax请求
    componentDidMount(){
        fetch('./data.json')
        .then(res=>res.json())
        .then(data=>{console.log('componentDidMount');
            this.setstate({
            msg:data.name
            })
        })
        .catch(if(error)=>console.log(error))
    }

5.getDerivedStateFromProps

  • 数据请求
  • 数据修改
  • 返回值就是修改后的数据
  • 函数之前加一个static
static getDerivedStateFromProps(nextProps,provState){
    console.log(nextProps);//将来的属性
    console.log(provState);//变化前的值
    return{
        msg:'请求啊'
    }
}

  • 更新阶段
  1. compomentWillReciveProps
  • 触发: 属性发生改变,就会触发
  • 这个钩子函数一定能监听到整个当前组件的属性变化—>当前组件的路由也可以监听到
  • 应用场景 1.路由监听
componentWillReceiveProps(nextProps){
  console.log('componentWillReceiveProps');
  console.log(nextProps);//属性变化之后的值
}

2.shouldComponentUpdate(组件即将更新生成新的Vdom)

  • 决定组件是否更新
    • 返回值true ,更新
    • 返回值false ,不更新
  • 这个钩子函数是React性能优化的关键钩子
    shouldComponentUpdate(){
        
    }

3.compomentDidUpdate(组件更新结束)

  • 数据请求
  • DOM操作(第三方库的实例化)
  • 接受 getSnapshotBeforeUpdate() 第三个参数作为返回值
  • 使用fiber算法进行新vdom和旧vdom对比,生成新的patch对象在根据patch对象进行页面渲染
    componentDidUpdate ( ) {
    fetch( '/data.json' )
      .then( res => res.json())
      .then( data => console.log( 'componentDidUpdate',data ))
      .catch( error => {
        if( error ) console.log( error )
      })
    document.querySelector('h3').style.background = 'red'
    console.log( 'componentDidUpdate' )
  }
}
  • 卸载阶段
  1. componentWillUnmount
  • 组件外部销毁:开关【推荐】
  • 组件内部销毁:ReactDOM.unmountComponentAtNode( document.querySelector(’#root’) ) //必须是root
     destory = () => {
    ReactDOM.unmountComponentAtNode( document.querySelector('#root') ) //必须是root
  }
  render () {
    return (
      <Fragment>
        <div className = "father-box">

          <h3> Father组件 - 更新阶段</h3>
          <button onClick = { this.destory }> 内部销毁 </button>
          <p> constructor : { this.state.msg } </p>
          <p> money: { this.props.money } </p>
        </div>
      </Fragment>
    )
  }
  • 错误处理
  1. componentDidCatch(error, info)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值