React创建组件的三种方式及其区别(有状态组件和无状态组件)

LSF调度实战:如何用bsub命令实现多队列资源抢占与公平调度 本文深入探讨了LSF作业调度系统的高级实战技巧,重点解析如何通过配置`lsb.queues`文件与灵活运用`bsub -R`命令,构建一套兼顾效率与公平的多队列资源抢占与调度体系。文章详细介绍了队列优先级设计、公平共享机制、资源感知调度以及抢占策略的实施,帮助集群管理员解决高优先级任务等待、资源分配不均等常见问题,实现计算资源的精细化管理和高效利用。 阅读详情

React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归;具体的三种方式:

  1. 函数式定义的无状态组件
  2. es5原生方式React.createClass定义的组件
  3. es6形式的extends React.Component定义的组件

虽然有三种方式可以定义react的组件,那么这三种定义组件方式有什么不同呢?或者说为什么会出现对应的定义方式呢?下面就简单介绍一下。

无状态函数式组件

创建无状态函数式组件形式是从React 0.14版本开始出现的。它是为了创建纯展示组件,这种组件只负责根据传入的props来展示,不涉及到要state状态的操作。具体的无状态函数式组件,其官方指出:

   在大部分React代码中,大多数组件被写成无状态的组件,通过简单组合可以构建成其他的组件等;这种通过多个简单然后合并成一个大应用的设计模式被提倡。

无状态函数式组件形式上表现为一个只带有一个render方法的组件类,通过函数形式或者ES6 arrow function的形式在创建,并且该组件是无state状态的。具体的创建形式如下:

function HelloComponent(props, /* context */) {
  return <div>Hello {props.name}</div>
}
ReactDOM.render(<HelloComponent name="Sebastian" />, mountNode) 

无状态组件的创建形式使代码的可读性更好,并且减少了大量冗余的代码,精简至只有一个render方法,大大的增强了编写一个组件的便利,除此之外无状态组件还有以下几个显著的特点:

  1. 组件不会被实例化,整体渲染性能得到提升
    因为组件被精简成一个render方法的函数来实现的,由于是无状态组件,所以无状态组件就不会在有组件实例化的过程,无实例化过程也就不需要分配多余的内存,从而性能得到一定的提升。
  2. 组件不能访问this对象
    无状态组件由于没有实例化过程,所以无法访问组件this中的对象,例如:this.ref、this.state等均不能访问。若想访问就不能使用这种形式来创建组件
  3. 组件无法访问生命周期的方法
    因为无状态组件是不需要组件生命周期管理和状态管理,所以底层实现这种形式的组件时是不会实现组件的生命周期方法。所以无状态组件是不能参与组件的各个生命周期管理的。
  4. 无状态组件只能访问输入的props,同样的props会得到同样的渲染结果,不会有副作用

无状态组件被鼓励在大型项目中尽可能以简单的写法来分割原本庞大的组件,未来React也会这种面向无状态组件在譬如无意义的检查和内存分配领域进行一系列优化,所以只要有可能,尽量使用无状态组件。

React.createClass

`React.createClass`是react刚开始推荐的创建组件的方式,这是ES5的原生的JavaScript来实现的React组件,其形式如下:
var InputControlES5 = React.createClass({
    propTypes: {//定义传入props中的属性各种类型
        initialValue: React.PropTypes.string
    },
    defaultProps: { //组件默认的props对象
        initialValue: ''
    },
    // 设置 initial state
    getInitialState: function() {//组件相关的状态对象
        return {
            text: this.props.initialValue || 'placeholder'
        };
    },
    handleChange: function(event) {
        this.setState({ //this represents react component instance
            text: event.target.value
        });
    },
    render: function() {
        return (
            <div>
                Type something:
                <input onChange={this.handleChange} value={this.state.text} />
            </div>
        );
    }
});
InputControlES6.propTypes = {
    initialValue: React.PropTypes.string
};
InputControlES6.defaultProps = {
    initialValue: ''
};

