响应式系统和React | 青训营笔记

127 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第十四天。 今天学习了《响应式系统和React》,对React框架进行了一个初步的入门了解,我们可以通过React减少JavaScript对页面操作的刷新和重新布局,做到响应式编程,从而提高浏览器的效率。

本堂课重点内容

  • React的历史与应用
  • React的设计思路
  • React的写法与实现
  • React状态管理库

详细知识点介绍

详细知识点分享在文章最后。

课后个人总结

我觉得React的优点在于组件化以及JSX语法。组件化实现了页面通用元素的封装,提高页面元素的复用性;而JSX语法则便于我们在js中编写html代码。并且学习React是有一定的学习成本的,主要是如果想要用它进行项目开发,就需要学习一系列它的技术栈,包括基本知识、运行编译环境和一系列插件。

笔记

响应式系统和React

一、React的历史与应用

  • 前端应用开发,如Facebook、Instagram、Netflix网页版
  • 移动原生应用开发,如Instagram、Discord、Oculus
  • 结合Electron,进行桌面应用开发

2010年 Facebook 在其php生态中,引入了xhp框架,首次引入了组合式组件的思想,启发了后来的React 的设计。

2011年Jordan Walke创造了FaxJS,也就是后来的React原型。

2012年在Facebook 收购 Instagram后,该FaxIS项目在内部得到使用,Jordan Walke 基于FaxJS 的经验,创造了React。

2013年React 正式开源,在2013 JSConf 上 Jordan Walke介绍了这款全新的框架。

2014年-今天 生态大爆发,各种围绕React的新工具/新框架开始涌现。

二、React的设计思路

(1)UI编程痛点

使用原生的JavaScript进行一些功能的实现的时候:

  • 状态更新,UI不会自动更新,需要手动地调用DOM进行更新。
  • 欠缺基本的代码层面的封装和隔离,代码层面没有组件化。
  • UI之间的数据依赖关系,需要手动维护,如果依赖链路长,则会遇到“Callback Hell”'。

(2)响应式与转换式

image-20220807100955962.png

响应式系统:
    事件 -->  执行既定的回调 -->  状态变更
​
前端UI:
    事件 -->  执行既定的回调 -->  状态变更  -->  UI更新

(3)响应式编程

  • 状态更新,UI自动更新。
  • 前端代码组件化,可复用,可封装。
  • 状态之间的互相依赖关系,只需声明即可。

(4)组件化

什么是组件?

  • 组件是组件的组合/原子组件
  • 组件内拥有状态,外部不可见
  • 父组件可将状态传入组件内部

组件设计

  • 组件声明了状态和U的映射。
  • 组件有Props/State 两种状态。
  • “组件"可由其他组件拼装而成。

组件代码的设计

  • 组件内部拥有私有状态 State。
  • 组件接受外部的Props状态提供复用性。
  • 根据当前的State/Props,返回一个Ul。

(5)状态归属问题

  • 状态归属于两个节点向上寻找到最近的祖宗节点。

状态如何改变?

  • 将onChangeValue()向下传递。

思考

1、React是单向数据流,还是双向数据流?

2、如何解决状态不合理上升的问题?

3、组件的状态改变后,如何更新DOM?

(6)生命周期

image-20220807102354526.png

三、React(hooks)的写法

下面是一段React代码:

image-20220807102450400.png

useState

传入一个初始值,返回一个状态,和set该状态的函数,用户可以通过调用该函数,来实现状态的修改。

useEffect

传入一个函数,和一个数组,数组是状态的数组,称作依赖项,该函数在mount时,和依赖项被set的时候会执行。

有“副作用"的函数,要传入useEffect来执行。副作用代表除了单纯的计算之外,还要做其它的一些事情,比如网络请求,更新DOM,localStorage存储数据等。

Hook使用法则

不要在循环、条件或嵌套函数中调用Hook。

四、React的实现

React代码存在的问题:

  • JSX 不符合JS标准,语法
  • 返回的JSX 发生改变时,如何更新DOM
  • State/Props更新时,要重新触发render函数

(1)转译

image-20220807103457568.png

(2)虚拟DOM

Virtual DOM是一种用于和真实DOM同步,而在JS内存中维护的一个对象,它具有和DOM类似的树状结构,并和DOM可以建立一一对应的关系。

它赋予了React声明式的APl:您告诉 React希望让U是么状态,React就确保DOM匹配该状态。这使您可以从属性操作、事件处理和手动DOM更新这些在构建应用程序时必要的操作中解放出来。

image-20220807103837457.png

(3)如何Diff

更新次数少 <---> 计算速度快

完美的最小Diff 算法,需要 O(n^3)的复杂度。

牺牲理论最小 Diff,换取时间,得到了O (n)复杂度的算法:Heuristic O(n) Algorithm

元素类型操作
不同元素的类型替换
同类型的DOM元素更新
同类型的组件元素递归

五、React状态管理库

核心思想:将状态抽离到UI外部进行统一管理。

image-20220807104632555.png

状态机:当前状态,收到外部事件,迁移到下一个状态。

比如红绿灯:

image-20220807104717426.png

六、应用级框架科普

Next.js

硅谷明星创业公司Vercel的 React开发框架,稳定,开发体验好,支持Unbundled Dev,swc等,其同样有Serverless一键部署平台帮助开发者快速完成部署。口号是“Let's Make webFaster"

Modern.js

字节跳动web Infra团队研发的全栈开发框架,内置了很多开箱即用的能力与最佳实践,可以减少很多调研选择工具的时间。

BIitz

无API思想的全栈开发框架,开发过程中无需写API 调用与CRUD逻辑,适合前后端紧密结合的小团队项目。