首页 > 其他分享 >React之类组件与函数组件的区别

React之类组件与函数组件的区别

时间:2024-06-19 16:29:56浏览次数:9  
标签:count 生命周期 函数 React state 组件

 

       类组件和函数组件在React中是两种定义UI组件的方式,它们在语法、生命周期方法、状态管理等方面存在一些差异

函数组件

定义:函数组件是通过一个普通的 JavaScript 函数定义的,接受 props 作为参数,并返回一个 React 元素。

特点

  • 简洁、易于阅读和测试。
  • 无法使用生命周期方法(在使用 hooks 之前)。
  • 自 React 16.8 版本引入 hooks 之后,可以通过 useStateuseEffect 等 hook 实现状态和生命周期管理。

示例

import React, { useState, useEffect } from 'react';

const FunctionComponent = ({ name }) => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  }, [count]); // 依赖数组,只有 count 改变时才重新运行

  return (
    <div>
      <p>Hello, {name}!</p>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
};

export default FunctionComponent;

类组件

定义:类组件是通过 ES6 类定义的,必须继承 React.ComponentReact.PureComponent,并实现一个 render 方法。

特点

  • 可以使用生命周期方法(如 componentDidMountcomponentDidUpdatecomponentWillUnmount 等)。
  • 通过 this.statethis.setState 管理组件状态。
  • 较函数组件而言,代码可能更冗长,尤其是需要状态和生命周期管理时。

示例

import React, { Component } from 'react';

class ClassComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  componentDidMount() {
    document.title = `You clicked ${this.state.count} times`;
  }

  componentDidUpdate() {
    document.title = `You clicked ${this.state.count} times`;
  }

  render() {
    return (
      <div>
        <p>Hello, {this.props.name}!</p>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}

export default ClassComponent;

主要区别

  1. 定义方式

    • 函数组件:通过函数定义,直接接收props作为参数并返回组件的UI,没有自己的状态。
    • 类组件:通过继承 React.Component 类定义,拥有自己的状态(state)和生命周期方法。
  2. 状态管理

    • 函数组件:使用 useState hook 管理状态。
    • 类组件:使用 this.statethis.setState 管理状态,是组件内的局部状态管理,它只在单个组件内部存在和使用。每个类组件可以有自己的状态,这些状态不会与组件树中的其他组件共享(除非通过props显式传递)
  3. 生命周期方法

    • 函数组件:使用 useEffect 等 hook 模拟生命周期方法。
    • 类组件:直接使用 componentDidMountcomponentDidUpdatecomponentWillUnmount 等生命周期方法。
  4. 代码简洁度

    • 函数组件:代码通常更简洁、易读。
    • 类组件:代码可能更冗长,尤其是涉及状态和生命周期管理时。

什么时候使用哪种组件?

  • 函数组件

    • 组件逻辑简单,无需复杂的生命周期管理。
    • 适用于大多数场景,特别是自 React 16.8 引入 hooks 之后,函数组件可以处理大多数以前只能在类组件中处理的情况。
  • 类组件

    • 需要使用生命周期方法,且项目中尚未完全迁移到 hooks。
    • 维护旧项目或与旧项目中的类组件兼容。

        我更推荐使用函数组件开发,函数组件遵循函数式编程思想,而类组件则遵循面向对象编程思想。函数式编程强调不可变性和无副作用,使得函数组件更易于预测和测试。而面向对象编程则通过封装属性和方法来简化代码组织,但在某些情况下可能增加测试的复杂性,而且函数组件相对于类组件来说更轻量级,执行效率更高。

标签:count,生命周期,函数,React,state,组件
From: https://blog.csdn.net/weixin_44921693/article/details/139806463

相关文章

  • 小程序的小组件技术能力和场景解析
    随着移动互联网的快速发展,小程序等轻量级应用平台日益成为用户获取信息和服务的重要渠道。而小组件也在其中扮演了至关重要的角色,不仅能够提升用户的交互体验,还能帮助开发者高效地构建功能丰富、界面美观的小程序。一、什么是小程序里的小组件众所周知,小程序就是无需安装即可运......
  • 从0到1使用vite搭建react项目保姆级教程(持续更新中)
    一、vite创建react项目要使用Vite创建一个React项目,你需要按照以下步骤操作:1、确保你已经安装了Node.js(建议使用最新的稳定版本)。2、使用npm命令安装ViteCLI工具,再来创建项目npmcreatevite@latestmy-vite-app 3、运行上述命令后,按照提示选择“create-react-app”......
  • MYSQL 数字(Aggregate)函数
    目录1、AVG()2、MAX()3、MIN()4、SUM()5、COUNT()6、LIMIT()1、AVG()解释:返回数值列(字段)的平均值。语法格式:SELECTAVG(column_name)FROMtable_name中文注释:select AVG(数值列/字段)from表名;用法:SELECTAVG(column_name)FROMtable_name2、MAX()解......
  • Python快速进修指南:函数基础
    今天介绍的是函数,讨论函数以及与Java方法的区别。python具体学习资料在下方分享:与Java方法不同,函数不需要像Java方法一样讲究修饰符等其他特性,它只需要使用"def"关键字进行声明。另外,函数的参数也与Java方法有所不同,Java方法中不存在默认参数的概念,而在Python中,函数参数是可......
  • 如何使用csproj构建C#源代码组件NuGet包?
    一般我们构建传统的NuGet包,都是打包和分发dll程序集文件。至于打包和分发C#源代码文件的做法,比较少见。那么这种打包源代码文件的做法,有什么优点和缺点呢?优点:方便阅读源代码。方便断点调试。减少Assembly程序集模块加载个数。更利于发布期间的剪裁(PublishTrimmed选项)。......
  • 如何使用csproj构建C#源代码组件NuGet包?
    一般我们构建传统的NuGet包,都是打包和分发dll程序集文件。至于打包和分发C#源代码文件的做法,比较少见。那么这种打包源代码文件的做法,有什么优点和缺点呢?优点:方便阅读源代码。方便断点调试。减少Assembly程序集模块加载个数。更利于发布期间的剪裁(PublishTrimmed选项)。......
  • C/C++ 操作文件常用的函数
    C语言中操作文件常用的函数包括但不限于以下几种:打开和关闭文件fopen(constchar*path,constchar*mode):用于打开一个文件,返回一个指向FILE结构体的指针,path是文件路径,mode定义了文件的打开模式(如读、写、追加等)。fclose(FILE*stream):关闭由fopen()打开的文件,并刷新缓......
  • Java调用mysql后台函数的例子
    在Java中调用MySQL后台的存储函数(注意,这里我们区分存储过程和存储函数:存储过程没有返回值,但可以通过输出参数返回数据;而存储函数有一个返回值)时,你需要使用CallableStatement来执行这个函数并获取返回值。以下是一个简单的例子,说明如何在Java中调用MySQL的存储函数:MySQL存储函......
  • vue通讯中provide / inject适⽤于隔代组件通信原理和例子
    在Vue中,provide和inject是用于实现跨层级组件通信的API,特别适用于隔代组件通信的场景。下面我将详细解释其原理和提供一个具体的例子。原理定义:provide:允许一个祖先组件向其所有子孙后代组件提供一个依赖,不论组件层次有多深,只要在其下游,就可以通过inject来接收。injec......
  • 如何使用csproj构建C#源代码组件NuGet包?
    一般我们构建传统的NuGet包,都是打包和分发dll程序集文件。至于打包和分发C#源代码文件的做法,比较少见。那么这种打包源代码文件的做法,有什么优点和缺点呢?优点:方便阅读源代码。方便断点调试。减少Assembly程序集模块加载个数。更利于发布期间的剪裁(PublishTrimmed选项)。......