与无状态组件相比,React.createClass和后面要描述的React.Component都是创建有状态的组件,这些组件是要被实例化的,并且可以访问组件的生命周期方法。但是随着React的发展,React.createClass形式自身的问题暴露出来:

  • React.createClass会自绑定函数方法(不像React.Component只绑定需要关心的函数)导致不必要的性能开销,增加代码过时的可能性。
  • React.createClass的mixins不够自然、直观;React.Component形式非常适合高阶组件(Higher Order Components--HOC),它以更直观的形式展示了比mixins更强大的功能,并且HOC是纯净的JavaScript,不用担心他们会被废弃。HOC可以参考无状态组件(Stateless Component) 与高阶组件。

React.Component

React.Component是以ES6的形式来创建react的组件的,是React目前极为推荐的创建有状态组件的方式,最终会取代React.createClass形式;相对于 React.createClass可以更好实现代码复用。将上面React.createClass的形式改为React.Component形式如下:

class InputControlES6 extends React.Component {
    constructor(props) {
        super(props);

        // 设置 initial state
        this.state = {
            text: props.initialValue || 'placeholder'
        };

        // ES6 类中函数必须手动绑定
        this.handleChange = this.handleChange.bind(this);
    }

    handleChange(event) {
        this.setState({
            text: event.target.value
        });
    }

    render() {
        return (
            <div>
                Type something:
                <input onChange={this.handleChange}
               value={this.state.text} />
            </div>
        );
    }
}
InputControlES6.propTypes = {
    initialValue: React.PropTypes.string
};
InputControlES6.defaultProps = {
    initialValue: ''
};

React.createClass与React.Component区别

根据上面展示代码中二者定义组件的语法格式不同之外,二者还有很多重要的区别,下面就描述一下二者的主要区别。

函数this自绑定

React.createClass创建的组件,其每一个成员函数的this都有React自动绑定,任何时候使用,直接使用this.method即可,函数中的this会被正确设置。

const Contacts = React.createClass({  
  handleClick() {
    console.log(this); // React Component instance
  },
  render() {
    return (
      <div onClick={this.handleClick}></div>
    );
  }
});

React.Component创建的组件,其成员函数不会自动绑定this,需要开发者手动绑定,否则this不能获取当前组件实例对象。

class Contacts extends React.Component {  
  constructor(props) {
    super(props);
  }
  handleClick() {
    console.log(this); // null
  }
  render() {
    return (
      <div onClick={this.handleClick}></div>
    );
  }

当然,React.Component有三种手动绑定方法:可以在构造函数中完成绑定,也可以在调用时使用method.bind(this)来完成绑定,还可以使用arrow function来绑定。拿上例的handleClick函数来说,其绑定可以有:

    constructor(props) {
       super(props);
       this.handleClick = this.handleClick.bind(this); //构造函数中绑定
  }
    <div onClick={this.handleClick.bind(this)}></div> //使用bind来绑定
    <div onClick={()=>this.handleClick()}></div> //使用arrow function来绑定

组件属性类型propTypes及其默认props属性defaultProps配置不同

React.createClass在创建组件时,有关组件props的属性类型及组件默认的属性会作为组件实例的属性来配置,其中defaultProps是使用getDefaultProps的方法来获取默认组件属性的

const TodoItem = React.createClass({
    propTypes: { // as an object
        name: React.PropTypes.string
    },
    getDefaultProps(){   // return a object
        return {
            name: ''    
        }
    }
    render(){
        return <div></div>
    }
})

React.Component在创建组件时配置这两个对应信息时,他们是作为组件类的属性,不是组件实例的属性,也就是所谓的类的静态属性来配置的。对应上面配置如下:

class TodoItem extends React.Component {
    static propTypes = {//类的静态属性
        name: React.PropTypes.string
    };

    static defaultProps = {//类的静态属性
        name: ''
    };

