React组件生命周期详解

在使用react创建组件的过程中,会调用一个render方法,以及触发若干生命周期的方法。本文主要和大家讲一讲这些生命周期的方法是何时被执行的。

理解组件的生命周期,当组件被创建或销毁时,可以执行某些操作。此外,当 props 和 state 发生改变的时候,你可以利用这些生命周期的钩子来改变你的组件。

生命周期

为了清楚的了解生命周期,我们需要明白 组件初始化state 改变props 改变组件卸载 ,以及调用 forceUpdate() 时,哪些钩子函数会被执行。

组件初始化

React组件生命周期详解

constructor()

React组件的构造函数将会在装配之前被调用。当为一个React.Component子类定义构造函数时,你应该在任何其他的表达式之前调用super(props)。否则,this.props在构造函数中将是未定义。

构造函数是初始化状态的合适位置。若你不初始化状态且不绑定方法,那你也不需要为你的React组件定义一个构造函数。

可以基于属性来初始化状态。这样有效地“分离(forks)”属性并根据初始属性设置状态。这有一个有效的React.Component子类构造函数的例子:

constructor(props) {  super(props);  this.state = {    color: props.initialColor  };}

登录后复制

componentWillMount()

componentWillMount()

登录后复制

componentWillMount()在装配发生前被立刻调用。其在render()之前被调用,因此在这方法里同步地设置状态将不会触发重渲。避免在该方法中引入任何的副作用或订阅。

这是唯一的会在服务端渲染调起的生命周期钩子函数。通常地,我们推荐使用constructor()来替代。

render()

render()方法是必须的。

当被调用时,其应该检查this.props 和 this.state并返回以下类型中的一个:

React元素。 通常是由 JSX 创建。该元素可能是一个原生DOM组件的表示,如

,或者是一个你定义的合成组件。

字符串和数字。 这些将被渲染为 DOM 中的 text node。

Portals。 由 ReactDOM.createPortal 创建。

null。 什么都不渲染。

布尔值。 什么都不渲染。(通常存在于 return test && 写法,其中 test 是布尔值。)

当返回null 或 false时,ReactDOM.findDOMNode(this) 将返回 null。
render()函数应该纯净,意味着其不应该改变组件的状态,其每次调用都应返回相同的结果,同时不直接和浏览器交互。若需要和浏览器交互,将任务放在componentDidMount()阶段或其他的生命周期方法。保持render() 方法纯净使得组件更容易思考。

注意若 shouldComponentUpdate() 返回false,render()函数将不会被调用。

componentDidMount()

componentDidMount()

登录后复制

componentDidMount()在组件被装配后立即调用。初始化使得DOM节点应该进行到这里。若你需要从远端加载数据,这是一个适合实现网络请求的地方。在该方法里设置状态将会触发重渲。

State Changes

React组件生命周期详解

shouldComponentUpdate()

shouldComponentUpdate(nextProps, nextState)

登录后复制

使用shouldComponentUpdate()以让React知道当前状态或属性的改变是否不影响组件的输出。默认行为是在每一次状态的改变重渲,在大部分情况下你应该依赖于默认行为。

当接收到新属性或状态时,shouldComponentUpdate()在渲染前被调用。默认为true。该方法并不会在初始化渲染或当使用forceUpdate()时被调用。

当他们状态改变时,返回false 并不能阻止子组件重渲。

注意:如果只定义方法,不写任何返回值,会提示:shouldComponentUpdate(): Returned undefined instead of a boolean value.

注意即使属性未有任何改变,React可能也会调用该方法,因此若你想要处理改变,请确保比较当前和之后的值。这可能会发生在当父组件引起你的组件重渲。

装配期间,React并不会调用带有初始属性的componentWillReceiveProps方法。其仅会调用该方法如果某些组件的属性可能更新。调用this.setState通常不会触发componentWillReceiveProps。

componentWillUpdate()

componentWillUpdate(nextProps, nextState)

登录后复制

当接收到新属性或状态时,componentWillUpdate()为在渲染前被立即调用。在更新发生前,使用该方法是一次准备机会。该方法不会在初始化渲染时调用。

注意你不能在这调用this.setState(),若你需要更新状态响应属性的调整,使用componentWillReceiveProps()代替。

注意:若shouldComponentUpdate()返回false,componentWillUpdate()将不会被调用。

componentDidUpdate()

componentDidUpdate(nextProps, nextState)

登录后复制

当接收到新属性或状态时,componentWillUpdate()为在渲染前被立即调用。在更新发生前,使用该方法是一次准备机会。该方法不会在初始化渲染时调用。

注意:你不能在这调用this.setState(),若你需要更新状态响应属性的调整,使用componentWillReceiveProps()代替。

注意:若shouldComponentUpdate()返回false,componentWillUpdate()将不会被调用。

Props Changes

React组件生命周期详解

componentWillReceiveProps()

componentWillReceiveProps(nextProps)

登录后复制

componentWillReceiveProps()在装配了的组件接收到新属性前调用。若你需要更新状态响应属性改变(例如,重置它),你可能需对比this.props和nextProps并在该方法中使用this.setState()处理状态改变。

