一文带你搞懂React的函数组件

 更新时间:2023年06月16日 09:30:05   作者:何遇er  
React中函数式组件的基本意义是,组件实际上是一个函数,不是类,下面就来给大家介绍一下关于React中函数组件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

函数组件与类组件有什么区别?如果你对 React Hooks 有基本了解,在这里请抛开 React Hooks 回答这个问题。你的答案是函数组件没有自己的 state,也没有与类组件类似的生命周期概念吗?在本小节不讨论 state 和生命周期,先看一个函数调用的示例,代码如下:

function getName(params: {name: string}) {
    const count = 0
    return params.name + '-' + count
}
getName({name: '何遇'})
getName({name: 'Bella'})

getName 是一个纯函数,不产生任何副作用,当执行结束,它的执行上下文和活动对象会被销毁,前后两次调用互不影响。对于不使用任何 Hooks 的函数组件而言,它也是纯函数,那么函数组件前后两次渲染你还能得出与前后两次调用 getName 函数类似的结论吗?

要对比函数组件和类组件的区别,下面用类组件和函数组件实现相同的功能,即:在浏览器显示一个按钮,点击按钮调用 props 中的方法去更新父组件的 state,隔 1s 之后打印 props.count 的值。类组件的代码如下:

class ClassCom extends React.Component<Props, never> {
    render(): React.ReactNode {
        return (
            <button onClick={this.onClick}>这是类组件:刷新浏览器打开开发者工具再点击</button>
        )
    }

    onClick = () => {
	 this.props.updateCount()
        // 隔1s之后打印this.props.count的值
        setTimeout(() => {
            console.log(this.props.count)
        }, 1000);
    }
}

函数组件的代码如下:

function FuncCom(props: Props) {
    const onClick = () => {
        props.updateCount()
    // 隔1s之后打印props.count的值
        setTimeout(() => {
            console.log(props.count)
        }, 1000);
    }
    return (
        <button onClick={onClick}>这是函数组件:刷新浏览器打开开发者工具再点击</button>
    )
}

FuncCom 和 ClassCom 组件的父级相同,代码如下:

class FuncComVsClassCom extends React.Component<{},State> {
    state: State = {count: 0}
    render(): React.ReactNode {
        return (
            <>
                <FuncCom 
                    count={this.state.count}
                    updateCount={this.updateCount}
                />
                <ClassCom
                    count={this.state.count}
                    updateCount={this.updateCount}
                />
            </>
        )
    }
    updateCount = () => {
        this.setState((prevSate: State) => {
            return {count: prevSate.count + 1}
        })
    }
}

观察上述代码可以发现传递给 FuncCom 和 ClassCom 组件的 props 一样,但在浏览器界面上点击各自的按钮,开发者工具打印的结果不一样,FuncCom 组件打印的值为 0,ClassCom 组件打印的值为 1。

现在揭晓答案,点击 FuncCom 和 ClassCom 组件中的按钮都会使它们的父级重新渲染,从而导致 FuncCom 和 ClassCom 重新渲染。ClassCom 是类组件,它重新渲染不会创建新的组件实例,在 setTimeout 的回调函数中 this.props 拿到了最新的值。FuncCom 是函数组件,它重新渲染会创建新的执行环境和活动变量,所以在其中访问 props,不论何时拿到的都是调用 FuncCom 时传递给它的参数,该参数不可变。

FuncCom 和 ClassCom 组件打印出不同的值,原因在于 props 不可变但类组件实例是可变的,访问 this.props 将始终得到类组件最新的 props。将ClassCom 的 this.props 赋值给一个变量,在 setTimeout 的回调函数中,用该变量访问 count 属性能让两个组件打印出相同的值。

后续介绍React Hooks时将继续介绍函数组件只得到本次渲染时 props 和 state 的值。

到此这篇关于一文带你搞懂React的函数组件的文章就介绍到这了,更多相关React函数组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用React Router4实现的服务端直出渲染(SSR)

    利用React Router4实现的服务端直出渲染(SSR)

    这篇文章主要介绍了利用React Router4实现的服务端直出渲染(SSR),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • React.memo 实现原理解析

    React.memo 实现原理解析

    React.memo通过props浅比较或自定义函数,结合Fiber优化机制,跳过组件渲染及副作用,下面就来详细的介绍一下,感兴趣的可以了解一下
    2025-09-09
  • React实现文件上传和断点续传功能的示例代码

    React实现文件上传和断点续传功能的示例代码

    这篇文章主要为大家详细介绍了React实现文件上传和断点续传功能的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • React Component存在的几种形式详解

    React Component存在的几种形式详解

    这篇文章主要给大家介绍了关于React Component存在的几种形式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • React Redux使用配置详解

    React Redux使用配置详解

    react-redux是redux官方react绑定库,能够使react组件从redux store中读取数据,并且向store分发actions以此来更新数据,这篇文章主要介绍了react-redux的设置,需要的朋友可以参考下
    2022-08-08
  • React 如何向url中添加参数

    React 如何向url中添加参数

    这篇文章主要介绍了React 如何向url中添加参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • React antd tabs切换造成子组件重复刷新

    React antd tabs切换造成子组件重复刷新

    这篇文章主要介绍了React antd tabs切换造成子组件重复刷新,需要的朋友可以参考下
    2021-04-04
  • react antd-mobile ActionSheet+tag实现多选方式

    react antd-mobile ActionSheet+tag实现多选方式

    这篇文章主要介绍了react antd-mobile ActionSheet+tag实现多选方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 深入理解React合成事件

    深入理解React合成事件

    React的合成事件是一个跨浏览器统一的事件系统,它基于原生DOM事件构建,通过封装不同浏览器的事件实现差异,为开发者提供一致的事件处理接口,具有一定的参考价值,感兴趣的可以了解一下
    2026-01-01
  • 详解React中父子组件数据传递和修改的方式及原理

    详解React中父子组件数据传递和修改的方式及原理

    这篇文章主要为大家详细介绍了React中父子组件数据传递和修改的方式及原理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04

最新评论