广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >React组件的三种写法是什么
  • 938
分享到

React组件的三种写法是什么

2024-04-02 19:04:59 938人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关React组件的三种写法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React 专注于 view 层,组件化则是 React 的基础,

这篇文章将为大家详细讲解有关React组件的三种写法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成。

截至目前 React 已经更新到 v15.4.2,由于 es6 的普及和不同业务场景的影响,我们会发现目前主要有三种创建 React 组件的写法:1. ES5写法React.createClass,2. ES6写法React.Component,3. 无状态的函数式写法(纯组件-SFC)。

你们最钟爱哪种写法呢?萝卜青菜各有所爱~ 每个团队都有自己的代码规范和开发模式,但书写 React 组件时 都会以提高代码阅读性、更优的组件性能、易于 bug 追踪为原则。下面我们就聊聊这三种写法的区别,以及各自所适用场景的最佳实践。

ES5-写法 React.createClass

React.createClass不用多说,我们最早使用这个方法来构建一个组件“类”,它接受一个对象为参数,对象中必须声明一个render方法,render返回一个组件实例,下面用一个 SwitchButton 组件的例子来看看React.createClass的具体用法:

var React = require('react');var ReactDOM = require('react-dom');var SwitchButton = React.createClass({ getDefaultProp:function() { return { open: false } }, getInitialState: function() { return { open: this.props.open }; }, handleClick: function(event) { this.setState({ open: !this.state.open }); }, render: function() { var open = this.state.open, className = open ? 'switch-button open' : 'btn-switch'; return ( <label className={className} onClick={this.handleClick.bind(this)}> <input type="checkbox" checked={open}/> </label> ); }});ReactDOM.render( <SwitchButton />, document.getElementById('app'));

ES6-写法 React.Component

React 升级到 v0.13 后就支持了 ES6 的class语法,我们可以使用class App extends React.Component{...}的方式创建组件,这也是目前官方推荐创建有状态组件的方式。用 ES6 重写上面 SwitchButton 组件的例子:

import React from 'react'import { render } from 'react-dom'class SwitchButton extends React.Component { constructor(props) { super(props) this.state = { open: this.props.open } this.handleClick = this.handleClick.bind(this) } handleClick(event) { this.setState({ open: !this.state.open }) } render() { let open = this.state.open, className = open ? 'switch-button open' : 'btn-switch' return ( <label className={className} onClick={this.handleClick}> <input type="checkbox" checked={open}/> </label> ) }}SwitchButton.defaultProps = { open: false}render( <SwitchButton />, document.getElementById('app'))

与React.createClass创建组件的不同之处:

import

与这里使用了 ES6 的import语句替代require()方法导入模块,其中import {render}可以直接从模块中导入变量名,这种写法更加简洁直观。

初始化 state

React 使用 ES6 的“类”继承实现时,去掉了getInitialState这个 hook 函数,state的初始化放在构造函数方法constructor中声明。

this 绑定

React.Component创建组件时,事件函数并不会自动绑定this,需要我们手动绑定,不然this将不会指向当前组件的实例对象。以下有三种绑定this的方法:

1. 在constructor中使用bind()进行硬绑定

constructor() { this.handleClick = this.handleClick.bind(this);}

2. 直接在元素上使用bind()绑定

<label className={className} onClick={this.handleClick.bind(this)}>

3. ES6 有个很有用的语法糖:Arrow Function(箭头函数)它可以很方便的使this直接指向class SwitchButton(它的作用等同于大家熟悉的var self = this,但后者会让代码变得混乱,Arrow Function 就很好的解决了这一问题)

<label className={className} onClick={()=>this.handleClick()}>

无状态的函数式写法(纯组件 SFC)

React.createClass和React.Component都可以用来创建有状态的组件,而 无状态组件 - Stateless Component 是 React 在 v0.14 之后推出的。

它的出现 是因为随着应用复杂度不断提升和组件本数量的增加,组件按各自职责被分成不同的类型,于是有一种只负责展示的纯组件出现了,它的特点是不需要管理状态state,数据直接通过props传入,这也符合 React 单向数据流的思想。

对于这种无状态的组件,使用函数式的方式声明,会使得代码的可读性更好,并能大大减少代码量,Arrow Function 则是函数式写法的最佳搭档:

const Todo = (props) => ( <li onClick={props.onClick} style={{textDecoration: props.complete ? "line-through" : "none"}} > {props.text} </li>)

上面定义的 Todo 组件,输入输出数据完全由props决定,而且不会产生任何副作用。对于props为 Object 类型时,我们还可以使用 ES6 的解构赋值:

const Todo = ({ onClick, complete, text, ...props }) => ( <li onClick={onClick} style={{textDecoration: complete ? "line-through" : "none"}} {...props} > {props.text} </li>)

无状态组件一般会搭配高阶组件(简称:OHC)一起使用,高阶组件用来托管state,Redux 框架就是通过 store 管理数据源和所有状态,其中所有负责展示的组件都使用无状态函数式的写法。

这种模式被鼓励在大型项目中尽可能以简单的写法 来分割原本庞大的组件,而未来 React 也会面向这种无状态的组件进行一些专门的优化,比如避免无意义的检查或内存分配。所以建议大家尽可能在项目中使用无状态组件。

