这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
【响应式系统与React】
Content
- React的发展历史与应用
- React的设计思路
- React的实现
- React的状态管理库
- 响应式编程/函数式编程的设计思想
React的发展历史与应用
React的应用
- 前端应用开发,如Instagram,Netflix网页版
- 移动原生应用开发,如Instagram,Discord,Oculus
- 结合Electron,进行桌面应用开发
React的设计思路
UI编程痛点
- 状态更新,UI不会自动更新,需要手动地调用DOM进行更新
- 欠缺基本的代码层面的封装和隔离,代码层面没有组件化
- UI之间的数据依赖关系,需要手动维护,如果依赖链路长,则会遇到"Callback Hell"
响应式与转换式
转换式系统:给定输入,求解输出;例如编译器、数值计算
响应式系统:监听事件,消息驱动;例如监控界面,UI界面
前端UI
graph LR
事件 --> 执行既定的回调 --> 状态变更 --> UI更新
响应式编程:
- 状态更新,UI自动更新
- 前端代码组件化,可复用,可封装
- 状态之间的相互依赖关系,只需声明即可
组件化
- 组件化是组件的组合/原子组件
- 组件内拥有状态,外部不可见
- 父组件可以将状态传入组件内部
组件设计
- 组件声明了状态和UI的映射
- 组件有Props/State两种状态
- 组件可以由其他组件拼装而成
状态归属问题
因为父组件可以将状态传入组件内部,所以多个需要共用的状态都被放到共同的根节点中,这样就失去了组件化的意义。
即状态归属于两个节点向上最近的共同祖先节点。
React的实现
import React, { useState, useEffect } from 'react';
function Example (){
const [count, setCount] = useState(0);
useEffect(() => {
document.title = 'You clicked ${count} times';
});
return (
<div>
<p>You Clicked {count} times </p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
出现的问题
- JSX不符合JS标准语法
- 返回的JSX发生改变时,如何更新DOM
- State/Props更新时,需要重新触发render函数
Virtual DOM
Virtual DOM 是一种用于和真实DOM同步,而在JS内存中维护的一个对象,它具有与DOM类似的树状结构,并和DOM可以建立一一对应的关系。
它赋予了React声明式的API,告诉React希望让UI是什么状态、React就确保DOM匹配该状态。
React状态管理库
核心思想是将状态抽离到UI外部进行统一管理,常用的状态管理库有redux、xstate、mobx、recoil
状态机
当前状态收到外部事件,迁移到下一个状态
应用机框架
- Nextjs,稳定,开发体验好,支持Unbundied Dev
- MODERNjs,内置了很多开箱即用的能力与最佳实践
- Blitz,无API思想的全栈开发框架,开发过程中无需写API调用和CRUD逻辑,适合前后端紧密结合的小团队项目