一、简介

在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式。其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在目前项目中使用率还是很高的。但随着后来技术更新,React组件创建的方式也在不断的变化和过时。到目前为止,大概有3种方式。分别是createClass、ES6的类组件、无状态函数式组件。

二、详解

方式一:React.CreateClass

1、复用性差:

<div id="container"></div>
<script type="text/babel"> //创建菜单组件
const menuList = React.createClass({
render() {
return React.createElement("ol", {"className": "menus"},
React.createElement("li", null, "beef"),
React.createElement("li", null, "pork"),
React.createElement("li", null, "Lamb"),
React.createElement("li", null, "fish"),
React.createElement("li", null, "chicken")
)
}
}); //创建组件节点
const list = React.createElement(menuList, null, null) //渲染挂载组件
ReactDOM.render(
list,
document.getElementById("container")
) </script>

2、复用性强:

<div id="container"></div>
<script type="text/babel"> //创建菜单组件
const menuList = React.createClass({
render() {
return React.createElement("ol", {"className": "menus"},
this.props.items.map(
(item, i) => React.createElement("li", {key:i}, item) //给每一项属性添加key,保证数据的唯一性
)
)
}
});
//创建菜单元素
const items = [
"beef",
"pork",
"Lamb",
"fish",
"chicken"
] //创建组件节点
const list = React.createElement(menuList, {items}, null) //渲染组件
ReactDOM.render(
list,
document.getElementById("container")
) </script>  

方式二:ES6的类组件(一般写js中,作为导出组件使用)

<div id="container"></div>
<script type="text/babel"> //创建菜单组件类
class MenuList extends React.Component { render() { //对items进行解构赋值,作用域本地化
let {items} = this.props return React.createElement("ol",{"className": "menus"},
items.map((item, i) =>
React.createElement("li", {key:i}, item)
)
)
}
} //定义数组
const menuItems = ["pork", "fish", "chicken", "Lamb", "beef"] //渲染组件
ReactDOM.render(
React.createElement(MenuList,{items: menuItems},null),
document.getElementById("container")
) </script>

方式三:无状态函数式组件

它是纯函数而不是组件,因此,它没有this作用域。无状态函数式组件可以接收属性然后返回一个DOM元素,它是实践函数式编程范式的好方法。

<div id="container"></div>
<script type="text/babel"> //创建菜单组件(通过函数)

//未优化:该函数通过参数props收集数据,然后根据获得的数据为每一个元素返回一个有序列表
/*
   const menuList = props => {
  return React.createElement('ol', {"className": "nemus"},
  props.items.map( (item, i) => React.createElement("li", {key:i}, item))
)
}  
*/ //优化后:这里使用了属性参数解构,将列表属性作用域直接限制在函数内部,减少了点标记符号的使用
const menuList = ({items}) => {
return React.createElement("ol",{"className": "menus"},
items.map( (item,i) => React.createElement("li", {key:i}, item))
)
} //创建菜单元素
const items = ["pork","fish","chicken","Lamb","beef"] //创建组件节点
const list = menuList({items}) //渲染组件
ReactDOM.render(
list,
document.getElementById("container")
) </script>

四、组件工厂类

在组件中元素的创建方式基本上都是通过React.createElement。 其实,还有另外一种创建方式就是工厂类(Factory)。工厂类是一种特殊的对象,可以将实例化对象的细节封装起来,React内置的工厂类可以为所有的HTML元素提供支持。用户可以使用React.createFactory为组件创建自定义工厂类,从而达到简化代码的目的。

使用系统工厂类创建元素节点:

//React.DOM.li(null, "pork") : 第一个参数为元素属性、第二个参数为子节点
<li>pork</li> <=> React.DOM.li(null, "pork")

使用自定义组件工厂类创建组件:

<div id="container"></div>
<script type="text/babel"> //解构
const {render} = ReactDOM const MenuList = ({items}) =>
React.DOM.ol({"className": "menus"},
items.map( (item, i) =>
React.DOM.li({key:i}, item)
)
) //创建工厂类
const MenuListFactory = React.createFactory(MenuList) //创建菜单元素
const items = ["p_pork","f_fish","c_chicken","l_lamb","b_beef"] //渲染组件
render(
MenuListFactory({items}),
document.getElementById("container")
) </script>

五、简化

在上面介绍的React组件创建过程中,不论是使用React.createElement创建元素,还是使用系统工厂类Factory创建元素,都显得不够直接。Facebook团队在React中引入了JSX语法糖来声明元素标签,可以创建复杂的DOM树过程简单化,而且开发者可以很直观的梳理DOM树结构。具体实现,在之前的几篇文章都有讲解,此处就不介绍了。请看这里:https://www.cnblogs.com/XYQ-208910/p/11913238.html