当然,无状态组件也不是万金油,比如它不支持"ref",原因很简单,因为 React 调用它之前,组件不会被实例化,自然也就没有"ref",(ref和findDOMnode实际上打破了父子组件之间仅通过 props 来传递状态的约定,违背了 React 的原则,需要避免)。

以上三种写法的比较,以及最佳实践

Facebook 官方早就声明 ES6React.Component将取代React.createClass。随着 React 不断发展,React.createClass暴露出一些问题:

  • 相比React.Component可以有选择性的绑定需要的函数,React.createClass会自动绑定函数,这样会导致不必要的性能开销。

  • React.createClass亲生的 mixin,React.Component不再支持,事实上 mixin 不够优雅直观,替代方案是使用更流行的高阶组件-HOC,如果你的项目还离不开 也可以使用 react-mixin

关于“React组件的三种写法是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: React组件的三种写法是什么

本文链接: https://www.lsjlt.com/news/94030.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React组件的三种写法是什么
    这篇文章将为大家详细讲解有关React组件的三种写法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React 专注于 view 层,组件化则是 React 的基础,...
    99+
    2022-10-19
  • react三种定义组件方法是什么
    这篇文章主要介绍“react三种定义组件方法是什么”,在日常操作中,相信很多人在react三种定义组件方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react三种定...
    99+
    2022-10-19
  • React组件间通信的三种方法(简单易用)
    目录一、父子组件通信二、跨级组件通信1、逐层传值2、跨级传值三、兄弟(无嵌套)组件通信四、路由传值五、Redux  React知识中一个主要内容便是组件之间的通信,以下列举...
    99+
    2022-11-12
  • php的三维数组写法是什么
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php的三维数组写法是什么?一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。依照这种方式,我们可以创建二维或者三维数组:举例如下:定义:1维数组: $a1...
    99+
    2016-04-13
    php 三维数组
  • React组件的写法有哪些
    这篇文章给大家分享的是有关React组件的写法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。React 专注于 view 层,组件化则是 React 的基础,也是其核心理念...
    99+
    2022-10-19
  • react组件传值的四种方法
    目录1、父向子传值2、子向父传值3、非父子传值4、Context 方法 传值 【类似vue的 provide / inject】1、父向子传值 父组件 classAppextends...
    99+
    2023-05-18
    react组件传值 react 传值
  • Node.js编写组件的三种实现方式
    首先介绍使用v8 API跟使用swig框架的不同: (1)v8 API方式为官方提供的原生方法,功能强大而完善,缺点是需要熟悉v8 API,编写起来比较麻烦,是js强相关的,不容易支持其它脚本语言。 (2)...
    99+
    2022-06-04
    三种 组件 方式
  • React路由组件传参的三种方式(params、search、state)
    目录向路由组件传递params参数向路由组件传递search参数向路由组件传递state参数总结三种向路由组件传参的方式向路由组件传递params参数 当点击消息1这个导航链接时,展...
    99+
    2022-11-13
  • React的组件通讯是什么
    本篇文章为大家展示了React的组件通讯是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。组件通讯介绍内容组件是独立且封闭的单元,默认情况下,只能使用组件自己的数据。在组件化过程中,我们将一个完整...
    99+
    2023-06-25
  • php遍历一个数组的三种方法是什么
    3种遍历数组的方法:1、用for语句遍历,语法“for($i=0;$i<数组长度;$i++){//循环代码}”;2、用foreach语句遍历,语法“foreach($arr as $k=>$v){//循环代码}”;3、用whil...
    99+
    2022-09-06
  • react状态组件是什么
    这篇文章主要介绍了react状态组件是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 react状态组件有2...
    99+
    2022-10-19
  • react结合typescript封装组件的方法是什么
    今天小编给大家分享一下react结合typescript封装组件的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项...
    99+
    2023-07-06
  • react高阶组件指的是什么
    这篇文章主要介绍了react高阶组件指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇react高阶组件指的是什么文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2022-10-19
  • react受控组件指的是什么
    这篇文章主要介绍“react受控组件指的是什么”,在日常操作中,相信很多人在react受控组件指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react受控组件指的是...
    99+
    2022-10-19
  • react父子组件指的是什么
    这篇文章主要介绍了react父子组件指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇react父子组件指的是什么文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2022-10-19
  • JavaScript的三种条件语句是什么
    本篇内容介绍了“JavaScript的三种条件语句是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • Vue父子组件传值的三种方法
    目录前言一、Vue父子传值的方法二、方法详解1.props / $emit2.$parent / children3.$ref总结提示:文章写完后,目录可以自动生成,如何生成可参考右...
    99+
    2022-12-20
    Vue父子组件传值 Vue父子组件
  • 基于React封装一个组件的方法是什么
    这篇文章主要讲解了“基于React封装一个组件的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于React封装一个组件的方法是什么”吧!antd 是如何封装组件的仓库地址divi...
    99+
    2023-06-29
  • php的三种命名方法是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php的三种命名方法一、小驼峰命名法:小驼峰法(camel方法)变量一般用小驼峰法标识。第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字...
    99+
    2020-12-09
    php 命名方法
  • react中受控组件指的是什么
    本文小编为大家详细介绍“react中受控组件指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“react中受控组件指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作