react函数组件和类组件的区别个人文章

importReactfrom'react'constWelcome=(props)=>{return

welcome,{props.name}

}exportdefaultWelcome这个函数接收一个props对象并返回一个react元素

你也可以使用ES6class语法去写一个组件:

importReactfrom'react'classWelcomeextendsReact.Component{constructor(props){super(props)}render(){return

welcome,{this.props.name}

}}exportdefaultWelcome这两个版本是等价的,它们具有相同的输出。那么我们应该去选择哪一种实现方式呢?下面我们来对他们进行比较

两者最明显的不同就是在语法上,函数组件是一个纯函数,它接收一个props对象返回一个react元素。而类组件需要去继承React.Component并且创建render函数返回react元素,这将会要更多的代码,虽然它们实现的效果相同。

我们更深入的了解下,使用babel7分别对他们进行转译函数组件转译结果:

"usestrict";var_interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=void0;var_react=_interopRequireDefault(require("react"));varWelcome=functionWelcome(props){return_react["default"].createElement("h1",null,"welcome,",props.name);};var_default=Welcome;exports["default"]=_default;类组件转译结果:

因为函数组件是一个纯函数,你不能在组件中使用setState(),这也是为什么把函数组件称作为无状态组件。

如果你需要在你的组件中使用state,你可以选择创建一个类组件或者将state提升到你的父组件中,然后通过props对象传递到子组件。

你不能在函数组件中使用生命周期钩子,原因和不能使用state一样,所有的生命周期钩子都来自于继承的React.Component中。

因此,如果你想使用生命周期钩子,那么需要使用类组件。

注意:在react16.8版本中添加了hooks,使得我们可以在函数组件中使用useState钩子去管理state,使用useEffect钩子去使用生命周期函数。因此,2、3两点就不是它们的区别点。从这个改版中我们可以看出作者更加看重函数组件,而且react团队曾提及到在react之后的版本将会对函数组件的性能方面进行提升。

如果SayHi是一个函数,React需要调用它:

//你的代码functionSayHi(){return

Hello,React

}//React内部constresult=SayHi(props)//

Hello,React

如果SayHi是一个类,React需要先用new操作符将其实例化,然后调用刚才生成实例的render方法:

//你的代码classSayHiextendsReact.Component{render(){return

Hello,React

}}//React内部constinstance=newSayHi(props)//SayHi{}constresult=instance.render()//

Hello,React

可想而知,函数组件重新渲染将重新调用组件方法返回新的react元素,类组件重新渲染将new一个新的组件实例,然后调用render类方法返回react元素,这也说明为什么类组件中this是可变的

这一点是他们最大差异,但又常常被人们忽略。

考虑以下组件:

functionProfilePage(props){constshowMessage=()=>{alert('Followed'+props.user);}consthandleClick=()=>{setTimeout(showMessage,3000);}return(Follow)}UserProfile组件很简单,就一个Follow按钮,该按钮使用了setTimeout模拟网络请求。用户点击这个按钮之后会弹出一个警告框。如果props.user为'Dan',它将在三秒钟后显示'FollowedDan'。

我们如何将其编写为类?天真的翻译可能像这样:

classProfilePageextendsReact.Component{showMessage(){alert('Followed'+this.props.user);}handleClick(){setTimeout(this.showMessage.bind(this),3000);}render(){returnFollow}}通常认为这两个代码段是等效的。人们经常在这些模式之间自由重构,而没有注意到它们的含义

但是,这两个代码段是完全不同的。好好看看他们。你看到区别了吗?

分别按下面的顺序来操作Follow按钮:

你会发现函数组件和类组件是有区别的:

函数组件:按上面所列的三个步骤操作时,当用户在3s前更改下拉选择框的选项时,h1的用户名会立马改变,而3s后弹出的警告框中的用户名并不会改变类组件:按上面所列的三个步骤操作时,当用户在3s前更改下拉选择框的选项时,h1中的用户名会立马改变,而3s后弹出的警告框中的用户名也会改变

那么,为什么我们的类示例会这样表现呢?

让我们仔细看一下showMessage类中的方法:

因此,如果组件在请求重新渲染时,this.props将会改变。showMessage方法会从新的props中读取user。你所看到的效果也正是因为这个原因。

在React中的组件,UI在概念上可以理解是程序当前状态的函数,那么事件处理就是让UI的渲染结果一部分一部分可视化输出。我们的事件处理程序属于具有特定props和state的特定渲染。但是,当回调超时的话,this.props就会打破这种联系。示例中的showMessage方法在回调时没有绑定到任何特定的渲染,因此它会丢失真正的props。

那么我们有没有一种较好的方式可以使用正确的props来修复render和showMessage回调之间的联系。我们可以在事件发生的早期,将this.props传递给超时完成的处理程序来尝试着解决这个问题。这种解决方式属于闭包的范畴。

