React快速入门,一文弄懂react的基本使用和高级特性?对于刚学习react的小伙伴来说,总是从基础开始学习,

在本文中,融合大量案例和动图进行展示。可以把它当成是react的入门宝库,有不懂的语法知识点时或许在这里可以寻找到你的答案并且通过例子运用起来。

叮,废话不多说,下面来开始探索react的奥秘吧

在react中,最基础的内容便是变量和表达式,具体形式如下:

第一种类型:获取变量、插值

第二种类型:表达式

通常情况下,如果我们要给某一个标签设置类名,那么会给该标签加上一个class。而在react中,如果想要给一个标签加上一个类,那么需要给其加上className。具体代码如下:

同时需要注意的是,在react中,如果要在标签里面写内联样式,那么需要使用双花括号{{}}来表示。

第一种类型:子元素

对于子元素来说,它可以在标签里面进行使用。如下代码所示:

第二种类型:加载组件

如果要在React中加载一个组件,那么我们可以这么处理。具体代码如下:

由此,我们就将一个组件注入到组件当中。

继续,我们来看原生html在react中是如何使用的。先看以下代码:

大家可以看到,如果要在react中使用原生html,那么必须使用constrawHtmlData={__html:rawHtml}这种形式,才能将原生html代码给解析出来。否则的话,react是无法正常将原生html解析出来的。

先看下面这段代码:

