React中的生命周期和子组件

yizhihongxing

React是一个流行的JavaScript库,它使用了一个叫做"组件"的概念。在React中,组件是一个可重用的单元,可以通过组装它们来构建更大的组件。React组件有生命周期,生命周期包括挂载、更新和卸载三个阶段。

React的生命周期方法

mount(挂装)

  • constructor()

在一个React组件被挂载之前,React会先执行构造函数。它是React组件的第一个调用的方法。我们可以使用它来初始化组件的状态(state)或者绑定方法(这里的方法通常指绑定$this的可执行函数)。

  • getDerivedStateFromProps(props, state)

getDerivedStateFromProps()是一个生命周期方法,其目的是将传递的props应用于组件状态和返回更新的state。并且返回值必须是state或者null。

  • render()

在render()函数中,React组件将组件数据转化为虚拟DOM树,这些虚拟DOM最终将被用于在页面上渲染一些真正的浏览器可视化页面元素。

  • componentDidMount()

在render()函数调用完成之后,组件开始渲染到页面上。在组件被页面挂载后,React会调用componentDidMount()方法.在这个方法中,可以开始发送Ajax请求,监听事件或者其他我们可能需要做的有副作用的操作。

update方法

  • shouldComponentUpdate(nextProps, nextState)

当组件接收到新的props或者state时,React将尝试判断组件是否需要进行重新渲染。组件在每个渲染周期中都会调用shouldComponentUpdate()来告诉React是否允许进行重新渲染。默认情况下,shouldComponentUpdate()会返回true。但是,我们可以对其进行重写并对其进行性能优化。

  • getSnapshotBeforeUpdate(prevProps, prevState)

React使用getSnapshotBeforeUpdate()来提供在组件更新之前读取DOM状态的机会。例如,在内容滚动固定位置之前记住滚动条的位置。

  • componentDidUpdate(prevProps, prevState, snapshot)

组件更新后,React将调用 componentDidUpdate()方法,此时组件通常会更新状态或者在此期间请求数据。

unmount(卸载)

  • componentWillUnmount()

当组件即将从DOM中卸载时,componentWillUnmount()将被调用。在这里,处理事件监听器、定时器或者占用内存的任何组件都可以进行卸载操作。

React的子组件

当我们定义一个组件时,我们可以将其定义为子组件,在父组件中使用子组件的方式.

创建React组件

import React from "react";

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

export default Welcome;

上述代码中创建了一个名为Welcome的React组件。它只是一个无状态的组件,它仅仅显示了props接收到的一个name值。

在父组件中引用Welcome

import Welcome from "./Welcome";

class App extends React.Component {
  render() {
    return (
      <div>
        <Welcome name="Jason" />
        <Welcome name="Tom" />
        <Welcome name="Jerry" />
      </div>
    );
  }
}

export default App;

我们可以在App父组件中引用Welcome组件三次,并传入不同的name值作为其props。这将会渲染三次Welcome组件,每个都显示了不同的文本“Hello,Jason”、“Hello,Tom”和“Hello,Jerry”。

示例

我们假设我们正在操作一个React组件(App)通过props中获得的数据来定义一个嵌套组件。

import React, { Component } from 'react'

export default class App extends Component {

  state = {
    users: [{
      name: 'James',
      age: 25,
      country: 'England'
    },{
      name: 'Lisa',
      age: 34,
      country: 'America'
    },{
      name: 'Alan',
      age: 23,
      country: 'Australia'
    }]
  }

  componentDidMount() {
    this.timer = setInterval(() => {
      let addYears = [...this.state.users];
      addYears.forEach(element => {
        element.age += 1;
      })
      this.setState({ users: addYears });
    }, 1000);
  }

  componentWillUnmount() {
    clearInterval(this.timer);
  }

  render() {
    const { users } = this.state; 
    return (
      <div>
        <h1>Users</h1>
        <UserList users={users} />
      </div>
    )
  }
}

const UserList = ({ users }) => {
  return (
    <ul>
    {users.map((user, index) =>
      <User 
        key={index}
        name={user.name}
        age={user.age}
        country={user.country}
      />
    )}
  </ul>
  )
}

const User = ({ name, age, country}) => 
  <li>{name} - {age} - {country}</li>

