这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
React课程笔记(上)
一、内容概要
- React的历史与应用
- React的设计思路
- React (hooks)的写法
- React的实现
二、重点内容
- 前端应用开发历程
- 移动原生应用开发
- 结合 Electron 的桌面应用开发
- UI 编程痛点
- 响应式与转换式
- React 设计与实现 - 组件化
- React 设计与实现 – 状态归属问题
- React 设计与实现 – 生命周期
- React 的实现基本概要
- React 的实现 - Problem
三、详细知识点
1、React的应用
- 前端应用开发,如Facebook, lnstagram, Netflix网页版。
- 移动原生应用开发,如linstagram, Discord, Oculus。
- 结合Electron,进行桌面应用开发。
2、UI编程的痛点
- 状态更新, UI不会自动更新,需要手动调用DOM进行更新
- 欠缺基本的代码层面的封装和隔离,代码层面没有组件化
- UI之间的数据依赖关系,需要手动维护,如果依赖链路长,则会遇到"Callback Hell"
3、响应式与转换式区别
- 响应式≠转换式
- 转换式系统:给定输入求解输出
- 响应式系统:监听事件,消息驱动
4、响应式编程
- 状态更新, UI自动更新
- 前端代码组件化, 可复用, 可封装
- 状态之间的互相依赖关系, 只需声明即可
5、组件化
- 组件是组件的组合/原子组件
- 组件内拥有状态, 外部不可见
- 父组件可将状态传入组件内部
组件设计
- 组件声明了状态和UI的映射。
- 组件有Props/State两种状态,即私有状态和外部传入两种状态。
- "组件"可由其他组件拼装而成。
6、生命周期
7、hooks
- hooks是React的一种最常用的写法
- hooks是可以挂到react组件的生命周期上去执行的函数。
- hooks分为两种:useState、useEffect,也有其他的但也基本都是useState、useEffect两种的封装。
8、useState和useEffect
1. useState
- 传入一个初始值,返回一个状态,和set该状态的函数,用户可以通过调用该函数,来实现状态的修改。
2. useEffect
- 传入一个函数,和一个数组,数组是状态的数组,称作依赖项,该函数在mount时,和依赖项被set的时候会执行。
- 有"副作用"的函数,要传入useEffect来执行。副作用代表除了单纯的计算之外,还要做其它的一些事情,比如网络请求,更新DOM,localStorage存储数据等。
9、React的实现Problems
- JSX不符合JS标准语法,react不能直接在浏览器运行
解决办法:就是转译 加一个transpile
- 返回的JSX发生改变时, 如何更新DOM
解决办法:
- 由于DOM树全部更新耗费太多,因此,只更新 新的JSX和旧的JSX之间的 different不同的部分,将DOM的耗时降到最低,这样就可以将DOM操作的耗时降到最低,实现了性能提升。
- 但要注意diff算法本身不能太耗时,时间复杂度不能太高,否则JS内部运行时语法成本太高。
- 两者之间需要平衡:diff尽可能小,计算diff的过程时间尽可能短。
- State/Props更新时, 要重新触发render函数
10、compile和transpile
- compile是编译
- transpile是转义。把一个语法的语言转译另外一个语言(例如C++转成JS)
- HTML本质上是一个树状结构, 每一个节点可以有自己的属性, 可以表示成JSON数据格式, 因此可以转译
11、Virtual DOM (虚拟DOM)
- Virtual DOM是一种用于和真实DOM同步, 而在JS内存中维护的一个对象, 它具有和DOM类似的树状结构, 并和DOM可以建立一一对应的关系.
- 它赋予了React声明式的API, 您告诉React希望让UI是什么状态, React就确保DOM匹配该状态. 使您可以从属性操作,事件处理和手动更新DOM这些在构建应用程序时必要的操作中解放出来
真实的DOM不是JS的一个对象,而是浏览器内部维护的一个状态,我们只能通过DOM接口修改,不能直接随意修改。
但我们可以声明一个和DOM具有一一对应关系的变量,每次更新的时候是一个新的virtualDOM,和旧的做对比将diff算出来,再去更新。
四、个人总结
- React是用于构建用户界面的JavaScript库。
- 框架特点
- 声明式设计:React 使创建交互式 UI 变得轻而易举。为你应用的每一个状态设计简洁的视图,当数据变动时 React能高效更新并渲染合适的组件。
- 组件化: 构建管理自身状态的封装组件,然后对其组合以构成复杂的 UI。
- 高效:React通过对DOM的模拟,最大限度地减少与DOM。
- 灵活:无论你现在使用什么技术栈,在无需重写现有代码的前提下,通过引入React来开发新功能。