React 函数式组件和类式组件区别

news/2024/7/15 20:16:51 标签: react.js, 前端, javascript

React 中组件主要分为函数式组件和类式组件两种类型。

一、函数式组件

函数式组件 (也称无状态组件,没有内部状态state,16.8版本推出hooks后可使用useState来管理) 就是通过函数编写形式去实现一个React组件,是React中定义组件最简单的方式。

javascript">// 定义函数式组件
import React from 'react'

function MyComponent() {
    return <div>我是函数式组件...</div>
}    

export default MyComponent

二、类式组件

类式组件就是通过ES6类的编写形式去编写组件,该类必须继承React.Component 如果想要访问父组件传递过来的参数,可通过 this.props方式去访问。

javascript">// 类式组件
import React, { Component } from 'react'

class MyComponent extends Component {
    constructor(props) {
        super(props)
    }

    render(){
        return <div>我是类式组件...</div>
    }
}

export default MyComponent

 说明:类式组件中必须实现render方法,在return中返回React对象。

三、函数式组件和类式组件的区别

特性函数式组件类式组件 
语法函数
内部状态 (state)不支持支持
生命周期方法不支持 (需借助 hooks)支持 (componentDidMount, componentDidUpdate 等)
引入外部状态 (props)支持支持
副作用处理 (如 useEffect)支持支持
代码复用可以使用 Hooks 实现可以使用继承、高阶组件等方式实现
状态管理工具支持支持
性能通常更轻量,React 16.8+ 中引入的 Hooks 使其更强大在某些情况下可能更快,但具体取决于实现方式

说明:React Hooks 是对 React 函数式组件的一种扩展,通过一些特殊的函数,让函数式组件拥有类式组件才拥有的能力。 常用的官方 hooks 有 useRef、useState、useEffect等。

函数式组件和类式组件管理状态方式如下: 

javascript">// 类式组件 - 使用 setState 管理状态
import React, { Component } from 'react'

class MyComponent extends Component {
    state = {
        name: '张三丰'
    }

    changeName = () => {
        this.setState({
            name: '王新焱'
        })
    }

    render() {
        return (
            <div>我是{this.state.name}</div>
            <button onClick={this.changeName}>修改姓名</button>
        )
    }
}

export default MyComponent


// 函数式组件 - 使用 hooks 管理状态
import React, { useState, useEffect } from 'react'

function MyComponent() {
    
    // hooks
    let [name, setName] = useState('张三丰')
    
    // hooks -对象形式
    let [name2, setName2] = useState({name: '张三丰',age: 180,address: '武当山'})
    
    // 修改姓名
    function changeName() {
        setName(() => '王新焱')
        setName2(() => ({name: 'wxy', age: 30, address: '黄冈'}))
    }

    // hooks
    useEffect(()=> {
        console.log('函数式组件生命周期...')
    },[])

    return (
        <div>
            <p>我是函数式组件</p>
            <button onClick={changeName}>修改姓名</button>

            <div>我的名字是:{name}</div>
            <div>我的名字是:{name2.name},我的年龄:{name2.age} 我的地址: {name2.address}</div>
        </div>
    )
}

export default MyComponent

四、未来趋势

”类组件“的模式并不能很好的适应未来的趋势,主要是以下几点

①.this的模糊性

②.业务逻辑散落在生命周期中

③.React 的组件代码缺乏标准的拆分方式。 而使用 Hooks 的函数组件可以提供比原先更细粒度的逻辑组织复用,且能更好地适应时间切片与并发模式。

React 16.8 + 版本推出了Hooks 使函数式组件拥有类组件的功能,比如生命周期阶段 

componentDidMount VS useEffect

componentDidUpdate VS useEffect

shouldComponentUpdate VS useMemo 

函数式组件即可使用替代方案来实现类式组件中的生命周期钩子函数。

从未来趋势看,由于官方React Hooks的推出,生命周期概念的淡出,函数组件可以完全取代类组件。其次继承并不是组件最佳的设计模式,官方更推崇”组由于继承“的设计概念,所以类组件在这方面的优势也在淡出,函数组件成了社区未来主推的方案,函数组件本身轻量简单,在hooks的基数上提供了比原先更细粒度的逻辑组织与复用,更能适应React的未来发展。


http://www.niftyadmin.cn/n/5072056.html

相关文章

【Godot】时间线(技能)节点

4.1 游戏中一般都会有各种各样的技能&#xff0c;或者其他需要按一定的时间顺序去执行的功能。 这里我写出了一个时间线节点&#xff0c;就像是在播放动画一样&#xff0c;按一定的阶段去执行某些功能 # # Timeline # # - author: zhangxuetu # - datetime: 2023-09-24 23…

网络代理技术:保障隐私与增强安全

在当今高度互联的数字世界中&#xff0c;网络代理技术正逐渐崭露头角&#xff0c;为用户提供了保护隐私和增强网络安全的有力工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫开发中的应用&#xff0c;助您更好地理解和利用这些技术。 1. Socks5代理&#xff…

Verilog HDL阻塞赋值和非阻塞赋值笔记

1. module test( input wire clk, input wire b, output reg a, output reg c ); always(posedge clk) begin ab; ca; end endmodule 上面的代码在vivado中综合后的电路为&#xff1a; 2. module test( input wire clk, input wire b, outp…

STM32 CubeMX ADC采集(HAL库)

STM32 CubeMX ADC采集&#xff08;HAL库&#xff09; STM32 CubeMX STM32 CubeMX ADC采集&#xff08;HAL库&#xff09;ADC介绍ADC主要特征一、STM32 CubeMX设置二、代码部分三&#xff0c;单通道轮询采样速度总结 ADC介绍 12位ADC是一种逐次逼近型模拟数字转换器。它有多达1…

leetcode 518. 零钱兑换 II、377. 组合总和 Ⅳ

518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 …

安卓游戏出现闪退 然后报空指针异常

查看错误日志&#xff1a; 首先&#xff0c;查看应用程序的错误日志&#xff0c;以了解闪退和空指针异常的详细信息。通过以下方式访问错误日志&#xff1a; 在Android Studio中使用Logcat查看。使用adb logcat命令从命令行查看。查找应用程序崩溃报告&#xff08;如果有的话&a…

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

flutter开发实战-video_player插件播放抖音直播实现&#xff08;仅限Android端&#xff09; 在之前的开发过程中&#xff0c;遇到video_player播放视频&#xff0c;通过查看video_player插件描述&#xff0c;可以看到video_player在Android端使用exoplayer&#xff0c;在iOS端…

【C++入门到精通】C++入门 —— 红黑树(自平衡二叉搜索树)

阅读导航 前言一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树结构&#xff08;带有头结点的红黑树&#xff09;五、红黑树的插入操作1. 按照二叉搜索的树规则插入新节点2. 新节点插入后&#xff0c;红黑树的变色以及旋转情况1&#xff1a; cur为红&#xff0…