注意:即使属性未有任何改变,React可能也会调用该方法,因此若你想要处理改变,请确保比较当前和之后的值。这可能会发生在当父组件引起你的组件重渲。

装配期间,React并不会调用带有初始属性的componentWillReceiveProps方法。其仅会调用该方法如果某些组件的属性可能更新。调用this.setState通常不会触发componentWillReceiveProps。

Unmounting

React组件生命周期详解

componentWillUnmount()

componentWillUnmount()

登录后复制

componentWillUnmount() 在组件被卸载和销毁之前立刻调用。可以在该方法里处理任何必要的清理工作,例如解绑定时器,取消网络请求,清理任何在componentDidMount环节创建的DOM元素。

forceUpdate

React组件生命周期详解

默认情况,当你的组件或状态发生改变,你的组件将会重渲。若你的render()方法依赖其他数据,你可以通过调用forceUpdate()来告诉React组件需要重渲。

调用forceUpdate()将会导致组件的 render()方法被调用,并忽略shouldComponentUpdate()。这将会触发每一个子组件的生命周期方法,涵盖,每个子组件的shouldComponentUpdate() 方法。若当标签改变,React仅会更新DOM。

通常你应该尝试避免所有forceUpdate() 的用法并仅在render()函数里从this.props和this.state读取数据。

forceUpdate() Example

// forceUpdate() Exampleclass App extends React.Component{  constructor(){    super();    this.forceUpdateHandler = this.forceUpdateHandler.bind(this);  };  componentWillUpdate() {    console.info('componentWillUpdate called');  }  componentDidUpdate() {    console.info('componentDidUpdate called');  }  forceUpdateHandler(){    this.forceUpdate();  };  render(){    return(      

Random Number : { Math.random() }

); }}ReactDOM.render(, document.getElementById('app'));

登录后复制

相关推荐:

React组件Dragact 0.1.4详解

React组件生命周期实例分析

React组件的生命周期函数是什么

以上就是React组件生命周期详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2786114.html

(0)
上一篇 2025年3月8日 17:39:54
下一篇 2025年3月6日 08:18:41

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS函数实例详解

    函数是由事件驱动的或者当它被调用时执行的可重复代码块,JavaScript函数语法,函数就是包裹在花括号中的代码块,前面使用了关键词function: function functionname(){     这里是要执行的代码 } 当调用…

    编程技术 2025年3月8日
    200
  • js编译和执行顺序详解

    Javascript是一段一段执行的,以script标签来分割,执行每一段之前,都有一个“预编译”, 预编译干的活有两:1.声明所有var变量(初始为undefined),2.解析定义式函数语句。  有个关于 “window作用域下,a =…

    编程技术 2025年3月8日
    200
  • JS原型详解说明

    本文主要和大家分享JS原型详解说明,原型的5个规则,希望本文能帮助到大家。 所有的引用类型(数组,对象,函数),都具有对象特性,即可自由扩展属性(除了“null”) var obj ={};obj.a=100//100var arr=[];…

    编程技术 2025年3月8日
    200
  • js变量提升详解

    1.JavaScript代码执行分为两个阶段: 预解析阶段:在预解析阶段,js会对以var声明的变量,和function开头的语句块进行提升,将var声明的变量和function 提升至代码的最前面。需要注意的时,function整体提升,…

    编程技术 2025年3月8日
    200
  • js普通函数和构造函数详解

    本文主要和大家分享js普通函数和构造函数,希望能帮助大家更好理解什么是js普通函数和构造函数。 1、构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写 2、构造函数和普通函数的区别在于:调用方式不一样 3、普通函数…

    2025年3月8日 编程技术
    200
  • js数组去重和排序详解

    本文主要和大家分享js数组去重和排序详解,希望能帮助到大家。 1、用 indexof  查看是否存在,不存在没添加 var arr = [‘aa’,’aa’,’aa’,’bb’,’bb’,3,5,8,9,4,5,4];function un…

    编程技术 2025年3月8日
    200
  • JS异步编程实例详解

    JS语言的执行环境是“单线程”为什么会出现异步编程呢? 单线程是指一次只能完成一件任务。如果有多个任务的话就必须排队,等前面的任务执行完才能执行下一个任务。 两种任务执行模式:同步和异步 “异步模式”: 回调函数是异步编程最基本的方法。每一…

    编程技术 2025年3月8日
    200
  • 关于CSS结构与层叠详解

    css 是 cascading style sheets 的缩写,这暗示层叠(cascade)的概念是很重要的。在最基本的层面上,它表明css规则的顺序很重要,但它比那更复杂。什么选择器在层叠中胜出取决于三个因素(这些都是按重量级顺序排列的…

    编程技术 2025年3月8日
    200
  • 简单介绍React

    本文主要和大家分享一下react的起源及发展,希望啊能帮助到大家。 字符拼接时代 – 2004 时间回到 2004 年,Mark Zuckerberg 当时还在宿舍捣鼓最初版的 Facebook 。这一年,大家都在用 PHP 的…

    2025年3月8日 编程技术
    200
  • jQuery中的isPlainObject()实例详解

    jquery中的isplainobject() 函数用于判断指定参数是否是一个纯粹的对象,返回值为boolean类型。 “纯粹的对象”,就是通过 { }、new Object()、Object.create(null…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论