React基础篇(四)之创建组件方式分析

本小将讲述在 React 中,
1、通过函数 function 方式创建组件并分离成单独的组件实现,然后传递参数给组件使用
2、通过 关键字 class 来创建组件,并分离成单独的组件实现,然后传递参数给组件使用以及创建私有属性使用

1 React中创建组件方式一 function

1.1 创建组件并在浏览器中渲染效果
//第一步 导入依赖
//这两个导入进,接收的成员变量名称必须这样写

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


//创建组合的第一种方式
function HelloWorld() {
  //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
  return null;
}

const rootDiv = <div>
  这里是创建组件的第一种方式
  <hr/>
  <HelloWorld/>

</div>;

//第三步 使用ReactDOM 把虚拟DOM 渲染到页面上
// 参数一 要渲染的虚拟DOM元素
// 参数二 指定页面上的容器
ReactDOM.render(rootDiv, document.getElementById('app'));

运行在浏览器中
在这里插入图片描述
在这里我们创建了一个 HelloWorld 组件,在组件中返回了null ,所以在浏览器中什么这个组件什么也没有渲染。

//创建组合的第一种方式
function HelloWorld() {
  //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
  // return null;
  //在这里必须返回一个合法的 JSX 虚拟 DOM 元素
  return <div>这里是 HelloWorld 组件 </div>
}

然后运行在浏览器中的效果
在这里插入图片描述

1.2 为组件传递数据
//第一步 导入依赖
//这两个导入进,接收的成员变量名称必须这样写

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


//创建组合的第一种方式
//传入参数
function HelloWorld(props) {
  //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
  // return null;
  //在这里必须返回一个合法的 JSX 虚拟 DOM 元素
  //在这里需要注意的是 形参 props 的值永远是只读的,不可以重新被赋值
  return <div>这里是 HelloWorld 组件 传入参数 name : {props.name} age :{props.age}</div>;
}

const people = {
  name: '张三',
  age: 29
};
const rootDiv = <div>
  这里是创建组件的第一种方式
  <hr/>
  {/*使用组件并传入参数*/}
  <HelloWorld name={people.name} age={people.age}/>

</div>;

//第三步 使用ReactDOM 把虚拟DOM 渲染到页面上
// 参数一 要渲染的虚拟DOM元素
// 参数二 指定页面上的容器
ReactDOM.render(rootDiv, document.getElementById('app'));

在这里插入图片描述
在传递参数的时候,我们可以注意一下

const rootDiv = <div>
  这里是创建组件的第一种方式
  <hr/>
  {/*使用组件并传入参数 这里是将所有的属性分别写出来*/}
  <HelloWorld name={people.name} age={people.age}/>
  <hr/>
  {/*使用组件并传入参数 如果属性比较多,不逐一写出来时,可以这样传参数*/}
  {/* ... 个点代表展开 es6语法*/}
  <HelloWorld {...people}/>

</div>;
1.3 将编写的 HelloWorld 组件抽离

在src目录下创建components 文件夹,创建 HelloWorld.jsx文件




//创建组合的第一种方式
//传入参数
import React from 'react';

function HelloWorld(props) {
  //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
  // return null;
  //在这里必须返回一个合法的 JSX 虚拟 DOM 元素
  //在这里需要注意的是 形参 props 的值永远是只读的,不可以重新被赋值
  return <div>这里是 HelloWorld 组件 传入参数 name : {props.name} age :{props.age}</div>;
}




//把组件暴露出去
export default HelloWorld

或者写成

//创建组合的第一种方式
//传入参数
import React from 'react';

export function HelloWorld(props) {
  //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
  // return null;
  //在这里必须返回一个合法的 JSX 虚拟 DOM 元素
  //在这里需要注意的是 形参 props 的值永远是只读的,不可以重新被赋值
  return <div>这里是 HelloWorld 组件 传入参数 name : {props.name} age :{props.age}</div>;
}

然后在 index.js 中使用的时候导入

//导入HelloWorld组件
//默认,如果不做单独配置的话,不能省略 .jsx 后缀名
import HelloWorld from './components/HelloWorld.jsx'

如果要省略后缀名,需要在webpack.config.js 配置文件中
在这里插入图片描述
配置好后重新运行项目,在导入组件时就可以写成

//导入HelloWorld组件
//默认,如果不做单独配置的话,不能省略 .jsx 后缀名
//配置好resolve 后,可以不写.jsx后缀名,程序自动补全
import HelloWorld from './components/HelloWorld'

然后在这里我们可以使用别名来表示路径

//导入HelloWorld组件
//默认,如果不做单独配置的话,不能省略 .jsx 后缀名
// 这里使用到的@ 表示项目根目录中的 src 这一层
import HelloWorld from '@/components/HelloWorld.jsx'

这里使用到了 @ 符号,那么在 webpack.config.js 中进行配置
在这里插入图片描述

2 React中使用class创建组件方式

ES6 中 class 关键字是实现面向对象的

