React简述

React简述

React是Facebook在2013年推出的前段框架。React不是一个MVC框架,React是一个构造可组合式用户界面的库。它鼓励创建可重用的UI组件会随着时间而改变的数据。React采用不同的方法,当组件第一次初始化时,render方法调用,为试图生成一个轻量级的表现。通过这个表现,产生一个标签字符串,然后插入文档中。当数据变化时,render方法再次被调用。为了尽可能有效的完成更新,我们比较之前调用的render返回的值与新的值,然后产生一个最小的变更去应用DOM中。

问题出现的根源

  • 传统 UI 操作关注太多细节
  • 应用程序状态分散在各处难以追踪和维护

Facebook认为MVC无法满足他们的扩展需求,由于他们非常巨大的代码库和庞大的组织,使得MVC很快变得复杂,每当需要添加一项新功能或者特性时,系统的复杂就成级数的增长,致使代码变得脆弱而不可预测,结果导致他们的MVC正在土崩瓦解。认为MVC不适合大规模的应用。当系统中有很多模型和相应的视图时,其复杂度就会迅速扩大,非常难以理解和调试,特别是模型和视图可能存在双向数据流动。

React:始终整体"刷新"页面,无需关心细节。以组件的方式去描述UI,4个必须API,单向数据流,完善的错误提示。

数据模型如何解决

传统MVC难以扩展和维护,Model和View之间的关系错综复杂而且双向绑定,如果业务复杂出现问题后很难去追踪是Model的问题还是View的问题。

传统MVC难以扩展和维护

针对这个问题,React提出Flux架构,该设计模式的核心思想就是单向数据流。首先用户操作产生Action,Action经过Dispatcher再发送到Store,Store根据Action来进行处理,View是绑定到Store上的,此时View随Store更新而更新。


Flux架构:单向数据流

Flux架构的衍生项目:Redux、Mobx。

组件

React组件由props和state最终得到一个View。状态有外部传过来状态和内部维护状态,两种状态最终决定了View。React一般不提供方法,而是某种状态机,可以理解React组件为一个纯函数,React是单向数据绑定。
以组件的方式考虑UI的构建,将UI组织成组件树的形式。

下面的评论框由CommentBox、CommentList和CommentForm三个组件共同完成,代码部分除了div和h1标准的html的tag外还有CommentList和CommentForm两个自定义组件共同完成。

UI的构建

受控组件的状态来自外部,要传递value和onChange,非受控组件的状态由内部维护,如果外部需要可以通过其他方式获取,也就不需要传递value和onChange。


受控组件和非受控组件

在创建组件时要遵守单一职责原则。每个组件只做一件事,组件是构建UI的最小元素,每个组件都应该尽量的小,这样才能够让复杂度分散出去,在以后的开发中如果组件变得复杂,应该拆分成小组件。
数据状态管理要遵守DRY原则。能计算得到的状态就不要单独存储;组件尽量无状态,所需数据通过props获取以提高组件的性能。

JSX的本质

JSX:在JavaScript代码中直接写HTML标记。JSX并不是模板语言,只是一种语法糖。TIP:自定义组件以大写字母开头,React认为小写的tag是原生DOM节点,如div;JSX标记可以直接使用属性语法,例如<menu.Item />

比如我们定义了一个变量name,又定义了一个HTML的element:

const name = 'Vincent Wang';
const element = <h1>Hello, {name}</h1>

实际上是动态创建了一个组件,而且是用JavaScript语法。


image.png

JSX本身也是表达式,element返回一个HTML的节点:

const element = <h1>Hello, world!</h1>

在属性中使用表达式,如果给一个组件传递属性的值,这个属性的值可以是JavaScript的表达式:

<MyComment foo={1 + 2} />

延展属性,如果给一个组件传递一组值,此时我们不需要一个一个填写,只需要...语法,

const props = { name: "Red", value: "red" };
const greeting = <Greeting {...props} />;

表达式作为子元素,子元素是React的一个特殊属性。只需要用大括号将JavaScript语法包起来。

const element = <li>{props.message}</li>

** JSX的优点**

  • 有声明式创建界面的直观
  • 代码动态创建界面的灵活
  • 不需要学习新的模板语言

React生命周期及使用场景

React主要分三个阶段:Render阶段(计算当前的状态)、Pre-commit阶段(读取DOM内容)和Commit阶段(React把当前状态映射到DOM节点时需要实际更新DOM节点)。

生命周期

图片来源:http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

生命周期可以分为三个类型:挂载时、更新时和卸载时。

创建时
  1. constructor
    一个组件的构造函数的创建,也是唯一可以直接修改state的地方。
  2. getDerivedStateFromProps
    从外部的属性初始化内部的状态,在初始安装和后续更新上,都在调用render方法之前立即调用getDerivedStateFromProps。它返回一个对象以更新状态,或者返回null则不更新任何内容。这个方法一般不建议使用,如果state需要从props中获取的时候,可以通过props动态计算等到,不需要单独存储这个状态,否则要维护两者状态一致性,这样会增加复杂度,每次render都会调用。一般表单控件获取默认值。
    3.render
    描述UI DOM结构,类组件中唯一需要的方法。
  3. componentDidMount
    挂载组件(插入树中)后立即调用componentDidMount()。我们可以在此处发起请求或者定义外部的资源等。只执行一次,可以获取外部资源。
更新时

当组件有新的属性或者修改了state内部状态,当然如果强制刷新forceUpdate可以会触发。

  1. getDerivedStateFromProps
    同样是从外部属性得到内部的状态
  2. shouldComponentUpdate
    使用shouldComponentUpdate()让React知道组件的输出是否不受当前状态或道具更改的影响。在这里可以做一些组件的性能优化,比如props即使发生变化且UI不需要更新,这时可以通知React组件直接返回false则不需要Update。一般可以由PureComponent自动实现,来判断当前state和props是否发生变化。
  3. render
    计算虚拟的DOM,虚拟DOM维持内部的UI状态,计算diff等。
  4. getSnapshotBeforeUpdate
    它使组件可以在DOM可能发生更改之前从DOM捕获一些信息(例如,滚动位置),返回的任何值都将作为参数传递给componentDidUpdate(),一般在获取render之前的DOM状态时使用。
  5. componentDidUpdate
    发生更新后,立即调用componentDidUpdate(),初始渲染不调用此方法。React更新的事情做完后可以根据实际业务在此处做一些处理,然后更新到UI上。页面根据props变化来重新获取数据。
卸载时
  • componentWillUnmount
    当组件移除时,需要销毁组件来释放资源。

该文章为记录本人的学习路程,也希望能够帮助大家,知识共享,共同成长,共同进步!!!文章地址://www.greatytc.com/p/b6f5547e0caa

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352