这是我参与「第四届青训营 」笔记创作活动的的第十四天。 今天学习了《响应式系统和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)响应式与转换式
响应式系统:
事件 --> 执行既定的回调 --> 状态变更
前端UI:
事件 --> 执行既定的回调 --> 状态变更 --> UI更新
(3)响应式编程
- 状态更新,UI自动更新。
- 前端代码组件化,可复用,可封装。
- 状态之间的互相依赖关系,只需声明即可。
(4)组件化
什么是组件?
- 组件是组件的组合/原子组件
- 组件内拥有状态,外部不可见
- 父组件可将状态传入组件内部
组件设计
- 组件声明了状态和U的映射。
- 组件有Props/State 两种状态。
- “组件"可由其他组件拼装而成。
组件代码的设计
- 组件内部拥有私有状态 State。
- 组件接受外部的Props状态提供复用性。
- 根据当前的State/Props,返回一个Ul。
(5)状态归属问题
- 状态归属于两个节点向上寻找到最近的祖宗节点。
状态如何改变?
- 将onChangeValue()向下传递。
思考
1、React是单向数据流,还是双向数据流?
2、如何解决状态不合理上升的问题?
3、组件的状态改变后,如何更新DOM?
(6)生命周期
三、React(hooks)的写法
下面是一段React代码:
useState
传入一个初始值,返回一个状态,和set该状态的函数,用户可以通过调用该函数,来实现状态的修改。
useEffect
传入一个函数,和一个数组,数组是状态的数组,称作依赖项,该函数在mount时,和依赖项被set的时候会执行。
有“副作用"的函数,要传入useEffect来执行。副作用代表除了单纯的计算之外,还要做其它的一些事情,比如网络请求,更新DOM,localStorage存储数据等。
Hook使用法则
不要在循环、条件或嵌套函数中调用Hook。
四、React的实现
React代码存在的问题:
- JSX 不符合JS标准,语法
- 返回的JSX 发生改变时,如何更新DOM
- State/Props更新时,要重新触发render函数
(1)转译
(2)虚拟DOM
Virtual DOM是一种用于和真实DOM同步,而在JS内存中维护的一个对象,它具有和DOM类似的树状结构,并和DOM可以建立一一对应的关系。
它赋予了React声明式的APl:您告诉 React希望让U是么状态,React就确保DOM匹配该状态。这使您可以从属性操作、事件处理和手动DOM更新这些在构建应用程序时必要的操作中解放出来。
(3)如何Diff
更新次数少 <---> 计算速度快
完美的最小Diff 算法,需要 O(n^3)的复杂度。
牺牲理论最小 Diff,换取时间,得到了O (n)复杂度的算法:Heuristic O(n) Algorithm
| 元素类型 | 操作 |
|---|---|
| 不同元素的类型 | 替换 |
| 同类型的DOM元素 | 更新 |
| 同类型的组件元素 | 递归 |
五、React状态管理库
核心思想:将状态抽离到UI外部进行统一管理。
状态机:当前状态,收到外部事件,迁移到下一个状态。
比如红绿灯:
六、应用级框架科普
Next.js
硅谷明星创业公司Vercel的 React开发框架,稳定,开发体验好,支持Unbundled Dev,swc等,其同样有Serverless一键部署平台帮助开发者快速完成部署。口号是“Let's Make webFaster"
Modern.js
字节跳动web Infra团队研发的全栈开发框架,内置了很多开箱即用的能力与最佳实践,可以减少很多调研选择工具的时间。
BIitz
无API思想的全栈开发框架,开发过程中无需写API 调用与CRUD逻辑,适合前后端紧密结合的小团队项目。