在这个例子中,我们首先使用React.useState()来初始化一个包含用户对象的users变量。 然后,我们编写了一个定时器来每秒钟增加每个用户的年龄。这个组件也定义了一个叫做UserList的子组件,用来渲染所有用户的列表,和User组件,每个user可作为一个列表项(li)进行处理。最后,我们在App组件中调用了UserList组件,并将上一步中声明的users数组传递给它。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:React中的生命周期和子组件 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Win10 Build预览版20231怎么手动升级?

    当Win10预览版的新版本发布后,这些版本通常会优先推送给参与Windows Insider计划的用户。如果你想尝试最新的Win10 Build预览版,可以按照以下步骤手动升级。 注意:由于Win10预览版的性质,可能存在稳定性等各种问题,因此在升级前请备份好你的数据。 步骤一:加入Windows Insider计划 首先,你需要加入Windows Insi…

    other 2023年6月27日
    00
  • r-如何更改ggplot2的scale_fill_brewer中仅一个值的颜色?

    R-如何更改ggplot2的scale_fill_brewer中仅一个值的颜色? 在ggplot2中,scale_fill_brewer函数可以用于设置颜色调色板。有时候,我们需要改调色板中仅一个值的颜色。本文将介绍如何实现这个目标,并提供两个示例说明。 步骤1:使用scale_fill_manual函数 我们可以使用scale_manual函数来手动设置色…

    other 2023年5月8日
    00
  • C语言数组全面总结梳理

    C语言数组全面总结梳理 基本概念 数组是一种数据结构,在C语言中,它可以被定义为一个有限元素的序列,每个元素都有一个固定的类型,并通过递增的索引来访问。假设我们定义了一个包含10个整数的数组,我们可以通过a[0]、a[1]、a[2]等相应的索引来访问它们。 从技术上讲,数组是由相同的数据类型的元素组成的连续内存空间。当我们声明一个数组时,我们需要指定元素的类…

    other 2023年6月25日
    00
  • fopen打开文件失败的问题

    fopen打开文件失败的问题 在开发中,我们经常需要读写文本文件。而其中最基本的操作就是打开文件,然而,有时我们会遇到打开文件失败的问题,这可能会导致程序异常崩溃,给我们带来很多麻烦。本文将讨论fopen常见的问题,以及如何进行有效的调试。 问题1:找不到文件 当我们调用fopen函数时,如果指定的文件路径不存在,就会发生找不到文件的错误。例如,下面的代码将…

    其他 2023年3月28日
    00
  • JS实现的页面自定义滚动条效果

    JS实现的页面自定义滚动条效果可以通过手动改变元素的scrollTop属性来实现。以下是详细的实现步骤: 用HTML/CSS创建一个滚动条容器元素,例如div元素,并在其中嵌入另一个内容元素,例如ul/li列表等。可以使用自定义CSS样式来设置滚动条容器的样式。 <div class="scroll-container"> &…

    other 2023年6月25日
    00
  • Unity编辑器下重启的方法

    下面是Unity编辑器下重启的方法的完整攻略。 Unity编辑器下重启的方法 1. 通过菜单栏重启Unity编辑器 在Unity编辑器中,可以通过菜单栏的“File” -> “Exit”选项关闭编辑器。然后再通过桌面快捷方式或者启动程序重新打开Unity编辑器即可完成重启。 示例: 点击菜单栏中的“File”选项 选择“Exit”选项,关闭Unity编…

    other 2023年6月27日
    00
  • microsoft office2016怎么自定义设置标题栏主题?

    自定义设置标题栏主题,是指在Microsoft Office 2016软件中,用户可以根据自己的偏好,自定义设置标题栏的颜色和风格。下面是设置标题栏主题的完整攻略: 第一步:打开Microsoft Office 2016软件 首先需要打开Microsoft Office 2016软件,比如Word、Excel、PowerPoint等。选择任何一个软件,因为设…

    other 2023年6月25日
    00
  • java-@nullable注释用法

    Java @Nullable注释用法 在Java中,我们可以使用@Nullable注释来标记一个变量、参数或返回值可以为null。这个注释可以帮助我们在编译时测潜在的空指针异常,并提高代码的可读性和可维护性。在本攻略中,我们将介绍@Nullable注释的用法,并提供一些示例说明。 用法 @Nullable注释可以用于以下情况: 变量:标记一个变量可以为nul…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部