React: React组件创建的三种方式的更多相关文章

  1. 黑马vue---56-58、vue组件创建的三种方式

    黑马vue---56-58.vue组件创建的三种方式 一.总结 一句话总结: 不论是哪种方式创建出来的组件,组件的 template 属性指向的模板内容,必须有且只能有唯一的一个根元素 1.使用 Vu ...

  2. vue组件创建的三种方式

    1.使用Vue.extend创建全局的Vue组件 //1.1 使用vue.extend创建组件 var com1 = Vue.extend({ //通过template属性指定组件要展示的html结构 ...

  3. 于Unity3D动态创建对象和创建Prefab三种方式的原型对象

    于Unity3D动态创建对象和创建Prefab三种方式的原型对象 u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject o ...

  4. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  5. SpringBoot工程创建的三种方式

    一. 通过IDEA的spring Initializer创建 1. 打开创建项目面板 File->New->Project->Spring Initializr 2. 填写Maven ...

  6. Angular 组件通信的三种方式

    我们可以通过以下三种方式来实现: 传递一个组件的引用给另一个组件 通过子组件发送EventEmitter和父组件通信 通过serive通信 1. 传递一个组件的引用给另一个组件 Demo1 模板引用变 ...

  7. (day57)九、多对多创建的三种方式、Forms组件

    目录 一.多对多三种创建方式 (一)全自动 (二)纯手撸(基本不用) (三)半自动(推荐使用) 二.forms组件 (一)校验数据 (1)常用内置字段及参数 (2)内置的校验器 (3)HOOK方法 ( ...

  8. wpf 创建动画三种方式

    动画类型 : 故事版,CompositionTarget,DispachTime 那么到此,三种动态创建动画的方法都已经详细介绍过了,大家可能会有种感觉,比较钟情于第一种WPF/Silverlight ...

  9. 51、多线程创建的三种方式之实现Callable接口

    实现Callable接口创建线程 Callable接口是在jdk5版本中加入的,这个接口在java.util.concurrent包下面,与其他两种方式不同的地方在于使用Callable接口创建的线程 ...

随机推荐

  1. 45-管理 Machine

    用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境.除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理.其中最常用的就是无 ...

  2. MySQL数据库~~~~~存储引擎

    1. InnoDB InnoDB引擎特点: 1.支持事务:支持4个事务隔离界别,支持多版本读. 2.行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响. 3.读写 ...

  3. 阿里云ECS服务器部署HADOOP集群(七):Sqoop 安装

    本篇将在 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建 阿里云ECS服务器部署HADOOP集群(二):HBase完全分布式集群搭建(使用外置ZooKeeper) 阿 ...

  4. FS-Cache 调研

    最近需要使用到 FSCache,今天调研一下FS-Cache,主要记录一些索引,方便以后查阅: RedHat 文档:https://access.redhat.com/documentation/en ...

  5. 2.华为路由交换技术_TCP/IP参考模型

    1.应用层 2.传输层(主机到主机层) 3.网络层(IPV4) ARP协议:地址解析协议 原理:源终端A想要发送信息给目的终端B,已知B的IP地址,需要获取B的MAC地址.首先它会在局域网广播,一般情 ...

  6. 10.jenkins 按角色分配

    在实际的生产中,需要项目比较多.不同的用户需要对应 不同的项目工程 .这个时候,我们需要按角色给与权限. 要实现这个功能,需要一个插件来完成 . Role-based Authorization St ...

  7. Yii2中$model->load($data)一直返回false问题

    上次使用$model->load()方法时一直返回false,数据添加不成功,这里记录一下: 出错代码: $data = [ 'name' => 'test', 'phone' => ...

  8. 某小公司RESTful、共用接口、前后端分离、接口约定的实践

    作者:邵磊 juejin.im/post/59eafab36fb9a045076eccc3 前言 随着互联网高速发展,公司对项目开发周期不断缩短,我们面对各种需求,使用原有对接方式,各端已经很难快速应 ...

  9. ABP开发框架前后端开发系列---(14)基于Winform的ABP快速开发框架

    前面介绍了很多ABP系列的文章,一步一步的把我们日常开发中涉及到的Web API服务构建.登录日志和操作审计日志.字典管理模块.省份城市的信息维护.权限管理模块中的组织机构.用户.角色.权限.菜单等内 ...

  10. In .net 4.8,calculate the time cost of serialization in BinaryFormatter,NewtonSoft.json,and System.Text.Json.JsonSerializer.Serialize

    using ConsoleApp390.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; us ...