前面写了学习React前必备的JavaScript基础
时间:2023-03-13 17:28:38
科技观察
为了不浪费大家宝贵的时间,先声明一下,这篇文章是针对没有写过React或者刚接触React的读者。对于语法不太了解的同学,这是一篇入门文章。一开始我并没有打算翻译这么基础的文章,但是看完整篇文章,我想起了刚开始学习React时的困惑。ES6那么多,我需要掌握多少?对于一个急于入门写React代码的人来说,这篇文章告诉你需要掌握的最基础的知识,让你快速写起来。不过后期的完善还是需要巩固Javascript的基础。前言在一个理想的世界中,在深入研究React之前,您应该了解有关JavaScript和Web开发的所有知识。不幸的是,我们生活在一个不健康的世界中,所以在React之前咀嚼所有的JavaScript只会给你带来困难。如果你已经有一些JavaScript经验,那么在React之前你需要学习的只是实际用于开发React应用程序的JavaScript特性。在学习React之前你应该了解的关于JavaScript的事情:ES6类用let/const箭头函数声明变量解构分配映射和过滤器ES6模块系统这是你将在80%的时间使用的20%的JavaScript新特性,所以在这篇文章中,我将帮助您学习所有这些功能。探索创建React应用程序开始学习React的一种常见方法是运行create-react-app包,它设置了运行React所需的一切。该过程完成后,打开src/app.js,它向我们展示了整个应用程序中唯一的React类:importReact,{Component}from'react';importlogofrom'./logo.svg';import'./App。css';classAppextendsComponent{render(){return(编辑src/App.js
和savetoreload。
LearnReact
);}}exportdefaultApp;如果你以前从未学过ES6,你可能会认为class语句是React的一个特性。其实这是ES6的一个新特性,所以学好ES6可以让你更好地理解React代码。我们将从ES6类开始。ES6的类ES6引入了类语法,类似于Java或Python等OO(面向对象)语言。ES6中的基本类如下所示:classDeveloper{constructor(name){this.name=name;}hello(){return'HelloWorld!Iam'+this.name+'andIamawebdeveloper';}}类语法后跟类语法可用于为新对象创建标识符(或名称)。始终在对象初始化时调用构造方法。传递给该对象的任何参数都将传递给新对象。例如:varnathan=newDeveloper('Nathan');nathan.hello();//HelloWorld!IamNathanandIamawebdeveloper类可以定义它需要的任何方法,在本例中我们定义了一个返回字符串的hello方法。从一个类继承的类可以扩展另一个类的定义,并且从该类初始化的新对象将具有两个类的所有方法。classReactDeveloperextendsDeveloper{installReact(){return'installingReact..Done.';}}varnathan=newReactDeveloper('Nathan');nathan.hello();//HelloWorld!IamNathanandIamawebdevelopernathan.installReact();//installingReact..Done.Inheritance另一个类的类,通常称为子类或子类,被扩展的类称为父类或超类。子类也可以覆盖父类中定义的方法,这意味着它将用自己定义的新方法替换父类中方法的定义。例如,让我们重写hello函数:Nathan');nathan.hello();//HelloWorld!IamNathanandIamaREACTdeveloper就这样,我们重写Developer类中的hello方法。使用React现在我们了解了ES6类和继承,我们可以理解src/app.js中定义的React类。这是一个React组件,但它实际上只是一个普通的ES6类,它继承了从React包中导入的ReactComponent类的定义。importReact,{Component}from'react';classAppextendsComponent{//classcontentrender(){return(
HelloReact!
)}}这允许我们使用render()方法、JSX、this.state和其他方法。所有这些定义都在Component类中。但正如我们稍后将看到的,类并不是定义React组件的唯一方式。如果你不需要状态和其他生命周期方法,你可以使用函数。在ES6中使用let和const声明变量由于JavaScript的var关键字是声明全局变量,所以在ES6中引入了两个新的变量声明来解决这个问题,即let和const。它们都用于声明变量。不同的是,const声明后不能改变它的值,而let可以。这两个声明都是局部的,这意味着如果let在函数作用域内声明,则不能在函数外调用。constname="David";letage=28;varoccupation="SoftwareEngineer";使用哪一个?根据经验,变量默认声明为const。稍后,当您编写应用程序时,当您意识到const的值需要更改时,您应该将const重构为let。希望它能让您习惯新的关键字,并且您将开始识别应用程序中需要使用const或let的模式。我们什么时候在React中使用它?当我们需要变量时:importReact,{Component}from'react';classAppextendsComponent{//classcontentrender(){constgreeting='WelcometoReact';return(
{greeting}
)}}问候语始终不变应用程序的生命周期,所以我们在这里使用const箭头函数箭头函数是ES6的新特性,在现代代码库中几乎普遍使用,因为它使代码简洁易读。它允许我们使用更短的语法编写函数。//regularfunctionconsttestFunction=function(){//content..}//arrowfunctionconsttestFunction=()=>{//content..}如果你是一个经验丰富的JS开发者,从常规函数语法切换到箭头语法可能会让你不舒服.当我学习箭头函数时,我用这两个简单的步骤重写了我的函数:去掉function关键字并在()后添加=>括号仍然用于传递参数,如果只有一个参数括号可以省略。consttestFunction=(firstName,lastName)=>{returnfirstName+''+lastName;}constsingleParam=firstName=>{returnfirstName;}隐藏返回如果箭头函数只有一行,可以不使用return关键字和大括号返回一个值。consttestFunction=()=>'你好。';testFunction();React中constHelloWorld=(props)=>{return
{props.hello}
;}的使用相当于ES6类组件classHelloWorldextendsComponent{render(){return(
{props.hello}
;);}}在React应用中使用箭头函数可以让代码更加简洁。但它也从组件中删除了状态的使用。这种类型的组件称为无状态功能组件。你会在很多React教程中看到这个名字。解析数组和对象赋值作为ES6中引入的最有用的新语法之一,解构赋值只是简单地复制对象或数组的一部分并将它们放入命名变量中。一个简单的例子:constdeveloper={firstName:'Nathan',lastName:'Sebhastian',developer:true,age:25,}//destructuredeveloperobjectconst{firstName,lastName}=developer;console.log(firstName);//returns'Nathan'console.log(lastName);//returns'Sebhastian'console.log(developer);//returnstheobject如您所见,我们将开发人员对象中的firstName和lastName分配给新变量firstName和lastName。现在,如果您想将firstName放入一个名为name的新变量中怎么办?const{firstName:name}=developer;console.log(name);//返回'Nathan'解构也适用于数组,使用索引而不是对象键:constnumbers=[1,2,3,4,5];const[one,two]=numbers;//one=1,two=2在解构的过程中可以跳过一些下标,传入:const[one,two,,four]=numbers;//one最常用of=1,two=2,four=4在React中就是解构方法中的状态:reactFunction=()=>{const{name,email}=this.state;};或者在一个无状态的函数组件中,结合前面提到的例子:constHelloWorld=(props)=>{return
{props.hello}
;}我们可以简单的立即解构参数:constHelloWorld=({hello})=>{return
{hello}
;}Map和filter虽然本文主要关注ES6,但需要提及JavaScript数组Map和filter方法,因为它们可能是最常用的方法之一在构建React应用程序时使用了ES5特性。尤其是在处理数据的时候。这两种方式在处理数据的时候用的比较多。例如,假设从API结果返回一个JSON数据数组:constusers=[{name:'Nathan',age:25},{name:'Jack',age:30},{name:'Joe',年龄:28},];然后我们可以像这样在React中渲染项目列表:importReact,{Component}from'react';classAppextendsComponent{//classcontentrender(){constusers=[{name:'Nathan',age:25},{name:'Jack',age:30},{name:'Joe',age:28},];return(
{users.map(user=>- {user.name}
)}
)}}我们也可以在渲染中过滤数据
{users.filter(user=>user.age>26).map(user=>- {user.name}
)}
ES6模块系统ES6模块系统使JavaScript能够导入和导出文件。让我们再看一下src/app.js代码来解释这一点。importReact,{Component}from'react';importlogofrom'./logo.svg';import'./App.css';classAppextendsComponent{render(){return(
编辑src/App.js
并保存重新加载。
LearnReact );}}exportdefaultApp;在第一行代码中我们看到导入语句:importReact,{Component}from'react';在第一行代码中,我们看到导出默认语句:exportdefaultApp;要理解这些语句,我们首先讨论模块语法。模块只是一个JavaScript文件,它使用export关键字导出一个或多个值(可以是对象、函数或变量)。首先,在src目录中创建一个名为util.js的新文件touchutil.js然后我们在其中编写一个函数,使用默认的exportexportdefaultfunctiontimes(x){returnx*x;}或多个命名的exportsexportfunctiontimes(x){returnx*x;}exportfunctionplusTwo(number){returnnumber+2;}然后我们可以在src/App.js中导入它。import{times,plusTwo}from'./util.js';console.log(times(2));console.log(plusTwo(3));每个模块可以有多个命名导出,但只有一个默认导出。默认导出可以不用花括号导入,对应的导出函数名://inutil.jsexportdefaultfunctiontimes(x){returnx*x;}//inapp.jsexportkfrom'./util.js';console.log(k(4));//returns16但对于命名导出,您必须使用花括号和确切的名称进行导入。或者,import可以使用别名来避免有两个具有相同名称的不同导入://inutil.jsexportfunctiontimes(x){returnx*x;}exportfunctionplusTwo(number){returnnumber+2;}//inapp.jsimport{timesasmultiplication,plusTwoasplus2}来自'./util.js';像这样直接导入名称:importReactfrom'react';将使JavaScript检查node_modules以获取适当的包名称。因此,如果您要导入本地文件,请不要忘记使用正确的路径。在React中使用它显然我们已经在src/App.js文件中看到了这一点,然后在index.js文件中看到了导出的App组件是如何呈现的。让我们暂时忽略serviceWorker部分。//index.jsfileimportReactfrom'react';importReactDOMfrom'react-dom';import'./index.css';importAppfrom'./App';import*asserviceWorkerfrom'./serviceWorker';ReactDOM.render(
,document.getElementById('root'));//如果你想让你的app离线工作,加载更快,你可以把下面的//unregister()改成register()。请注意,这会带来一些陷阱。//了解有关服务工作者的更多信息:http://bit.ly/CRA-PWAserviceWorker。从./App目录导入应用程序并省略.js扩展名。我们在导入JavaScript文件时只能省略文件扩展名,但在其他文件中我们必须包含扩展名,例如.css。我们还导入了另一个节点模块react-dom,它使我们能够将React组件呈现为HTML元素。至于PWA,它是一个让React应用程序可以离线工作的特性,但由于它默认是禁用的,所以一开始没有必要学习它。在你有足够的信心构建ReactUI之后,最好学习PWA。总而言之,React的伟大之处在于它不会像其他Web框架那样在JavaScript之上添加任何外部抽象层。这就是React变得非常受JS开发人员欢迎的原因。它只是使用干净的JavaScript来使构建用户界面更容易和可维护。在React应用中,JavaScript确实比Reactspecix语法多,所以一旦你更好地理解JavaScript——尤其是ES6——你就可以自信地编写React应用。但这并不意味着您必须了解JavaScript的所有知识才能开始编写React应用程序。现在就去写一个,当机会出现时,你会成为一个更好的开发者。感谢阅读,我希望你学到了新东西:)