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'));

在这里插入图片描述

完毕

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容