.title{font-size:30px;color:red;}.btn-white{color:#333;}.btn-black{background-color:#666;color:#fff;;}此时浏览器的显示效果为:

大家可以看到,当我们theme设置为black时,最终显示的效果就是黑色。如果我们把theme设置为其他状态,那么最终显示的效果就是白色。

先来看一段代码:

大家可以看到,我们也可以通过三元表达式this.state.theme==='black'blackBtn:whiteBtn的方式来对一些条件进行判断。

在react中,使用的是list.map来渲染列表。其中,需要注意的是,list.map()是一个函数,那现在我们假设这个函数里面要遵循一套规则list.map(item=>item.id)。

这个时候,我们视.map为一个数组的重组,那么重组的规则就是item=>item.id。同时,list.map返回的是一个数组。

在这段代码中,我们通过this.clickHandler1=this.clickHandler1.bind(this)来对clickHandler1进行绑定。

还有另外一种关于this的绑定方法。先来看一段代码:

对于上面的这种方式来说,clickHandler2是一个静态方法,此时它的this会指向当前的实例。

大家可以看到,我们通过使用this.clickHandler4.bind(this,item.id,item.title)这种形式来对react中的事件进行参数传递。

如下图所示:

在react中,通过使用onChange事件来手动修改state里面的值。

上面我们已经讲解了input,接下来我们来看textarea和select。

同样地,textarea也是用value和onChange来对值进行绑定。

继续来看select。具体代码如下:

与input和textarea一样,也是通过操作value和onChange,来改变最终的值。

先来看ckeckbox。代码如下:

在上面的代码中,checkbox通过操作checked和onChange,来改变state的值。

radio也是类似,如下代码所示:

对于父子组件的使用来说,我们需要明白三个知识点:props传递数据、props传递函数和props类型检查。

依据以上代码,我们来对props的各个类型进行介绍。

最后一个TodoListDemo是父组件,其他都是子组件。在Input组件和List组件中,我们将props属性的内容,以this.props.xxx的方式,传递给父组件。

React在传递函数这一部分和vue是不一样的。对于vue来说,如果有一个父组件要传递函数给子组件,子组件如果想要触发这个函数,那么需要使用事件传递和$emit的方式来解决。

大家定位到Input组件中,在这里,我们将submitTitle以函数的形式,传递给父组件中的onSubmitTitle。

大家定位到两处props类型检查的地方。使用react中的PropTypes,我们可以对当前所使用的属性进行一个类型检查。比如说:submitTitle:PropTypes.func.isRequired表明的是,submitTitle是一个函数,并且是一个必填项。

就这样,通过上面的例子,我们学习了属性传递、属性验证以及父组件和子组件之间怎么通过传事件的形式来进行通信。

所谓不可变值,即所设置的值永不改变。那这个时候,我们就需要去创建一个副本,来设置state的值。

来看几个要点:

第一点:state要在构造函数中定义。如下代码所示:

第三点,在react中操作数组的值。如下代码所示:

//不可变值(函数式编程,纯函数)-数组constlist5Copy=this.state.list5.slice()list5Copy.splice(2,0,'a')//中间插入/删除this.setState({list1:this.state.list1.concat(100),//追加list2:[...this.state.list2,100],//追加list3:this.state.list3.slice(0,3),//截取list4:this.state.list4.filter(item=>item>100),//筛选list5:list5Copy//其他操作})//注意,不能直接对this.state.list进行pushpopsplice等,这样违反不可变值第四点,在react中操作对象的值。如下代码所示:

//不可变值-对象this.setState({obj1:Object.assign({},this.state.obj1,{a:100}),obj2:{...this.state.obj2,a:100}})//注意,不能直接对this.state.obj进行属性设置,即this.state.obj.xxx这样的形式,这种形式会违反不可变值(2)可能是异步更新react中的state,有可能是异步更新。来看一段代码:

值得注意的是,setTimeout在setState中是同步的。来看一段代码:

还有一个要注意的点是,如果是自己定义的DOM事件,那么在setState中是同步的,用在componentDidMount中。

如果是销毁事件,那么用在componentWillMount生命周期中。代码如下:

setState在传入对象时,更新前会被合并。来看一段代码:

有小伙伴可能会觉得,一下子多个三个setState,那结果应该是+3才是。但其实,如果传入的是对象,那么结果会把三个合并为一个,最终只执行一次。

还有另外一种情况,如果传入的是函数,那么结果不会被合并。来看一段代码:

大家可以看到,如果传入的是函数,那么结果一下子就执行三次了。

react的组件生命周期,有单组件生命周期和父子组件生命周期。其中,父子组件生命周期与Vue类似。

下面附上生命周期的图:

我们先来了解class组件和函数组件分别是什么样的。先看class组件,代码如下:

相反地,class组件就拥有函数组件相异的特点。

在上述表单模块,我们谈论到了受控组件,那接下来,我们就来谈论非受控组件。

所谓非受控组件,就是input里面的值,不受到state的控制。下面我们先来看几种场景。

大家可以看到,如果是非受控组件,那么需要使用defaultValue去控制组件的值。且最终input框里面的内容不论我们怎么改变,都不会影响到state的值。

对于复选框checkbox来说,先看以下代码:

大家可以看到,复选框如果当非受控组件来使用的使用,那么使用defaultCkecked来对值进行控制。同时,我们也看到了,最终不管checked的值如何改变,state的值都不受影响。

在上面的代码中,我们使用通过ref去获取DOM节点,接着去获取到文件的名字。像file这种类型的组件,值并不会一直固定的,所以也是一个非受控组件。

受控组件vs非受控组件的区别如下:

一般情况下,组件默认会按照既定层次嵌套渲染。类似下面这样:

这个时候就需要用到Portals。

.modal{position:fixed;width:300px;height:100px;top:100px;left:50%;margin-left:-150px;background-color:#000;/*opacity:.2;*/color:#fff;text-align:center;}此时,我们来看下浏览器节点的渲染效果。具体如下:

大家可以看到,通过使用ReactDOM.createPortal(),来创建Portals。最终modals节点成功脱离开父组件,并渲染到组件外部。

现在,我们来梳理一些Portals常见的场景。

Portals常用于解决一些css兼容性问题。通常使用场景有:

有时候我们经常会有一些场景出现切换的频率很频繁,比如语言切换、或者是主题切换,那如何把对应的切换信息给有效地传递给每个组件呢?

使用props,又有点繁琐;使用redux,又太小题大做了。

因此,这个需要我们可以用react中的context。

在上图中,我们做到了主题的切换。现在,我们来分析下上述的代码。

首先,我们创建了一个Context,也就是ThemeContext,并传入了light值。

接着,来到了ThemeLink组件。ThemeLink是一个函数式组件,因此,我们可以直接使用ThemeContext.Consumer来对其进行传值。

上面两个组件的值都取到了,但那只是ThemeContext的初始值。取到值了之后呢,我们还要修改值,React会往上找到最近的ThemeContext.Provider,通过value={this.state.theme}这种方式,去修改和使用ThemeContext最终使用的值。

在项目开发时,我们总是会不可避免的去加载一些大组件,这个时候就需要用到异步加载。在vue中,我们通常使用import()来加载异步组件,但在react就不这么使用了。

React通常使用React.lazy和React.Suspense来加载大组件。

如下代码所示:

先来看下面这一段代码:

shouldComponentUpdate(nextProps,nextState){if(nextState.count!==this.state.count ||nextProps.text!==this.props.length){returntrue//可以渲染}returnfalse//不重复渲染}在React中,默认的是,当父组件有更新,子组件也无条件更新。那如果每回都触发更新,肯定不太好。

因此,这个时候我们需要用到shouldComponentUpdate,判断当属性有发生改变时,可以触发渲染。当属性不发生改变时,也就是前后两次的值相同时,就不触发渲染。

那这个时候我们需要思考一个问题:SCU一定要每次都用吗?答案其实不是肯定的。

我们会去用SCU,从某种层面上来讲就是为了优化。因此,我们需要依据当前的开发场景,有需要的时候再去优化。

现在,我们来总结一下SCU的使用方式,具体如下:

PureComponent在react中的使用形式如下:

下面我们来看memo。memo,顾名思义是备忘录的意思。在React中的使用形式如下:

functionMyComponent(props){/*使用props渲染*/}functionareEqual(prevProps,nextProps){/*如果把nextProps传入render方法的返回结果与preProps传入render方法的返回结果一致的话,则返回true,否则返回false*/}exportdefaultReact.memo(MyComponent,areEqual);memo,可以说是函数组件中的PureComponent。同时,使用React.memo()的形式,将我们的函数组件和areEqual的值进行比较,最后返回一个新的函数。

值得注意的是,在React中,浅比较已经适用于大部分情况,一般情况下,尽量不要做深度比较。

在React中,用于做不可变值的有一个库:Immutable.js。这个库有以下几大特点:

下面来看一个使用例子:

constmap1=Immutable.Map({a:1,b:2,c:3})constmap2=map1.set('b',50)map1.get('b')//2map2.get('b')//50基本上现在在开发中都用这个库来处理不可变值的问题。在实际使用中,可以看官方文档按需使用即可。

在React中,对于组件公共逻辑的抽离主要有三种方式要了解。具体如下:

下面将讲解高阶组件HOC和RenderProps。

先看一段代码:

下面来看一个例子,如下代码所示:

值得注意的是,在react中,还有一个比较常见的高阶组件是reduxconnect。用一段代码来演示:

import{connect}from'react-redux';//connect是高阶组件constVisibleTodoList=connect( mapStateToProps,mapDispatchToProps)(TodoList)exportdefaultVisibleTodoList现在,我们来看下connect的源码,具体如下:

值得注意的是,在Vue中有类似于高阶组件的用法,但没有像RenderProps类似的用法,这一点需要稍微留意一下。

下面来看一个例子,具体代码如下:

在上面的代码中,通过this.props.render(this.state)这种形式,将Mouse组件中的属性传递给App,并让App成功使用到Mouse的属性值。

现在,我们来梳理下HOC和RenderProps的区别,具体如下:

对于react来说,它是一个非视图层的轻量级框架,如果要用它来传递数据的话,则要先父传子,然后再慢慢地一层一层往上传递。

但如果用redux的话,假设我们想要某个组件的数据,那这个组件的数据则会通过redux来存放到store中进行管理。之后呢,通过store,再来将数据一步步地往下面的组件进行传递。

值得注意的是,我们可以视Redux为Reducer和Flux的结合。

Redux,实际上就是一个数据层的框架,它把所有的数据都放在了store之中。我们先来看一张图:

大家可以看到中间的store,它里面就存放着所有的数据。继续看store向下的箭头,然后呢,每个组件都要向store里面去拿数据。

我们用一个例子来梳理整张图,具体如下:

React-redux中要了解的几个点是Provider、Connect、mapStateToProps和mapDisptchToProps。

来看以下代码:

再来看一段代码:

import{connect}from'react-redux'import{toggleTodo}from'../actions'importTodoListfrom'../components/TodoList'//不同类型的todo列表constgetVisibleTodos=(todos,filter)=>{switch(filter){case'SHOW_ALL':returntodoscase'SHOW_COMPLETED':returntodos.filter(t=>t.completed)case'SHOW_ACTIVE':returntodos.filter(t=>!t.completed)}}constmapStateToProps=state=>{//state即vuex的总状态,在reducer/index.js中定义return{//根据完成状态,筛选数据todos:getVisibleTodos(state.todos,state.visibilityFilter)}}constmapDispatchToProps=dispatch=>{return{//切换完成状态onTodoClick:id=>{dispatch(toggleTodo(id))}}}//connect高阶组件,将state和dispatch注入到组件props中constVisibleTodoList=connect(mapStateToProps,mapDispatchToProps)(TodoList)exportdefaultVisibleTodoList在上面的代码中,connect将state和dispatch给注入到组件的props中,将属性传递给到TodoList组件。

redux中的同步action如下代码所示:

//同步actionexportconstaddTodo=text=>{//返回action对象return{type:'ADD_TODO',id:nextTodoId++,text}}redux中的异步action如下代码所示:

//异步actionexportconstaddTodoAsync=text=>{//返回函数,其中有dispatch参数return(dispatch)=>{//ajax异步获取数据fetch(url).thne(res=>{//执行异步actiondispatch(addTodo(res.text))})}}(5)Redux数据流图Redux的单项数据流图如下所示:

React-router和vue-router一样,都是两种模式。具体如下:

hash模式的路由配置如下代码所示:

假设现在有父组件RouterComponent,具体代码如下:

继续,我们来看下子组件Project组件时如何进行动态传参的。具体代码如下:

THE END
1.大学生一定要常去图书馆大学生一定要常去图书馆 #大学生视频创作计划 平常在教室里怎么都学不进去 所以今天来到图书馆里 学六级以及明天的考试 不奋斗不青春 加油大学生们! 发布于12月6日 河南省 相关推荐 App内查看更多 得物er-U8P9H9L2 18 送给朋友的 感觉还可以 cholexxx 37 飞天小王子 27 #tabletop 37贰拾壹 207 收藏 评论https://m.dewu.com/note/trend/details?id=254597363
2.书香社会蓬勃发展,多地全民读书活动启动,图书馆人气飙升多地启动全民读书活动,图书馆人气逐渐上升,推动书香社会的构建与发展。这项活动旨在倡导阅读文化,提高公众的阅读兴趣和素养,促进知识的传播和文化的交流。随着越来越多的人参与到读书活动中,图书馆作为阅读的重要场所,也吸引了https://www.linyoer.com/post/2052.html
3.什么样的图书馆是好的图书馆?“问。什么样的图书馆是好的图书馆?馆舍面积大、资源丰富、特藏多、经费充足、一个名人或网红馆长、每日座无虚席、信息系统齐备、论文多……'双一流’大学图书馆和高职高专图书馆的各自特色是什么?谁才是我们的偶像?”紧接着,提出“个人观点,仅供反驳”共十条。图谋第一时间将现场图片分享进圕人堂QQ群。会后http://www.360doc.com/content/24/1211/16/6690723_1141726789.shtml
4.Java检索图书stringjava实验检索图书2. 实验总结:题集(多线程) 2.1 题目:Thread、PrintTask、Runnable与匿名内部类。 并回答:a)通过定义Runnable接口的实现类来实现多线程程序比通过继承自Thread类实现多线程程序有何好处?b) 6-1,6-3,6-11实验总结。 Runnable接口好处: java不允许多继承,因此实现了Runnable接口的类可以再继承其他类。 https://blog.51cto.com/u_16099331/11263613
5.中学图书馆工作总结范文(精选10篇)中学图书馆工作总结范文1 在过去的一学年里,图书馆工作在领导的关心下,在各位老师的支持下。现将下个学年来的各项工作计划列出: 1、制度是做好每一项工作的前提,是提高工作效率的可靠保证,图书室工作也不例外。每开学初,图书室轮流组织各班学生学习图书室的各项规章制度,特别是对三年级的学生组织重点学习。 https://www.ruiwen.com/word/zhongxuetushuguangongzuozongjiefanwen.html
6.图书馆年度总结图书馆年度总结(通用29篇)图书馆年度总结 篇1 一年来,在学院党委的正确领导下,图书馆的全体同志们齐心协力,圆满地完http://m.jiaza.cn/tuwen/taluo/07113499.html
7.图书馆工作的个人总结合集29篇20xx年,在学院领导的全面支持和关心下,在全体馆员的共同努力下,图书馆本着“一切为读者服务”的宗旨,以评估工作指标为标准,按照20xx年度目标管理任务书要求,不断优化服务,拓展功能,认真开展各项业务工作。现对图书馆20xx年的工作总结如下: 一、切实做好基础服务工作,保障图书馆正常运行。 (一)图书馆除坚持各阅览室http://m.yueduku.com/work/gerenzongjie/910/910869.html
8.关于纸张浪费的调查报告(精选10篇)(2) 教师还可以设计一些相关的检测图表、调查卷跟踪记录, 例如每月水、电度数的对比、节约用水用电多少, 省了多少钱, 更重要的是节约了多少能源。在数字的面前, 让学生自己总结出节约的好处, 从而树立牢固的节约意识。 2. 用活动激发学生, 促使其养成习惯 https://www.360wenmi.com/f/filei2gd7jvl.html
9.图书馆读书的活动总结(通用20篇)总结在一个时期、一个年度、一个阶段对学习和工作生活等情况加以回顾和分析的一种书面材料,它可以提升我们发现问题的能力,是时候写一份总结了。我们该怎么写总结呢?以下是小编帮大家整理的图书馆读书的活动总结,仅供参考,希望能够帮助到大家。 图书馆读书的活动总结 1 20xx年“世界读书日”期间,我馆精心组织、周密https://www.jy135.com/huodongzongjie/1097348.html
10.关于图书馆志愿者活动总结(精选21篇)小编给大家分享关于图书馆志愿者活动总结(精选21篇)的范文,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。。 - 素材来源网络 编辑:李欢欢。 图书馆志愿者活动总结(精选21篇) https://www.huhuixin.com/gongzuozongjie/224848.html
11.有关个人学习总结(通用36篇)有关个人学习总结(通用36篇) 精彩的学习生活在不经意间已告一段落,相信你积累了不少学习心得,此时需要认真地写一份学习总结了。那么如何把学习总结做到重点突出呢?以下是小编为大家收集的有关个人学习总结(通用36篇),仅供参考,大家一起来看看吧。 个人学习总结 篇1 http://zongjie.yjbys.com/zongjie/xuexi/880160.html
12.新部编人教版二年级语文上册语文园地5教案(精选14篇)4、同学们很会读书,真的把文字读成了鲜活的画面,敦煌壁画内容丰富,形式多样,历史悠久,技艺精湛,被西方学者称为“墙壁上的图书馆”。课文中这样概括地写了壁画的内容——引读“壁画的`内容丰富多彩”一句。 5、敦煌壁画中,各种佛像画、故事画、山水画、动物画、神话题材画、装饰图案画等应有尽有,其中,最引人注https://www.fwsir.com/jiaoan/html/jiaoan_20200409080840_404774.html
13.整理图书心得体会及收获(专业19篇).docx我们必需与图书馆的管理层建立良好的沟通,以确保在整理图书馆的过程中不会干扰其他图书馆业务的正常运行。 段落五:总结。 为了更好地维护图书馆的秩序和整齐,我们要引入最有效的整理和维护方法。我们必需遵守正确的程序和要求,以便以最经济有效的方式实现所需的目标。最终,我们呈现了整理图书馆的好处、必要性和可行https://max.book118.com/html/2024/0715/8046007120006111.shtm
14.课程实践活动总结(通用23篇)总结是事后对某一阶段的学习或工作情况作加以回顾检查并分析评价的书面材料,它可以明确下一步的工作方向,少走弯路,少犯错误,提高工作效益,是时候写一份总结了。如何把总结做到重点突出呢?以下是小编帮大家整理的课程实践活动总结,欢迎阅读,希望大家能够喜欢。 课http://mip.yuwenmi.com/fanwen/zongjie/3794430.html
15.《数字图书馆》教案6篇(全文)(3)用传统图书的不足与电子图书的好处相对比,体会革命一词的含义。 2.略读6、7段,了解一本普通的图书是怎样变成电子图书的。 3.合作学习8、9段。 (1)自己默读,勾画出说明数字图书馆的优点的相关语句。 (2)小组交流,总结出数字图书馆的优点。 (3)全班汇报。 https://www.99xueshu.com/w/fileglkttn5i.html