大型React项目需要使用ES6解决方案以及对JSX的使用【React高级技术】

news2024/12/29 16:13:45

不使用 ES6

然而,在纯浏览器端使用ES6语法时,浏览器支持存在差异,这需要特殊处理才能正常运行。 支持ES2015桌面浏览器 Chrome:从51版开始,它可以支持ES6 97%的新功能。 Firefox:53版本支持97%的ES6新功能。 Safari:从版本10开始,ES6 99%的新功能都可以得到支持。 IE:Edge 15可以支持96%的ES6新功能。 Edge 14可以支持93%的新ES6功能。(IE7~11基本不支持ES6)

class Greeting extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;}
} 
var createReactClass = require('create-react-class');
var Greeting = createReactClass({render: function() {return <h1>Hello, {this.props.name}</h1>;}
}); 

绑定

对于使用ES6类关键字创建的React组件,组件中的方法遵循与常规ES6类相同的语法规则。这意味着这些方法不会自动将其绑定到此组件实例。需要显式调用。在构造函数中绑定(this):

class SayHello extends React.Component {constructor(props) {super(props);this.state = {message: 'Hello!'};// 这一行很重要!this.handleClick = this.handleClick.bind(this);}handleClick() {alert(this.state.message);}render() {// 由于 `this.handleClick` 已经绑定至实例,因此我们才可以用它来处理点击事件return (<button onClick={this.handleClick}>Say hello</button>);}
} 

这意味着,如果使用ES6类关键字创建组件,则在处理事件回调时需要编写更多代码。但对于大型项目,这可以提高运营效率。 如果你认为上面的编写方法很乏味,你可以尝试使用Babel插件类属性,它仍然处于实验阶段。

class SayHello extends React.Component {constructor(props) {super(props);this.state = {message: 'Hello!'};}// 警告:这种语法还处于试验性阶段!// 在这里使用箭头函数就可以把方法绑定给实例:handleClick = () => {alert(this.state.message);}render() {return (<button onClick={this.handleClick}>Say hello</button>);}
} 

请注意,上述语法仍处于实验阶段,这意味着语法可能随时发生变化,最终可能不会包含在框架标准中。 为了安全起见,可以采用以下三种方法: 在构造函数中绑定方法。 使用箭头函数,例如onClick={(e)=>this.handleClick(e)}。 继续使用createReactClass。

var SetIntervalMixin = {componentWillMount: function() {this.intervals = [];},setInterval: function() {this.intervals.push(setInterval.apply(null, arguments));},componentWillUnmount: function() {this.intervals.forEach(clearInterval);}
};

var createReactClass = require('create-react-class');

var TickTock = createReactClass({mixins: [SetIntervalMixin], // 使用 mixingetInitialState: function() {return {seconds: 0};},componentDidMount: function() {this.setInterval(this.tick, 1000); // 调用 mixin 上的方法},tick: function() {this.setState({seconds: this.state.seconds + 1});},render: function() {return (<p>React has been running for {this.state.seconds} seconds.</p>);}
});

ReactDOM.render(<TickTock />,document.getElementById('example')
); 

如果完全不同的组件具有相似的功能,这将导致“交叉关注”的问题。为了解决这个问题,当使用createReactClass创建React组件时,引入mixin函数将是一个很好的解决方案。 更常见的用法是组件定期更新。这个函数可以很容易地用setInterval()实现,但需要注意的是,当不再需要它时,应该清除它以节省内存。React提供了一种生命周期方法,这样就可以知道何时创建或销毁了组件。让我们创建一个简单的mixin,它使用这些方法来提供一个简单setInterval()函数,该函数将在组件被破坏时自动清理。

class Greeting extends React.Component {// ...
}

Greeting.defaultProps = {name: 'Mary'
}; 

如果一个组件有多个mixin,并且在这些mixin中定义了相同的生命周期方法(例如,当一个组件被破坏时,几个mixin希望进行一些清理),则将调用这些生命周期方法。当使用mixin时,mixin将首先按照定义的顺序执行,然后调用组件上的相应方法。

JSX如何?

React不强制使用JSX。当不想在构建环境中配置JSX编译时,在React中不使用JSX会更方便。 每个JSX元素都简单地调用createElement的React Syntax sugar(component,props,…children)。因此,使用JSX可以做的任何事情都可以用纯JavaScript完成。

class Hello extends React.Component {render() {return <div>Hello {this.props.toWhat}</div>;}
}

ReactDOM.render(<Hello toWhat="World" />,document.getElementById('root')
); 

如果想了解更多JSX转换为JavaScript的示例,可以尝试使用在线Babel编译器。 组件可以是字符串或React.component的子类。它也可以是正常功能。 如果不想键入React。createElement,通常会创建一个快捷方式:

const e = React.createElement;

ReactDOM.render(e('div', null, 'Hello World'),document.getElementById('root')
); 

如果使用React,createElement的快捷方式几乎与使用React而不使用JSX一样方便。

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

几个超级牛的在线 Python 解释器

安装 Python 很容易&#xff0c;但或许你正在用智能手机/平板电脑&#xff0c;在用不允许安装软件的电脑&#xff0c;或者因为其它原因无法安装 Python。那么&#xff0c;如何通过免安装的方式使用 Python 呢&#xff1f; 本文将介绍 18 个免费的 Python 解释器和交互式 Shell…

软测 · 软件测试的基本概念 · 什么是需求 · 测试用例的概念 · 软件错误(bug)的概念

一、什么是软件测试软件测试和开发的区别测试和调试的区别一个优秀的软件测试人员具备的素质二、什么是需求从测试人员角度看待需求三、测试用例的概念四、软件错误&#xff08;bug&#xff09;的概念一、什么是软件测试 最常见的解释是&#xff1a;软件测试就是找 BUG&#x…

Linux学习之常用基本命令【3】

文章目录一 账号管理1.1 用户账号概述1.2 用户账号管理1.2.1 useradduseradduseradd添加账号1.2.2 userdeluserdeluserdel删除帐号1.2.3 usermodusermodusermod修改账号1.3 用户口令管理二 用户组管理2.1 用户组概述2.1.1 groupaddgroupaddgroupadd添加用户组2.1.2 groupdelgro…

渲染管线

Unity 是一款跨平台的 3D 引擎&#xff0c;有着强大的渲染功能&#xff0c;并主要用于游戏开发。谈到 Unity 的渲染功能&#xff0c;我们不得不提及到着色器&#xff08;Shader&#xff09;——3D 游戏引擎中最重要的一个因素,它在游戏效果以及画面显示方面起到了决定性的作用。…

录制电脑屏幕的软件哪个性价比高?这4款软件就很实用

电脑是我们学习和办公不可以缺少的工具&#xff0c;除了使用它上面的应用之外&#xff0c;我们有时还需要它进行屏幕录制。那有没有可以录制电脑屏幕的软件呢&#xff1f;当然有&#xff01;录制电脑屏幕的软件哪个性价比高&#xff1f;今天小编就给大家分享4款性价比高的软件&…

报表生成器 FastReport .Net 用户指南 2023(三):Bands

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

Echarts环形图、饼图径向渐变示例

第005个点击查看专栏目录在上一篇文章中已经讲过 ECharts线性渐变色示例演示&#xff08;2种渐变方式&#xff09;&#xff0c;这里做了环形图&#xff0c;饼图的一个径向渐变的示例演示&#xff0c;这里type: ‘radial’,想&#xff0c;y、x、z需要设置相应的数值&#xff0c…

【微服务】Elasticsearch概述环境搭建(一)

&#x1f697;Es学习起始站~ &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 一.初识elasticsearch (1) 作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速…

如何扛住游戏流量高峰?Evil Dead 主创这样说

“完全对得起原作电影。” “鬼玩人 (Evil Dead)”系列是恐怖幽默动作电影的经典之作&#xff0c;40多年的IP经典化历程中&#xff0c;《鬼玩人》&#xff08;Evil Dead&#xff09;正在推出该系列的第5部电影作品。同时也从经典三部曲中衍生出了“Evil Dead: The Game”——主…

【elementUi】与【elementPlus】图标引入的区别,elementPlus图标引入不成功

elementui图标官网 组件 | Element elementui中以类的名字与标签绑定即可引入 elementPlus图标官网&#xff1a; Icon 图标 | Element Plus (element-plus.org) elementplus中要自己成为一个标签的形式引入 如果引入不成功 最好在使用标签之前安装elementplus npm instal…

【云原生】nuclio:一个高性能的“serverless”框架

文章目录nuclio简介Nuclio框架架构函数处理器事件响应模式Dealer广泛的应用实时例子&#xff1a;车联网的事件驱动分析其他函数定义文件事件模型日志接口数据绑定模型nuclio看板CIL命令nuclio简介 Nuclio是一个高性能的“无服务器”框架&#xff0c;专注于数据、I/O和计算密集…

Signal tap 的各种用法

本文分为两部分&#xff0c;前一部分用于介绍signal tap基本功能&#xff0c;如果是初学者&#xff0c;看完这部分就可以用signal tap抓取一些简单的波形数据了。第二部分用于介绍一些特殊要求时的软件设置&#xff0c;比如连续触发&#xff0c;自定义触发条件等等。Signal Tap…

Linux从安装到实战+瑞吉外卖Linux项目部署

1.1虚拟机介绍1.2VMware Workstation虚拟化软件下载CentOS;5分钟教你下载安装VMware16虚拟机&#xff08;含许可证密钥&#xff09;【全免费VMware虚拟机 上集】_哔哩哔哩_bilibili1.3远程链接Linux系统 &FinalShell链接finalshell半天没连接进去他说ip adress 看IP地址不对…

【电子学会】2022年12月图形化一级 -- 和平使者

和平使者 1. 准备工作 &#xff08;1&#xff09;删除小猫角色&#xff1b; &#xff08;2&#xff09;选择背景Nebula&#xff0c;Space&#xff0c;删除默认的白色背景&#xff1b; &#xff08;3&#xff09;选择角色Dove。 2. 功能实现 &#xff08;1&#xff09;点击…

线程安全的集合类(多线程环境下使用ArrayList、队列及哈希表)

目录&#xff1a;多线程环境下使用ArrayList多线程环境下使用队列多线程环境下使用哈希表多线程环境下使用ArrayList在多线程环境下使用ArrayList可以有以下三种方式&#xff1a;1.使用同步机制 (synchronized 或者 ReentrantLock)2.Collections.synchronizedList(new ArrayLis…

Python __slots__:限制类实例动态添加属性和方法

那么&#xff0c;Python 是否也允许动态地为类或实例对象添加方法呢&#xff1f;答案是肯定的。我们知道&#xff0c;类方法又可细分为实例方法、静态方法和类方法&#xff0c;Python 语言允许为类动态地添加这 3 种方法&#xff1b;但对于实例对象&#xff0c;则只允许动态地添…

相机标定与3D重建(3)使用OpenCV对摄像机进行标定

相机已经存在很长很长时间了。然而&#xff0c;随着20世纪末廉价针孔相机的出现&#xff0c;针孔相机在我们的日常生活中司空见惯。不幸的是&#xff0c;这种廉价是有代价的:严重的扭曲。幸运的是&#xff0c;这些都是常量&#xff0c;通过标定和一些重新映射&#xff0c;我们可…

WebDAV之葫芦儿·派盘+GeniusScan

GeniusScan 支持WebDAV方式连接葫芦儿派盘。 推荐一款功能极其强大的手机微型扫描仪软件,可以将所有的东西扫描成为pdf格式的文档,还支持连接葫芦儿派盘服务。 GeniusScan让您的安卓设备变身微型扫描仪。它能让您快速扫描文档,将扫描结果保存JPEG或PDF格式,

【数字化】要点整理-《数据治理体系完整指南》

导读&#xff1a;本文整理内容来自一篇关于数据治理体系相对比较完整内容文章&#xff0c;体系化的范围介绍主要包括了介绍元数据、数据标准、数据建模、数据集成、数据质量、数据开发、数据安全、ETL。可以作为数据治理建设参考。01 数据治理体系02 元数据2.1、元数据解决的问…

先天性心脏病的6大症状,家长要重视治疗!

先天性心脏病是一种严重的心血管疾病&#xff0c;与遗传和环境有密切的关系&#xff0c;而且先天性心脏病越早治疗效果越好&#xff0c;因此要了解先天性心脏病的相关症状&#xff0c;能够更早的确诊病情&#xff0c;并提高患者的治愈几率。 天天性心脏病有哪些症状&#xff1f…