    ...
}

组件初始状态state的配置不同

React.createClass创建的组件,其状态state是通过getInitialState方法来配置组件相关的状态;
React.Component创建的组件,其状态state是在constructor中像初始化组件属性一样声明的。

const TodoItem = React.createClass({
    // return an object
    getInitialState(){ 
        return {
            isEditing: false
        }
    }
    render(){
        return <div></div>
    }
})
class TodoItem extends React.Component{
    constructor(props){
        super(props);
        this.state = { // define this.state in constructor
            isEditing: false
        } 
    }
    render(){
        return <div></div>
    }
}

Mixins的支持不同

Mixins(混入)是面向对象编程OOP的一种实现,其作用是为了复用共有的代码,将共有的代码通过抽取为一个对象,然后通过Mixins进该对象来达到代码复用。具体可以参考React Mixin的前世今生。

React.createClass在创建组件时可以使用mixins属性,以数组的形式来混合类的集合。

var SomeMixin = {  
  doSomething() {

  }
};
const Contacts = React.createClass({  
  mixins: [SomeMixin],
  handleClick() {
    this.doSomething(); // use mixin
  },
  render() {
    return (
      <div onClick={this.handleClick}></div>
    );
  }
});

但是遗憾的是React.Component这种形式并不支持Mixins,至今React团队还没有给出一个该形式下的官方解决方案;但是React开发者社区提供一个全新的方式来取代Mixins,那就是Higher-Order Components,具体细节可以参考这篇文章

如何选择哪种方式创建组件

由于React团队已经声明React.createClass最终会被React.Component的类形式所取代。但是在找到Mixins替代方案之前是不会废弃掉React.createClass形式。所以:

能用React.Component创建的组件的就尽量不用React.createClass形式创建组件。

除此之外,创建组件的形式选择还应该根据下面来决定:

1、只要有可能,尽量使用无状态组件创建形式。

2、否则(如需要state、生命周期方法等),使用`React.Component`这种es6形式创建组件

补充一点

无状态组件内部其实是可以使用ref功能的,虽然不能通过this.refs访问到,但是可以通过将ref内容保存到无状态组件内部的一个本地变量中获取到。

例如下面这段代码可以使用ref来获取组件挂载到dom中后所指向的dom元素:

function TestComp(props){
    let ref;
    return (<div>
        <div ref={(node) => ref = node}>
            ...
        </div>
    </div>)
}

原文链接 

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型 本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。 阅读详情

相关推荐

Intel Realsense d435 使用python对深度图进行预处理

Intel Realsense d435 使用python对深度图进行预处理 本文中主要翻译一下一篇关于深度图预处理过滤器的内容,后面还会有关于距离测量的。 原文中的图像显示,是使用matplotlib.pyplot工具,在本文中,使用opencv来显示深度图》 首先常规操作导入包: import cv2 import numpy as np import pyrealsense2 as rs 获取我们所需要的图像,通过摄像头或者本地都可以 pipe = rs.pipeline() cfg = rs.co

qq_25105061的博客 1万+

React学习之旅Part5:React组件的class创建方式及传值和传递方法、state私有数据、有状态组件和无状态组件

Class创建组件 React创建组件有两种方式 一种是function创建方式 具体可以看我这篇博客:React学习之旅Part4:React组件的function创建方式及传值、抽离为单独jsx文件 还有一种更常用且推荐的 就是class创建方式了 class方式创建组件 有三个需要注意的地方: 1、若要使用class关键字来定义组件 则必须让组件继承React.Component类 2、在组件里必须用render函数渲染 否则会报错 3、必须返回合法的JSX虚拟DOM结构 若没有要返回的内容 则re

"✧treasure mountain✧" 3043

docker安装fastdfs+nginx配置

docker安装fastdfs+nginx,实现图片或文件的上传与下载

weixin_47325126的博客 2192

React创建组件的三种方式及其区别是什么?

1、无状态函数式组件 它是为了创建纯展示组件,这种组件只负责根据传入的props来展示,不涉及到state状态的操作 组件不会被实例化,整体渲染性能得到提升,不能访问this对象,不能访问生命周期的方法 2、ES5 原生方式 React.createClass // RFC React.createClass会自绑定函数方法,导致不必要的性能开销,增加代码过时的可能性。 3、E6继承形式...

高先生的猫 1219

单片机开发者的福音:3步搞定VSCode智能补全(IAR工程+Clangd实战)

本文为单片机开发者提供了一套高效解决方案,通过EIDE插件将IAR工程导入VSCode,并生成关键的compile_commands.json文件,结合Clangd配置,仅需三步即可实现精准的智能代码补全、一键跳转等现代编辑功能,大幅提升嵌入式开发效率。

coffee的博客 523

灰度发布、蓝绿部署、双活架构与数据同步/备份/迁移

本文系统介绍了现代互联网系统的核心部署策略与数据管理技术体系。主要内容包括:1)三种服务发布策略(灰度发布、蓝绿发布、滚动发布)的原理、实现方式和适用场景对比;2)高可用架构设计(同城双活、异地双活、异地多活)的技术方案;3)数据同步机制、备份策略与迁移方案的设计要点。文章通过架构图、流程图和配置示例详细展示了各类技术的实施方法,并分析了不同方案的优劣及风险控制措施,为构建高可用、高可靠的分布式系统提供了完整的技术指南。

