react的部分考点

1. 对react的理解

react是什么

用于构建用户界面的 JavaScript 库

react能干什么

可以通过组件化的方式构建 快速响应的大型Web应用程序

react是如何干的

  1. 声明式
  • 声明式 使用声明式的编写用户界面,代码可以方便调试
  • 声明式渲染和命令式渲染
    • 命令式渲染 命令我们的程序去做什么,程序就会跟着命令一步一步执行(jquery)
    • 声明式渲染 我们只需要告诉程序我们需要什么效果,其他的交给程序来做。(vue,react)
  1. 组件化
  • 组件化 把页面分为一个个组件,方便视图的拆分和复用,还可以做到高内聚、低耦合(架构设计时的内聚高低是指,设计某个模块或者关注点时,模块或关注点内部的一系列相关功能的相关程度的高低。低耦合的定义:低耦合是用来度量模块与模块直接的依赖关系)
  1. 一次学习,随处编写 (跨端开发)
  • 可以使用React开发web,Android,IOS,VR和命令式程序
  • ReactNative 使用React 来创建 Android和iOS的原生引用
  • React 360是一个创建3D和VR用户交互的框架。

React干的怎么样

优点

  • 开发团队和社区强大
  • 一次学习,随处编写
  • API比较简洁
    缺点
  • 没有官方系统解决方案,选型成本高(比如vue全家桶, 需要自己选择)
  • 过于灵活、不容易写出高质量的应用

2. react 为什么要引入jsx

jsx是什么

  • jsx 是一个JavaScript 的语法扩展。 JSX 可以很好的描述UI应该呈现出它应有交互的本质形式。
  • jsx 其实是 React.createElement的语法糖

react 想要实现的目的

  • 实现声明式
  • 代码结果需要非常清晰和简洁,可读性强
  • 结构、样式和事件等实现高内聚低耦合,方便复用和组合
  • 不引入新的概念和语法,只写JavaScript

为什么jsx最好

  • vue.js使用了基于HTML的模板语法,运行开发者声明式地将DOM绑定至底层Vue实例的数据
  • 引入了太多概念,比如Angular引入了控制器、作用域、服务等概念。

jsx的工作原理

  • AST 抽象语法树是源代码 语法 结构的一种抽象表示。 它以树状形式表现编程语法的语法结构,树上的每个节点都表示源代码中的一种结构。

*babel工作流


image.png

使用虚拟DOM的优缺点

优点

  • 处理了浏览器的兼容问题,避免用户操作真实DOM。
  • 内容经过JSX处理,可以防范XSS攻击。
  • 容易实现跨平台开发应用
  • 更新时可以实现差异化更新,减少更新DOM的操作。

缺点

  • 虚拟DOM需要消耗额外的内存
  • 首次渲染其实并不一定会更快

函数组件和内组件的区别

相同点

  • 它们都可以接受属性并返回React元素

不同点

  • 编程思想不同: 类组件需要创建实例,基于面向对象的方式编程。而函数组件不需要创建实例,接受输入,返回输出,基于函数式编程思想。
  • 内存占用: 内组件需要创建并保存实例,会占用一定内存。函数组件不需要创建实例,可以节约内存。
  • 捕获特性: 函数组件具有值捕获特性(值捕获: 引用中的变量指向老的值,不会指向新的值。 比如类组件中setTimeout中console.log() state会指向新的值)
  • 可测试性: 函数式组件便于编写单元测试
  • 状态: 类组建有自己的实例,可以定义状态,而且可以修改状态更新组件。函数式组件以前没有状态,现在可以通过使用useState使用状态
  • 生命周期: 类组件有自己完整的生命周期。函数式组件没有生命周期,通过useEffect实现类似生命周期
  • 逻辑复用: 类组件通过继承实现逻辑的复用。但是官方推荐组件优于继承。 函数式组件可以通过指定用Hooks实现逻辑复用。
  • 跳过更新: 类组件通过 shouldComponentUpdate(返回true更新,返回false不更新) 和 PureComponent(浅比较,重写了shouldComponentUpdate)来跳过更新,函数式组件可以使用React.memo来跳过更新

React中的渲染流程

设计理念

  • 跨平台渲染==》虚拟DOM
  • 快速响应==》异步可中断+增量更新

性能瓶颈

  • js执行任务时间过长
    • 浏览器刷新频率为60Hz,16.6毫秒渲染一次,而JS线程和渲染线程是互斥的,所以如果JS线程执行时间超过16.6ms的话,会导致掉帧,卡顿, 解决方案是React利用空闲的时间进行更新,不影响渲染。
    • 把一个耗时的任务拆分为一个个小任务,分部在每一帧里的方式叫做时间切片。

  • 每个帧的开头包括样式计算、布局和绘制
  • JavaScript 执行JavaScript引擎和渲染引擎在同一个渲染线程,GUI渲染和JavaScript执行两者互斥
  • 如果某个任务执行时间过长,浏览器会推迟渲染


    image.png

通过上图可看到,一帧内需要完成如下六个步骤的任务:

  • 处理用户的交互
  • JS 解析执行
  • 帧开始。窗口尺寸变更,页面滚去等的处理
  • requestAnimationFrame(rAF)
  • 布局
  • 绘制

上面六个步骤完成后没超过 16 ms,说明时间有富余,此时就会执行 requestIdleCallback 里注册的任务

window.requestIdleCallback()方法将在浏览器的空闲时段内调用的函数排队。这使开发者能够在主事件循环上执行后台和低优先级工作,而不会影响延迟关键事件,如动画和输入响应。函数一般会按先进先调用的顺序执行,然而,如果回调函数指定了执行超时时间timeout,则有可能为了在超时前执行函数而打乱执行顺序。

image.png

从上图也可看出,和requestAnimationFrame 每一帧必定会执行不同,requestIdleCallback 是捡浏览器空闲来执行任务。

如此一来,假如浏览器一直处于非常忙碌的状态,requestIdleCallback 注册的任务有可能永远不会执行。此时可通过设置 timeout (见下面 API 介绍)来保证执行。

var handle = window.requestIdleCallback(callback[, options])
  • callback:回调,即空闲时需要执行的任务,该回调函数接收一个
    IdleDeadline对象作为入参。其中IdleDeadline对象包含:
    • didTimeout,布尔值,表示任务是否超时,结合 timeRemaining 使用。
    • timeRemaining(),表示当前帧剩余的时间,也可理解为留给任务的时间还有多少。
  • options:目前 options 只有一个参数
    • timeout。表示超过这个时间后,如果任务还没执行,则强制执行,不必等待空闲。

React16+的渲染流程

  • scheduler选择搞优先级的任务进入reconciler
  • reconciler 计算变更的内容
  • react-dom 把变更的内容渲染到页面上

fiber

  • 我们可以通过某些调度策略合理分配CPU资源,从而提高用户的响应速度
  • 通过fiber架构,让自己的调和过程变成可中断。适时地让出CPU执行权

fiber 是一个执行单元

  • fiber是一个执行单元,每次执行完一个执行单元,React会检查现在还剩多少时间, 如果没有时间就会将控制权让出去


    image.png

fiber也是一种数据结构 https://www.jianshu.com/p/ed14378d8867

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

推荐阅读更多精彩内容