React中创建组件的两种方式和传参

第一种方式使用普通的Function(构造函数):

function Hello(){ 
return <div>哈哈哈</div> 
}

注意点:
注意组件的名称首字母必须是大写
在组件中,必须return返回一个合法的jsx虚拟DOM元素 用的话直接把组件名称丢到页面上即可

[普通Function构造函数创建组件为组件传递数据:]

 RenderDOM.render(
 <div>
  <Hello  name={dog.name} age={dog.age}> </Hello>
</div>
)

【接收外界传过来的数据】
在构造函数中,使用props形参,接收外界 传递过来的数据

function Hello(props){
   console.log(props)
   props.name = zs  //报错。结论:**无论是vue还是react,组件中的props永远都是只读的;不能被重新赋值**
  return <div> 这是Hello组件 --{props.name}---{props.age}</div>
}

第二种创建组件的方式(使用class关键字)

在这里插入图片描述

上图是先带我们了解:如何用class关键字,也能实现普通函数的方式去创建对象。分清什么是实例方法和静态方式,实例属性和静态属性。
*【实例的属性 或方法 】 都是通过new 出来的实例对象来访问的
【静态的属性或方法】 都是直接通过class类名来访问的 *
**记住静态属性和方法都挂载给了constructor 构造函数 并不在对象原型身上!!!

注意:

  1. 在class的{}区间内,只能写 构造器,静态方法和静态属性,实例方法
  2. class关键字内部,还是用普通的构造函数来实现的(本质并没有改变);所以说;我们把class关键字 称作语法糖

class中的extends关键字
在class类中,可以使用 extends 关键字,实现子类继承父类
语法:class子类 extends父类{}

在这里插入图片描述

为什么要用extends ?
有时候我们创建了多个class类,它们里面的属性很多都一样,这样的话;可以使用extends给我们把共同的数据放到一个父类里面,子类直接使用extends关键字 来进行访问父类的属性,相当于prototype

class Father {
  constructor(name,age){
    this.name = name 
    this.age = age
  }
}
class p1 extends Father{
  constructor(name,age){
    //这个super相当于Father的constructor
    super(name,age)
    this.name = name  //语法规范,在子类中 ,this只能放到super之后使用
  }
}

1:为什么一定要在 constructor 中调用super ?
答案: 因为,如果一个子类,通过extends关键字继承了父类,那么,在子类的 constructor构造函数中,必须优先调用一下super()
2:super是个什么东西
super是一个函数,而且它是父类的构造器;子类中的super,其实就是父类中,constructor构造器的一个引用

React中最基本的组件结构

注意:如果要使用class定义组件,必须 让自己的组件,继承自 React.Component

class 组件名称 extends React.Component {
  constructor(){
   //由于Movie组件,继承了React.Component这个父类,所以自定义构造函数中,必须调用super()
    super()
   //只有调用了super()以后,才能使用关键字this
   this.state = {msg:"哈哈哈"}  就相当于vue中 data( { return { } } )             this.state.***的数据都是可读可写的
  }
 //在组件内部,必须有 render函数,render函数的作用,是渲染 当前组件所对应的 虚拟DOM结构
 render(){
    //render函数中,必须return返回合法的jsx虚拟DOM结构
    return  <div> 这是 class创建的组件 ---this.props.name  注意在 class组件内部,this表示当前组件的实例对象 </div>
  }
}

class关键字中访问外界传过来的数据
在class关键字创建的组件中,如果想使用 外界传过来的props参数,不需要接收,直接通过this.props.***就能访问
注意:不论是class还是普通 function创建的组件,它们的props都是只读的;不能被重新赋值

两种创建组件方式的对比
使用class关键字创建的组件,有自己的私有数据(this.state)和生命周期 ;用class关键字创建出来的组件,叫做有状态组件(因为有自己的私有数据)
使用function创建的组件,只有props,没有自己的私有数据和生命周期;所以叫做无状态组件 【今后用的不多】
【有状态组件和无状态组件本质区别就是】: 有无state属性和 有无生命周期函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值