01 React简介与特性
简介 什么是React(反应)———用于构建用户界面的JavaScript库。
特性 声明式、组件化、跨平台编写
React哲学(Thinking In React)
React是用JavaScript构建 快速响应 的 大型Web应用程序 的首选方式之一。它在Facebook和Instagram上表现优秀。 等待资源加载时间 和 大部分情况下浏览器单线程执行 是影响web性能的两大主要原因。
等待资源加载 一次请求太多资源? 网络请求慢? 资源加载失败?
- √React.Lazy
- √React.Suspense(悬念)
- √ErrorBoundary(错误边界)
浏览器线程执行 JS 执行 浏览器计算样式布局 UI绘制
- √异步更新
- √时间切片
- √React Fiber(纤维)
React 哲学_Lazy& Suspense
样例演示
React 哲学_ErrorBoundary
样例演示
React 哲学_更新流程
Scheduler (调度器)
- 维护时间切片 (类似requestldleCallback(请求回拨))
- 与浏览器任务调度
- 优先级调度
Reconciler (协调器)
- 将JSX 转化为 Fiber
- Fiber 树对比(双缓存)
- 确定本次更新的 Fiber
Renderer(渲染器)
- 渲染器用于管理一棵 React 树
- 使其根据底层平台进行不同的调用
总结_React优缺点
优点!!
- 快速响应: Fiber
- 组件化:复用性强
- 声明式编程
- 跨平台: 只需修改渲染器
缺点? ?
- 大型应用需要配套学习 状态管理、路由工具
- 不适合小型应用,需要用 babel 处理
02 React基础温故知新
用 React 开发 web应用
用 React 开发 web 应用_组件
Class 组件
- 继承 + 构造函数
- this
- 生命周期
- render 方法
函数式组件
- 没有生命周期
- 借助 Hook(钩)
- return JSX
函数式 相较于 Class 的优点
- 代码量骤减,组件干净清爽。
- 没有复杂的生命周期
- 支持自定义 hook,逻辑复用方便。
组件 和 Hook 的关系
我们将 UI 拆成多个独立单元,这些单元组合可以构成多种视图展示,这些独立单元就是组件。 组件相当于原子。 hook 贴近组件内部运行的各种概念逻辑,effect、state、context等。hooks 更贴切于电子。
Hook 规则 & 原理
只能在最顶层使用 Hook
React 怎么知道哪个 state 对应哪个 useState?
答案是 React 靠的是 Hook 调用的顺序
只能在 React 函数中调用 Hook
- 在React函数组件中 或自定义 Hook 中调用
- 自定义 Hook 必须以 use 开头
- Hook 中的 state 是完全隔离的
Hook 过期闭包问题
在 JS中,函数运行的上下文是由定义的位置决定的当函数的闭包包住了旧的变量值时,就出现了过期闭包问题
React常见API及作用
| API | 作用 |
|---|---|
React常见 Hook 及作用
03 业务场景案例
如何划分组件? _Layout(布局)
- Navbar(导航栏)
- Main Content
- Footer
- Floating Button
如何划分组件? _Page
- Banner(横幅)
- CardGroup
- Slider GroupO Help Docs
- Footer Banner(页脚横幅)
如何划分组件?_Component(组成部分)
BlockHeader(阻止标头)
- tag
- title
BlockWrapper(块包装器)
- backgroundType
- animate?(活的): boolean;
- theme?: "dark" | "light"
SlideButton
- onClick(direction, index)
- icon?: ReactNode
- animate?: boolean
SizeText
- 通过 className 控制
- 封装成组件
- 安装主题包
AnimationWrapper(动画包装器)
- animationName?:string
- animationDuration?:number
父组件给子组件通信_案例
知道子组件的表现,直接通过 props 传递即可
不知道具体子组件表现呢? props.children
样例演示
父组件给子组件通信_代码
子组件给父组件通信_案例
样例演示
子组件给父组件通信_代码
组件间共享信息_案例
样例演示
组件间共享信息_context & reducer(减速器)
组件间共享信息 react-redux(还原)
- mapStateToProps(映射状态到道具)
- mapDispatchToProps(映射调度到道具)
组件性能优化_案例
increment(增量)
state.name 发生变化导致
- 重新渲染 Wrapper
- 重新渲染 Counter
- 重新计算 calcValue
可以优化的方向?
- Count 不变的场景下,Counter 不重新渲染
- Count 不变场景下,不重新计算 calcValue
组件性能优化_代码
Question 1.Count 不变的场景下,Counter 不重新渲染
Question 1.1:没有两个完全相等的函数?
Question 2.Count 不变的场景下,不重新计算calcValue
组件挂载位置_案例
- refWrapper(ref包装器)
- visible(看得见的)
- popup(弹出)
样例演示
组件挂载位置_代码
portal(入口)
createPortal 将真实 DOM 的渲染位置也改变了 !
组件挂载位置_冒泡
样例演示
通过 createPortal 改变了组件的真实渲染位置,那么
- 点击 blue-按钮 会不会发生冒泡?
- 会冒泡到那个容器呢?
- A:蓝色容器
- B:黄色容器
- C:两个容器均有
A:一个从 portal 内部触发的事件会一直冒泡至包含 React 树的祖先,即便这些元素并不是 DOM 树中的祖先。
如何进行逻辑复用_useRequest 案例
手动实现一个 useRequest。
样例演示
如何进行逻辑复用_useRequest 分析
- 点击发送请求?
- 前置条件完成后自动请求?
- 轮询请求?
async(异步)
params(参数) interval(区间)
polling(轮询)
如何进行逻辑复用_useRequest run 代码
04 笔记总结
总结
- React 优化资源加载 &快速响应
- 表现优化: ErrorBoundary,Suspense,Lazy
- React 更新流程 Scheduler & Reconciler & Renderer
- 函数式组件和 Class 组件
- Hook 规则,为什么要保证顺序?
- 常见API及常见Hook
- 在项目中如何拆分组件粒度
- 父子组件通信: cloneElement,forwardRef
- 组建信息共享: useContext,useReducer VS Redux
- 性能优化: useCallback,useMemo,momo
- 你不知道的冒泡: Portal
- 自定义 useRequest 实现逻辑复用
学习资料及工具
- React新版教程react.dev/
- React官网教程zh-hans.react.dev/
- React技术揭秘react.iamkasong.com/#%E5%AF%BC%…
- 一文吃透react-hooks原理juejin.cn/post/694486…
- Arco Design (弧设计)arco.design/