React中的生命周期和子组件

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日

相关文章

  • 传统HTML页面实现模块化加载的方法

    传统的HTML页面实现模块化加载可以使用以下两种方法: 1. iframe方法 使用iframe可以将一个HTML页面分割成多个小块,每个小块独立加载,从而实现模块化加载。以下是具体的实现步骤: 划分模块:将页面划分成多个小块,比如header、footer、sidebar等等。 创建iframe:在需要加载每个小块的位置上创建一个iframe元素。 设置i…

    other 2023年6月25日
    00
  • 阿里路由框架ARouter 源码解析之Compiler

    阿里路由框架ARouter 源码解析之Compiler ARouter是一款阿里巴巴开源的Android路由框架,它提供了一种方便快捷的方式来实现组件之间的通信和页面跳转。在ARouter的源码中,Compiler模块起着重要的作用,它负责将注解处理器生成的代码编译成可执行的代码。下面是Compiler模块的详细解析。 1. Compiler模块的作用 Co…

    other 2023年10月13日
    00
  • C++ using namespace std 用法深入解析

    下面是关于”C++ using namespace std 用法深入解析”的完整攻略。 1. 什么是using namespace std? 在C++中,标准库被命名为std。当我们使用标准库时,需要在代码中使用前缀“std::”来指示我们要使用的库。用using namespace std就能够避免在代码中频繁地使用“std::”。 关于using nam…

    other 2023年6月27日
    00
  • 电脑数字键打不出数字怎么版 电脑小键盘数字键不能用的解决方法

    电脑数字键打不出数字怎么办 电脑小键盘数字键不能用的解决方法 电脑键盘数字键无法使用是一个常见的问题,但通常可以通过以下方法来解决: 解决方法一:检查小键盘是否开启 一些笔记本电脑可能没有小键盘,在这种情况下,只能使用主键盘靠近字母区的数字键。对于那些有小键盘的电脑,当你按下“Num Lock”键时小键盘会开启,而数字键就可以正常工作。如果你发现小键盘无法正…

    other 2023年6月27日
    00
  • MySQL中使用正则表达式详情

    MySQL中使用正则表达式攻略 MySQL提供了正则表达式的支持,可以在查询中使用正则表达式进行模式匹配。下面是使用正则表达式的详细攻略。 正则表达式函数 MySQL提供了以下几个函数用于正则表达式匹配: REGEXP:用于在查询中进行正则表达式匹配。 REGEXP_INSTR:返回匹配正则表达式的字符串的起始位置。 REGEXP_REPLACE:用于替换匹…

    other 2023年8月19日
    00
  • zip伪加密(deprecated)

    zip伪加密(deprecated) 在过去,一些人使用Zip伪加密来保护其机密数据。然而,这种方法已经被证明是不安全的,因为它只是简单地让Zip文件看起来加密,并没有真正的对文件进行加密。 什么是Zip伪加密? Zip伪加密是一种不安全的对Zip文件进行加密的方法。使用此方法,您可以打开一个看起来是加密的Zip文件,但实际上Zip文件中存储的所有文件可以很…

    其他 2023年3月28日
    00
  • 正则表达式中的正向预查和负向预查

    正则表达式中的正向预查和负向预查 正向预查和负向预查是正则表达式中的两种特殊的匹配模式,它们用于在匹配过程中进行前瞻性的判断,而不会实际消耗输入字符串。这使得我们可以在匹配特定模式之前或之后添加额外的条件。 正向预查(Positive Lookahead) 正向预查用于在匹配位置之后查找特定模式。它的语法为(?=pattern),其中pattern是我们要查…

    other 2023年8月3日
    00
  • 苹果系统capslock键不能切换大小写怎么办? mac无法大写锁定的解决办法

    苹果系统Caps Lock键不能切换大小写的解决办法 如果你的Mac无法使用Caps Lock键来切换大小写,可能是由于一些设置问题或者软件冲突导致的。下面是一些可能的解决方法: 方法一:检查键盘设置 打开“系统偏好设置”(System Preferences)。 点击“键盘”(Keyboard)选项。 在“键盘”选项卡中,确保“使用F1、F2等键作为标准功…

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