zane的博客 515

React创建组件的三种方式及其区别

React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归;具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形式的extends React.Component定义的组件 虽然有三种方式可以定义react的组件,那么这三种定义组件方式有什么不同呢?或者说为什么会出现对应的定义方式呢?下面就简单介绍一下。 无状态函数...

weixin_30593261的博客 370

QTest 单元测试框架及单元测试思考

qt 单元测试框架 QTEST 及思考

一个老菜鸟的学习分享 1万+

[特殊字符] Redisson全面指南:从入门到精通

Redisson是一款高级Redis客户端,为Java应用提供丰富的分布式功能。它支持分布式对象、集合、锁和服务,实现了Java常用数据结构的分布式版本,并内置多种分布式锁机制。Redisson提供同步、异步和响应式三种操作模式,支持单节点、集群等多种Redis部署架构。其看门狗机制可自动续期分布式锁,避免业务超时导致的锁失效。相比Jedis和Lettuce,Redisson提供了更高层次的分布式抽象,是构建Java分布式系统的理想选择。通过合理配置连接池和序列化方式,并结合命名规范与异常处理,可在生产环境

油墨香^-^的博客 775

ADS系列之SI&PI仿真笔记:ADS多种版本的安装、卸载&重装(一)

此系列仅作为ADS学习过程的记录,如有错误的地方还请大佬指正! 一、下载&安装 ADS软件下载&安装还算比较简单,目前接触到有两个版本:ADS2017和ADS2019。这里贴下链接,破解教程里面都有: ADS2017下载地址:https://pan.baidu.com/s/1l-Bs9owKRmp5Pv0Mt92OYA 提取码:wuzf ADS2019下载地址:吴川斌的博客-w...

Claudedy的博客 3万+

运放单电源供电和双电源供电的实际应用案例

文章摘要:本文对比分析了运放单电源与双电源供电的典型应用场景及电路设计要点。单电源供电适用于低成本、小体积设备,如便携音箱(5V供电+中点偏置)、工业4-20mA信号转换(12V供电+电压跟随)和物联网传感器(3.3V低功耗设计);双电源供电则适合高精度要求场景,如Hi-Fi音响(±15V对称输出)、医疗设备(±5V微弱信号放大)和精密仪器(±15V宽动态范围)。文末提供常见运放选型对照表,涵盖LM324、TL082等型号的供电参数与核心特性,为不同应用场景提供选型参考。(149字)

qq_37999850的博客 608

react 类组件

1:react 类组件 // 准备一个容器 <div id="test"></div> 类总结: 1: 类中的构造方法不是必须写的, 要对实力进行一些初始化操作采写。 2: 如果A类继承B类, 并且A类中写了构造器, A类构造器必须写super() 方法 3:类中定义的方法, 都是放在类中原型上了, 提供实例去使用 4: 在继承中, 如果子类使用方法没有在子类原型上查找到, 就会通过原型链向父级查找 ----------------------------------

weixin_45677987的博客 345

12、每日卫星任务规划问题的不同公式

本文探讨了卫星任务规划问题的多种数学公式表示方法,包括传统的整数线性规划(ILP)模型、改进的基于路径的公式、基于集合覆盖的公式以及动态规划公式。通过案例研究比较了不同公式的求解效率和适用场景,并提供了使用Python进行实际求解的操作步骤。最后讨论了进一步优化策略及未来研究方向,旨在为解决卫星任务规划问题提供全面的理论支持和实践指导。

assembly8low的博客 203

React中无状态组件和有状态组件的写法以及区别

React中的组件主要分为无状态组件和有状态组件两类。 1,无状态组件主要用来定义模板,接收来自父组件props传递过来的数据,使用{props.xxx}的表达式把props塞到模板里面。无状态组件应该保持模板的纯粹性,以便于组件复用。创建无状态组件如下: var Header = (props) = ( <div>{props.xxx}</div> ); expo...

雷佳佳的博客 2335

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

