【 React 】对React中类组件和函数组件的理解?有什么区别?

相关文章:
1 React 中的类组件
2 React中的函数组件

1. 类组件

类组件,也就是通过使用ES6类的编写形式去编写组件,该类必须继承React.Component

如果想要访问父组件传递过来的参数,可以通过this.props方式去访问
在组件中必须实现render方法,再通return中返回React对象

// 类组件
class Hello extends React.Component{
    constructor(props){
        super(props)
    }
    render(){
        return <h1>hello,{this.props.name}</h1>
    }
}

2. 函数组件

函数组件,就是通过函数编写的形式去实现一个React组件,是React中定义组件最简单的方式

//函数组件
function Hello(props){
    return <h1>hello,{props.name}</h1>

}

函数组件第一个参数为props 用于接收父组件传递过来的参数

3. 区别

针对两种React组件,其区别主要分成以下几个方向:

  • 编写形式
  • 状态管理
  • 生命周期
  • 调用方式
  • 获取渲染的值

3.1 编写形式

两种最明显的区别在于编写的形式不同,同一种功能的实现可以分别对应类组件和函数组件的编写形式

3.2 状态管理

在hooks出来之前,函数组件就是无状态组件,不能保管组件的状态,不像类组件中调用的setState
如果想要管理state状态,可以用useState,如下:

const FunctionComponent=()=>{
    const [count,setCount]=React.useState(0);
    return (
        <div>
            <p>count:{count}</p>
            <button onClick={()=>{
                setCount(count+1)
            }}>Click</button>
        </div>
    )
}

在使用hooks情况下,一般如果函数组件调用state,则需要创建一个类组件或者state提升到你的父组件中,然后通过props对象传递到子组件

3.3 生命周期

在函数组件中,并不存在生命周期 ,这是因为这些生命周期钩子都来自于继承的React.Component 所以,如果用到生命周期,就只能使用类组件
但是函数组件使用useEffect也能够完成替代生命周期的作用,这里给出一个简单例子

const FunctionComponent=()=>{
    useEffect(()=>{
        console.log('hello')
    },[])
    return <h1>hello,world</h1>

}

上述例子对应类组件中的componentDidMount 生命周期
如果useEffect回调函数中return 一个函数,则return 函数会在组件卸载的时候执行,整如componentWillUnmount

const FunctionComponent=()=>{
    React.useEffect(()=>{
       return ()=>{
        console.log('bye')
       }
    },[])
    return <h1>bye,world</h1>

}

3.4 调用方式

如果是一个函数组件,调用则执行函数即可:

function SayHi(){
    return <p>hello ,rui </p>
}
const result=SayHi(props) //<p>hello ,rui </p>

如果是一个类组件,则需要将组件进行实例化,然后调用 实例对象render方法:

//自己的代码
class SayHi extends React.Component{
    render(){
        return <h1>hello,rui</h1>
    }
}
//React 内部
const instance=new SayHi(props) //SayHi{}
const result=instance.render() //<p>hello ,rui </p>

3.5 获取渲染的值

函数组件代码对应如下

function ProfilePage(props) {
    const showInfo=()=>{
        alert('Hi'+props.user)
    }
    const handleClick=()=>{
        setTimeout(showInfo,5000)
    }
    return <button onClick={handleClick}>Hi</button>
}

类组件代码对应如下

class ProfilePage extends React.Component{
    showInfo(){
        alert('Hi'+this.props.user)  
    }
    handleClick(){
        setTimeout(this.showInfo.bind(this),5000)
    }
    render(){
        return <button onClick={this.handleClick.bind(this)}>Hi</button>
    }
}

两者看起来实现的功能是一致的,但是在类组件中,输出this.props.user,Props在React中是不可变的所以他永远不会改变,但是this总是可变的,以便在render和生命周期函数中读取新版本

因此,如果我们的组件在请求运行时更新。this.props将会改变。showInfo方法从最新的props中读取user

函数组件,本身就不存在this,props 并不发生改变,因此同样点击,alert 的内容仍旧是之前的内容

4.总结

函数组件语法更短、更简单,这使得它更容易开发、测试和理解 。
类组件会因为大量使用this让人困惑。

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小超人rui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值