classProfilePageextendsReact.Component{showMessage(user){alert('Followed'+user);}handleClick(){cosnt{user}=this.propssetTimeout(this.showMessage.bind(this,user),3000);}render(){returnFollow}}我们使用闭包机制将上一状态的值保存下来待showMessage方法调用。即使this.props发生变化,但并不改变user

这种方法虽然解决我们前面所提到的问题,但是这种方法代码会随着props的个数增加,代码也会变得更加冗余也易于出错。如果我们也需要访问state。如果showMessage调用另一个方法,该方法会读取this.props.something或this.state.something。我们又会碰到同样的问题。所以我们必须通过this.props作为showMessage的参数来修复它们之间存在的问题。

或许,我们可以在类的构造函数中绑定这些方法:

classProfilePageextendsReact.Component{render(){//获取propscosntprops=this.props//它们不是类方法constshowMessage=()=>{alert('Followed'+props.user);}consthandleClick=()=>{setTimeout(showMessage,3000)}returnFollow}}这样一来,函数组件和类组件所达到的效果都一样了。在类组件中可以捕获渲染时的props。效果上看上去是一样了,但看起来怪怪的。如果在类组件中的render中定义函数而不是使用类方法,那么还有使用类的必要性?

THE END
1.类组件和函数式组件的区别类组件和函数组件区别在React的生态系统中,组件是构建用户界面的基本单元。React最初引入了类组件(Class Components)和函数式组件(Functional Components)两种组件类型。虽然这两种组件都可以实现相同的功能,但它们有各自的特点、优缺点和适用场景。本文将详细探讨类组件和函数式组件的区别,以及在实际开发中的应用。 https://blog.csdn.net/My_wife_QBL/article/details/140871717
2.react类组件和函数组件区别有哪些问答React 类组件和函数组件是两种不同的组件写法,它们之间有以下几个主要区别: 语法:React 类组件是通过 ES6 的 class 语法来定义的,而函数组件是通过函数来定义的。 写法:React 类组件需要继承 React.Component 类,并且使用 render() 方法来渲染组件的 JSX,而函数组件只需要直接返回 JSX 即可。 生命周期:React 类https://www.yisu.com/ask/2044141.html
3.React:函数组件与类有什么不同?函数组件捕获渲染的值。 让我们来解释下这意味着什么。 注意: 这篇文章不是对类或函数的价值判断。我只描述了React中这两种编程模型之间的区别。有关更广泛地采用功能的问题,请参阅Hooks FAQ。 考虑这个组件: functionProfilePage(props){constshowMessage=()=>{alert('Followed '+props.user);};consthandleClickhttps://www.jianshu.com/p/26926857ff73
4.前端面试知识题7.React2、hooks用过吗?聊聊react中class组件和函数组件的区别 类组件是使用ES6 的 class 来定义的组件。 函数组件是接收一个单一的 props 对象并返回一个React元素。 关于React的两套API(类(class)API 和基于函数的钩子(hooks) API)。官方推荐使用钩子(函数),而不是类。因为钩子更简洁,代码量少,用起来比较"轻",而https://developer.aliyun.com/article/1149037
5.聊聊函数式组件与类组件有何不同React 中最关键的知识点就是组件,在 React 16.8 之前(还没有 Hooks 前),我们的应用大多写成 Class 组件,因为 Class 组件有生命周期,能控制状态(state)。https://www.51cto.com/article/702921.html
6.一杯茶的时间,上手React框架开发我们还提出了组件的概念,但是并没有深入讲解它,在下一小节中我们将详细地讲解组件的知识。 Component React 的核心特点之一就是组件化,即我们将巨大的业务逻辑拆分成一个个逻辑清晰的小组件,然后通过组合这些组件来完成业务功能。 React 提供两种组件写法:1)函数式组件 2)类组件。 函数式组件 在React 中,函数https://www.imooc.com/article/298788
7.北京师范大学研究生院本课程重点培养编程思想和解决实际问题的能力。通过掌握Python语言的基本语法,利用Python的标准库和科学计算扩展库,解决数值、文本、图像等几类典型数据处理的实际问题;掌握程序设计的主要思想,养成良好的编程习惯,形成运用计算思维方法解决问题的能力,为进一步开展科学研究奠定基础。 http://ss.graduate.bnu.edu.cn/py/yzkc/detail?id=6267af01-f562-43f3-8c1e-f1dd062a233d
8.轻松学会React钩子:以useEffect()为例二、类和函数的差异 严格地说,类组件和函数组件是有差异的。不同的写法,代表了不同的编程方法论。 类(class)是数据和逻辑的封装。也就是说,组件的状态和操作方法是封装在一起的。如果选择了类的写法,就应该把相关的数据和操作,都写在同一个 class 里面。 http://www.ruanyifeng.com/blog/2020/09/react-hooks-useeffect-tutorial.html