第十节 React基础与实践
一、React特性与简介
01. React简介
- 定义:React:用于构建用户界面的JS库;
- 特点:
- 声明式:只关注结果,而不关注如何实现;React 使创建交互式 UI 变得轻而易举。为应用的每一个状态设计简洁的视图,当数据变动时 React能高效更新并渲染合适的组件;
- 组件式:将页面分为多个组件;构建管理自身状态的封装组件,然后对其组合以构成复杂的 UI
- 跨平台编写:不同渲染器都可以使用,实现了跨平台编写;
02. 特性
- React如何快速响应?
- 影响Web性能的两大主要原因:
-
等待资源加载;
- 一次性加载过多资源——React.Lazy;
- 网络请求慢——使用资源加载的UI提示;
- 资源加载失败——ErrorBoundary;
-
大部分情况下浏览器单线程执行;
- JS执行;
- 浏览器计算样式布局;
- UI绘制;
-
- React更新流程:
-
Scheduler(调度器):
- 维护时间切片;
- 与浏览器任务调度;
- 优先级调度;
-
Reconciler(协调器):
- 将JSX转化为Fiber;
- Fiber树对比(双缓存);
- 确定本次更新的Fiber;
- 更新完该Fiber之后才移交,避免更新值进行了一部分;
-
Renderer(渲染器):
- 渲染器用于管理一个React树;使其根据底层平台进行不同的调用;在vue中称为虚拟DOM;在React中称为Fiber树;
- Fiber树是双向链表结构;其生成过程可以是异步的,取决于此时浏览器的任务情况;
- 图示:
- 内存中有两个Fiber树,形成双缓存结构:
- 一个是当前的树【Current Tree】:页面DOM对应的树;
- 一个是正在构建的树【workInProgress Tree】;
- 构建结束后,会用【workInProgress Tree】替代【Current Tree】;
- 将Fiber Tree提交给渲染器,然后完成更新;
- react和JS对比;
- React一定比JS快吗:对于渲染而言,React渲染速度比JS慢;
- 但是用户的需求并非只是“快”,而是页面不出现卡顿,因此React的显示效果更好,保证用户使用效果;
03. 总结
- 优点:
- 快速响应:Fiber;
- 组件化:复用性强;
- 声明式编程;
- 跨平台:只需修改渲染器;
- 缺点:
- 主要应用于大型应用,大型应用需要配套学习状态管理、路由工具;
- 不适合小型应用,需要用babel处理;
二、React基础温故知新
01. 用React开发Web应用
- React Web应用:
- 架构:打包配置:JSX -> Babel -> JS还在优化和错误降级;
- UI:可复用UI -> 组件 -> 页面。可复用逻辑抽离成hook;
- 路由:React Router 向应用中快速地添加试图和数据流,保持页面与URL间的同步;
- 状态:多页面多组件共享信息redux & context;
- 组件:
- 数据:
- 通过定义state操作视图Mount时获取数据更新state Ref保存与视图无直接关系的值unMount前清空Ref;
- 通信:
- pros父子组件通信,context & redux组件信息共享;
- UI:
- 数据决定视图,通过Ref获取到DOM;
- 性能:
- 函数使用useCallback值或者计算使用useMemo组件包裹memo;
02. React基础
2.1 组件
- class组件:
- 继承 + 构造函数;
- this;
- 生命周期;
- render方法;
- 函数式组件:
- 没有生命周期;
- 借助hook;
- 可读性更好一些;
- return JSX;
- 函数式组件 相较于 class组件 的优点:
- 代码量骤减,组件干净清爽;
- 没有复杂的生命周期;
- 支持自定义hook,逻辑复用方便;
- 组件和 hook 的关系:
- 将UI拆成多个独立单元,这些单元组合可以构成多种视图展示,这些独立单元就是组件,组件相当于原子;
- hook贴近组件内部运行的各种概念逻辑,effct、state、context等。hooks更贴近于电子;
- hook无法渲染在页面上,但是组件可以;
2.2 Hook规则 & 原理
- 只能在最顶层使用hook;
- React如何知道哪个state对应哪个useState:React依据【hook调用顺序】;
- 只能在React函数中调用Hook:
- 在React函数组件中或自定义Hook中调用;
- 自定义Hook必须以use开头;
- Hook中的state是完全隔离的;
- Hook过期闭包问题:
- 在JS中,函数运行的上下文是由定义的位置决定的,当函数的闭包包住了旧的变量值时,就出现了过期闭包问题;
2.3 React常见API及作用
三、具体场景案例
组件间共享信息:
组件性能优化:
UseCallback()可以避免多次渲染时,Counter不会重新渲染(由于每次渲染结果都会不一样)
组件挂载位置案例
四、补充
React的卸载阶段
- 卸载阶段:属于组件的最后生命周期,组件被销毁并从DOM中删除;
- componentWillUnmount(卸载),类似于Vue的befroeDestroy,表示组件即将被销毁:
- shouldComponentUpdate(了解):
- 是控制更新阶段的开关,用于控制是否更新,返回true正常更新,返回false不更新;