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

58 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

以下为今日课上笔记内容

前置知识

1.HTML,JS,CSS基础。

2.基础的数据结构/算法知识,如二叉树,深度遍历等。

3.会使用浏览器提供的DOM API 来修改 DOM更新 UI

一. React 历史与应用

应用: 08d80bef5f3cdd9e8daf9042e0b56ff.png

历史: 6df69eea5633ea12bd113173b08ce5e.png 05517f560bdf8fc2b45f4b2ae5d8ca2.png

866b224ba77cc527f50d62583c7d10b.png

二.React 的设计思路

  1. UI 编程痛点

b726bf08052be5585ad8c9c646265fd.png

1)状态更新,UI 不会自动更新,需要手动地调用 DOM进行更新。

2)欠缺基本的代码层面的封装和隔离,代码层面没有组件化。

3)UI 之间的数据依赖关系需要手动维护,如果依赖链路长,则会遇到“Callback Hell”。

2.响应式与转换式

d5a292bca5de4dd4dcf81a24083d46e.png 响应式系统

事件————执行既定的回调————状态变更

React 的设计与实现 1.响应式编程

前端 UI

事件————执行既定的回调————状态变更————UI 更新

1)状态更新,UI自动更新

2)前端代码组件化,可复用,可封装

3)状态之间的互相依赖关系,只需声明即可

2.组件化

af08664e0bd3cf1cf122453b2514e8a.png

总结

1)组件是 组件的组合/原子组件

2)组件内拥有状态,外部不可见

3)父组件可将状态传入组件内部

3.状态归属问题

[当前价格]状态属于谁?

[当前价格] 属于 Root 节点! (小伏笔)

总结:状态归属于两人节点向上寻找到最近的祖宗节点

[当前价格]如何改变?

将 onChangeValue()向下传递

Javascript 中,函数是 (一等公民)

c6071794850d70babb76c181beced21.png

思考

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

单项数据流

React 的设计思路————组件化

组件设计

1.组件声明了状态和 UI的映射

2.组件有 Props/State 两种状态

3.“组件”可由其他组件拼装而成

组件代码会是什么样子?

1.组件内部拥有私有状态 State

2.组件接受外部的 Props 状态提供复用性

3.根据当前的 State/Props,返回一个 Ul

响应式编程

861c382ced63a446f3220a2d5b30d5a.png

React 的设计思路- 生命周期

7ac3184a0d02239769ff2e015610d71.png

三.React(hooks) 的写法

49d5ec359ee3eec8c4bded58de6fbcd.png

254a0f5fa6a3762a2f815519aaef51e.png

四.React 的实现

React 的实现 -Problems

1.JSX 不符合 JS 标准语法

2.返回的 JSX 发生改变时如何更新 DOM

3.State/Props 更新时,要重新触发 render 函数

React 的实现 - Problem1

58f1310f1c6ac3c5e403a38c867c1af.png

Virtual DOM (虚拟 DOM)

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

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

指定式API:需要一步步进行

声明式API:发出一个指令

响应式API:声明式的一种,一个状态改变会连带改变另一个状态

a29b3d7475eb713843dc41b278354ac.png

React 的实现 - How to Diff?

6960a589319497089bc5fd6282e97a0.png

trade off 权衡

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

310fe3ac09bf8e8d97775e2e5fc5a19.png

五.React 状态管理库

React 状态管理库 - 核心思想

12f40ad37a91d5437cf8daef9087645.png

React 状态管理库 - 推荐

将状态抽离到 UI外部进行统一管理

064173b50b04e66a037244d7c216fb4.png

React 状态管理库 - 状态机

当前状态,收到外部事件,迁移到下一个状态 dce1133cfe2b0216c4fd376b4682aee.png

React 状态管理库 Modern.js/Reduck

97eb0685b2eb0a1775cb3b84480c514.png

六.应用级框架科普

4870c5b773be91cc285e0ed67000cfb.png