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

82 阅读3分钟

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


【响应式系统与React】

Content

  • React的发展历史与应用
  • React的设计思路
  • React的实现
  • React的状态管理库
  • 响应式编程/函数式编程的设计思想

React的发展历史与应用

React的应用

  1. 前端应用开发,如Instagram,Netflix网页版
  2. 移动原生应用开发,如Instagram,Discord,Oculus
  3. 结合Electron,进行桌面应用开发

React的设计思路

UI编程痛点

  • 状态更新,UI不会自动更新,需要手动地调用DOM进行更新
  • 欠缺基本的代码层面的封装和隔离,代码层面没有组件化
  • UI之间的数据依赖关系,需要手动维护,如果依赖链路长,则会遇到"Callback Hell"

响应式与转换式

转换式系统:给定输入,求解输出;例如编译器、数值计算

响应式系统:监听事件,消息驱动;例如监控界面,UI界面

前端UI

graph LR
事件 --> 执行既定的回调 --> 状态变更 --> UI更新

响应式编程:

  • 状态更新,UI自动更新
  • 前端代码组件化,可复用,可封装
  • 状态之间的相互依赖关系,只需声明即可

组件化

  1. 组件化是组件的组合/原子组件
  2. 组件内拥有状态,外部不可见
  3. 父组件可以将状态传入组件内部

组件设计

  1. 组件声明了状态和UI的映射
  2. 组件有Props/State两种状态
  3. 组件可以由其他组件拼装而成

状态归属问题

因为父组件可以将状态传入组件内部,所以多个需要共用的状态都被放到共同的根节点中,这样就失去了组件化的意义。

即状态归属于两个节点向上最近的共同祖先节点。

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>
    );
}    

出现的问题

  1. JSX不符合JS标准语法
  2. 返回的JSX发生改变时,如何更新DOM
  3. State/Props更新时,需要重新触发render函数

Virtual DOM

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

它赋予了React声明式的API,告诉React希望让UI是什么状态、React就确保DOM匹配该状态。

React状态管理库

核心思想是将状态抽离到UI外部进行统一管理,常用的状态管理库有redux、xstate、mobx、recoil

状态机

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

应用机框架

  1. Nextjs,稳定,开发体验好,支持Unbundied Dev
  2. MODERNjs,内置了很多开箱即用的能力与最佳实践
  3. Blitz,无API思想的全栈开发框架,开发过程中无需写API调用和CRUD逻辑,适合前后端紧密结合的小团队项目