//创建组合的第二种方式
//传入参数
import React from 'react';

export default class ClassHelloWorld extends React.Component {
  //在组件中必须有 render函数 用来渲染 DOM结构
  render() {
    return (
        <div>
          这里是使用class关键字创建的组件
        </div>
    );
  }
}

在这里插入图片描述
然后在index.js中使用时,先导入

//第一步 导入依赖
//这两个导入进,接收的成员变量名称必须这样写

//用来创建组件、虚拟DOM元素 生命周期
import React from 'react';
//所创建好的组件和虚拟DOM放到页面上展示
import ReactDOM from 'react-dom';
//导入HelloWorld组件
//默认,如果不做单独配置的话,不能省略 .jsx 后缀名
// 这里使用到的@ 表示项目根目录中的 src 这一层
import HelloWorld from '@/components/HelloWorld';
//这里是使用 class 创建的组件
import ClassHelloWorld from '@/components/ClassHelloWorld';
//这里j 模拟数据
const people = {
  name: '张三',
  age: 29
};
const rootDiv = <div>
  这里是创建组件的第一种方式
  <hr/>
  {/*使用组件并传入参数 这里是将所有的属性分别写出来*/}
  <HelloWorld name={people.name} age={people.age}/>
  <hr/>
  {/*使用组件并传入参数 如果属性比较多,不逐一写出来时,可以这样传参数*/}
  {/* ... 个点代表展开 es6语法*/}
  <HelloWorld {...people}/>
  <hr/>
  这里是创建组件的第二种方式
  <hr/>
  {/*使用组件*/}
  <ClassHelloWorld/>


</div>;

//第三步 使用ReactDOM 把虚拟DOM 渲染到页面上
// 参数一 要渲染的虚拟DOM元素
// 参数二 指定页面上的容器
ReactDOM.render(rootDiv, document.getElementById('app'));
2.2 向 class 方式创建的组件中传入参数
  <ClassHelloWorld {...people}/>

在 ClassHelloWorld 组件中通过 props 关键字使用传入的参数

//创建组合的第二种方式
//传入参数
import React from 'react';

export default class ClassHelloWorld extends React.Component {
  //在组件中必须有 render函数 用来渲染 DOM结构
  render() {
    return (
        <div>
          这里是使用class关键字创建的组件
          <p> 传递的参数 name:{this.props.name} age:{this.props.age}</p>
        </div>
    );
  }
}

浏览器中效果
在这里插入图片描述
在 class 组件中,可通过 this.state 来定义使用组件私有属性数据

//创建组合的第二种方式
//传入参数
import React from 'react';

export default class ClassHelloWorld extends React.Component {

  //在构建函数中
  //初始化私有数据 
  constructor(){
    super()
    this.state={
      city:"中国山西太原"
    }
  }
  //在组件中必须有 render函数 用来渲染 DOM结构
  render() {
    return (
        <div>
          这里是使用class关键字创建的组件
          {/*这里通过 this.props 来调用外部传递过来的参数*/}
          <p> 传递的参数 name:{this.props.name} age:{this.props.age}</p>
          {/*然后在这里通过 this.state 来调用私有数据*/}
          <p> 这里是组件内的私有属性{this.state.city}</p>
        </div>
    );
  }
}

3 React中function 与class 两种创建方式的对比

  • 使用class 关键字创建的组件,有自己的私有数据和生命周期,使用function 创建的组件,只有props,没有自己私有数据和生命周期
  • 用 function 创建出来的组件中做 无状态组件,用class关键字创建出来的组件 叫做有状态组件

4 组件中 props 与state/data 的区别

4.1 区别一
  • props 中的数据都是外界传递过来的
  • state / data 中的数据 都是组件私有的
4.2 区别二
  • props 中的数据都是只读的,不能重新赋值
  • state/data 中的数据是可读可写的

5 列表实例

//第一步 导入依赖
//这两个导入进,接收的成员变量名称必须这样写

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


//父组件
class CourseList extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      courseList: [
        {id: 1, userNmae: '张三', courseName: '语文'},
        {id: 2, userNmae: '张三2', courseName: '语文2'},
        {id: 3, userNmae: '张三3', courseName: '语文3'}
      ]
    };
  }

  render() {
    return (
        <div>

          <h1>课程统计列表</h1>
          {/*这里通过map 来构建*/}
          {this.state.courseList.map(item => <CourseItem {...item}/>)}

        </div>
    );
  }
}

//列表中条目的组件

class CourseItem extends React.Component {
  render() {
    return (
        <div key={this.props.id}>
          <h2>姓名:{this.props.userNmae}</h2>
          <p>课程内容: {this.props.courseName}</p>
        </div>
    );
  }
}

//第三步 使用ReactDOM 把虚拟DOM 渲染到页面上
// 参数一 要渲染的虚拟DOM元素
// 参数二 指定页面上的容器
ReactDOM.render(<CourseList/>, document.getElementById('app'));

在这里插入图片描述


完毕

早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页