react创建组建的基本方式

构造函数创建组件

当前目录结构如下:

构造函数创建组件的代码写在的Hello.jsx中,在index.js引用此文件:

index.js引用react ,react-dom, 和Hello文件,


import React from 'react';//创建组建,虚拟DOM元素,生命周期
import ReactDom from 'react-dom';//把创建好的组件和虚拟DOM放到页面上展示

import Hello from '@/components/Hello'

构造函数的数据是从外部引入的,所以数据写到index.js中,然后在index.js中渲染构造函数:

const user = {
    name: '点点',
    age: 5,
    gender: 'boy'
}
ReactDom.render(<div>
    1:
 <Hello name={user.name} age={user.age} gender={user.gender} list={user}></Hello>
    2:
<Hello {...user}></Hello>
</div>, document.getElementById('app'))

上面写了两种传值方式,一种是普通传值,一种是es6传值(...user),意思是,将user这个数组的每一个数值都传递给Hello 这个组件。

然后在Hello.jsx中写构造函数,此文件需要引入react,并且在最后暴露构造函数:

import React from 'react'

function Hello(props) {
    //return null;//1、return 为null时,表示,此组建为空,什么都不渲染;
    // 2、在组建中必须返回一个合法的jsx虚拟dom元素
    console.log(props)
    // console.log(users, 'users')
    return <div>this is hello com --{props.name}--{props.age}--{props.gender}
    </div>
}
// 把组件暴漏出去
export default Hello;

在这个文件中props接受的是来自index.js中传来的数据,index.js分别传值分别调用,并且传入的值只读,不可修改;传入的值也属于实例属性;

class关键字创建组件

语法:

class 组件名称 extends React.Component{
    //render渲染当前虚拟DOM对应的结构
    render(){
        return <div>this is a class zujian</div>
    }
}

每个class关键字创建的组件中必须有render和renturn 返回的合法的jsx;

index.js不变,Hello的引入路径修改为“04.class关键字创建react组件“

在04.class关键字创建react组件.js文件中也需要引入react,最后也要暴露这个函数:

import React from 'react';
class Hello extends React.Component{
    constructor(){
        super();
        // 先调用super(),才能使用this
        this.state={
            msg:'大家好'
        };

    }
    
    // render 渲染当前虚拟DOM对应的结构
    // 不论是class还是function 创建的组件,他们的props都是只读的

    render(){
        this.state.msg='大家好,我也好!';
        return <div>{this.props.name}---{this.props.age}---{this.state.msg}</div>
    }
}
export default Hello 

在class关键字创建的组件中,可以自定义私有值,比如上面的state,state可读可写,但是props是只读的;

在class关键字组件的this,指的是,组件的实例对象;

上面是在不同的文件中使用class关键字创建组件,但是若要是在同一个文件中创建若干个class关键字组件,并且这些组件有相同的部分,那么写法如下:

// 父类(原型对象)
class Person{
constructor(name,age){
this.name=name;
this.age=age;
}
}
//在class类中,可以使用extends关键字实现子类继承父类
//语法 class 子类 extends 父类{}
//子类,美国人
// class American{
// constructor(name,age){
// this.name=name;
// this.age=age;
// }
// }
class American extends Person{}
const a1=new American('jack',20);
console.log(a1);
//子类,中国人
// class Chinese{
// constructor(name,age){
// this.name=name;
// this.age=age;
// }
// }
class Chinese extends Person{
 constructor(name,age,id){
        super(name,age);
        this.id=id;
    }
}
const a2=new Chinese('zhangsan',22,2);
console.log(a2);

上面的a1和a2分别输出“jack 20”“zhangsan 22 2”

1、为什么要在constructor中调用super?

    如果一个子类通过extends关键字继承了父类,那么在子类的constructor构造函数中,必须优先调用super();调用super后,需要通过super给父类传值,不然,父类的name,age会为undefined;

2、super()是什么?

    super()是一个函数,代表父类的构造器,子类中的super是父类中constructor构造器的引用;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值