React 有状态组件和无状态组件的区别

有状态组件: 有状态组件的区别是它属于一个class类, 有继承, 可以通过this来接收状态和属性 如果你想用react的生命周期, 想对一些数据进行增删改查的话就要用到有状态组件 import React, { Component } from 'react' class Footer extends Component { render() { return...

周家大小姐 3484

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

前端React篇之对有状态组件和无状态组件的理解及使用场景

有状态组件用于处理具有内部状态和复杂逻辑的组件,而无状态组件则更适合作为纯展示组件,专注于UI的呈现。在实际开发中,根据组件的功能和需求选择合适的组件类型非常重要。

星辰迷上大海的博客 1769

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

react--无状态组件和有状态组件

react--无状态组件和有状态组件

冷月心的博客 5769

简述React中无状态组件和有状态组件的区别

React中的组件主要分为无状态组件和有状态组件两类。 1,无状态组件主要用来定义模板,接收来自父组件props传递过来的数据,使用{props.xxx}的表达式把props塞到模板里面。无状态组件应该保持模板的纯粹性,以便于组件复用。创建无状态组件如下: var Header = (props) = ( <div>{...

weixin_34138255的博客 1539

react中有状态组件和无状态组件的区别和使用规则

state: 用于改变组件内容状态的值(动态) props: 用于组件通信进行传值 无状态组件:其实就是一个函数 有状态组件,是一个class类,继承了类的组件是有状态组件,App.js就是一个有状态的组件 区别: 1.有状态组价是可以使用state的,只有继承了Component的组件才可以拥有state进行一些数据的存储和管理,同时可以拥有props 2.但是无状态组件不存在state,只会有...

小楠子的博客 1885

有状态组件 和 无状态组件的区别

一 、有状态组件 (stateful components) 平时用的大部分是有状态组件 写法: import React,{Component} from 'react'; export default class Bottom extends Component{ constructor(props){ ...

weixin_30819085的博客 1499

React中的有状态组件与无状态组件:深入理解与实践

随着React Hooks的引入,函数组件也可以管理状态和副作用,这进一步模糊了有状态和无状态组件之间的界限,同时也提供了更为灵活的编程模式。在React的组件体系中,有状态组件与无状态组件是两个基础但极其重要的概念。有状态组件,也常被称为“容器组件”,是React中能够维护和管理自身状态的组件。状态(state)是组件内部的私有数据,它可以随时间变化,并且当状态改变时,组件会重新渲染以反映新的状态。在设计组件时,应遵循单一职责原则,每个组件专注于一个功能点,这有助于组件的重用和维护。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1584

reactJS 干货(reactjs 史上最详细的解析干货)

一. State和 Props state是状态机。 应该包括:那些可能被组件的事件处理器改变并触发用户界面更新的数据,譬如需要对用户输入,服务器请求或者时间变化等作出响应。 不应该包括:计算所得数据、React组件(在render()里使用props和state来创建它)、基于props的重复数据(尽可能保持用props来做作为唯一的数据来源,把pro

天微微亮 3万+

理解并使用React的有状态组件和无状态组件

在React中,有状态组件和无状态组件是两种基本的组件类型,它们在特性和使用场景上有所不同。本文将深入探讨这两种组件类型的理解及使用场景。

zhangwenok的博客 1137

什么是React中的有状态组件(stateful component)和无状态组件(stateless component)?

什么是React中的有状态组件(stateful component)和无状态组件(stateless component)?

商务合作欢迎私信我 1万+

有状态和无状态组件

有状态和无状态组件 组件是自我维持的、独立的微实体,其描述了UI的一部分,可以将应用程序的UI拆分为较小的组件,其中每个组件都有自己的代码、结构和API,简单来说组件允许你将UI拆分为独立可复用的代码片段,并对每个片段进行独立构思。 描述 React中的组件按状态主要分为无状态组件和有状态组件两类,通常来说,使用class关键字创建的组件,有自己的私有数据this.state和生命周期函数就是有状态组件,使用function创建的组件,只有props没有自己的私有数据和生命周期函数就是无状态组件。 无状态组

WindRunnerMax 2155
上一篇: react页面传参跳转Link&hashHistory
下一篇: antd使用TimePicker时报错
快乐的小z
博客等级 码龄9年 21粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值