为什么React要区分Class和function定义的组件?

React内部是通过调用组件的定义来获取被渲染的节点,而对于不同的组件定义方式,其获取节点的步骤也不一样。如下:

//function方式定义
function Example() {
  return <div>this is a div</div>;
}

const node = Example(props);

// 类方式定义
class Example extends React.Component {
  render() {
    return <div>this is a div</div>;
  }
}

const instance = new Example(props);
const node = instance.render();

在这里,函数直接调用,类则需要先实例化再去调用实例化对象上的render方法;

如果将类按照普通函数去调用会怎么样呢?答案是会报错;

在早期没有类的时候,我们用构造函数来代替它,如果不用new去调用这个构造函数,它不会报错,但函数内部的this将会指向全局等。这可以不用new来调用构造函数的情况,很容易让人分不清构造函数和普通函数。
es6给出了类的概念,《ECMAScript 6 入门》中提到过:

类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。

那么如果给函数也加上new会怎么样呢?

这里有两个问题:
=> 箭头函数用new调用会报错。这么设计是因为箭头函数中this不指向自身,而是指向离它们最近的常规函数。没有了this,它作为构造函数的用法也就变得毫无意义了。
=> 另一种情况是如果函数返回不是对象,那么该返回值无用。JavaScript允许用户在使用new去实例化对象时,用return的对象来代替本该由new返回的对象。但如果返回的不是对象,它会被忽略;

综上所述,因为类和函数自身的区别导致了它们必须要被分开调用;

文章参考:https://overreacted.io/how-does-react-tell-a-class-from-a-function/

React中,可以混合使用Class组件Function组件。通常情况下,Class组件用于较复杂的逻辑和状态管理,而Function组件则用于简单和无状态的展示层组件。 下面是一个示例,展示了如何在同一个父组件中混合使用Class组件Function组件: ```jsx import React, { Component } from 'react'; // Class组件 class Counter extends Component { constructor(props) { super(props); this.state = { count: 0 }; } incrementCount = () => { this.setState(prevState => ({ count: prevState.count + 1 })); } render() { return ( <div> <h2>计数器</h2> <p>当前计数:{this.state.count}</p> <button onClick={this.incrementCount}>增加</button> </div> ); } } // Function组件 const Greeting = () => { return ( <div> <h2>欢迎信息</h2> <p>欢迎来到React混合组件示例!</p> </div> ); } // 父组件 const App = () => { return ( <div> <Greeting /> <Counter /> </div> ); } export default App; ``` 在上述代码中,我们定义了一个Class组件`Counter`和一个Function组件`Greeting`。`Counter`组件有一个计数器状态,并且有一个增加计数的方法。`Greeting`组件只负责展示欢迎信息。 在父组件`App`中,我们将`Greeting`组件和`Counter`组件一起渲染。这样,我们就实现了Class组件Function组件的混合使用。 请注意,在React 16.8版本之后,引入了Hooks API,使得Function组件也可以具有状态和生命周期的特性,因此在新的React项目中,建议优先使用Function组件和Hooks。但是,仍然可以在需要的情况下使用Class组件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值