0x1 React 的历史与应用

  1. 应用场景

    1. 前端应用开发,如 Meta、Ins、Netflix 的网页版
    2. 移动原生应用开发,如 Ins、Discord
    3. 结合 Electron 进行桌面应用开发
  2. 发展历史

    1. Facebook 引入了 xhp 框架,其组合式组件的思想启发了 React 的设计

    2. Jordan Walke 创造了 React 的原型—— FaxJS

      FaxJS 的四个特性:

      1. 既可在服务端渲染,也可在客户端渲染
      2. 响应式(Reactive):当状态变更时,其 UI 也会自动更新
      3. 高性能
      4. 结构化
    3. 在 Facebook 收购 Ins 后,Jordan Walke 创造了 React

0x2 React 的设计思路

单向数据流:父组件向子组件单向传递数据

  1. UI 编程痛点

    1. 状态更新时,UI 不会自动更新,需要手动调整
    2. 欠缺基本的代码层面的封装和隔离
    3. UI 之间的数据依赖关系需要手动维护
  2. 转换式与响应式

    1. 转换式:给定输入,求解输出。如:编译器

    2. 响应式:监听事件,消息驱动。如:监控系统

      响应式系统:

      graph LR
      A(事件)-->B(执行既定的回调)
      B-->C(状态变更)
      C--前端 UI-->D(UI 更新)
  3. 响应式编程

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

    1. 组件时组件的组合/原子组件
    2. 组件拥有的状态是外部不可见的
    3. 父组件可将状态传入组件内部
  5. 组件设计

    1. 组件声明了状态和 UI 的映射
    2. 组件有 Props[外部传入]/State[内部私有] 两种状态
    3. 组件可由其他组件拼装而成
  6. 组件代码结构

    1. 内部拥有私有状态 State
    2. 接受外部的 Props 状态提供复用性
    3. 根据当前的 Props/State 返回一个 UI

0x3 React (hooks)的写法

import React, { useState, useEffect } from 'react'
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `${count} times`;
})
return (
<div>
<p>You clicked { count } times</p>
<button onClick={ () => setCount(count+1) }>
Click me
</button>
</div>
);
}
  1. 在 React 中声明一个新状态时,需要手动调用 useState

  2. 对 useState 传入一个初始值后,返回一个状态

  3. 对 useEffect 传入一个函数和一个数组。数组是状态的数组,称作依赖项。“副作用”函数

    副作用:代表除了基础函数操作外,还可以进行网络请求、更新 DOM、存储数据等功能

0x4 React 的实现

  1. JSX/TSX 中的代码不符合 JS/TS 的标准

    • 通过转译成一般 JS/TS 代码
  2. 返回的 JSX 发生改变时如何更新 DOM

    • 虚拟 DOM(用于平衡 Diff 算法更少的更新次数更快的计算速度

      Diff 算法:

      • 替换不同类型的元素
      • 更新同类型的 DOM 元素
      • 递归同类型的组件元素
  3. Props/State 更新时要重新触发 render

0x5 React 状态管理库

  1. React 状态管理库

    将组件的状态从根节点中抽离出来,集中到 UI 外部统一管理,构成 React 状态管理库

    如:redux、xstate、mobx、recoil

  2. 状态机

    在当前状态下,接受外部事件后,迁移至下一个状态

0x6 应用级框架科普

  1. next.js——React 开发框架
  2. modern.js——全栈开发框架
  3. blitz——无 API 思想的全栈开发框架'

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

-End-

响应式系统与 React的更多相关文章

  1. 你是如何理解Vue的响应式系统的

    1.响应式系统简述: 任何一个 Vue Component 都有一个与之对应的 Watcher 实例. Vue 的 data 上的属性会被添加 getter 和 setter 属性. 当 Vue Co ...

  2. 前端必读:Vue响应式系统大PK(下)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...

  3. vue原理探索--响应式系统

    Vue.js 是一款 MVVM 框架,数据模型仅仅是普通的 JavaScript 对象,但是对这些对象进行操作时,却能影响对应视图,它的核心实现就是「响应式系统」. 首先看一下 Object.defi ...

  4. Vue 及框架响应式系统原理

    个人bolg地址 全局概览 Vue运行内部运行机制 总览图: 初始化及挂载 在 new Vue()之后. Vue 会调用 _init 函数进行初始化,也就是这里的 init 过程,它会初始化生命周期. ...

  5. Vuejs - 深入浅出响应式系统

    Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 Javascript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作原理同样非常重要,这样 ...

  6. Vue的响应式系统

    Vue的响应式系统 我们第一次使用Vue的时候,会感觉有些神奇,举个例子: <div id="app"> <div>价格:¥{{price}}</di ...

  7. 【js】vue 2.5.1 源码学习 (七) 初始化之 initState 响应式系统基本思路

    大体思路(六) 本节内容: 一.生命周期的钩子函数的实现 ==> callHook(vm , 'beforeCreate') beforeCreate 实例创建之后 事件数据还未创建 二.初始化 ...

  8. 前端必读:Vue响应式系统大PK

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...

  9. 一些vue 响应式系统的底层的细节

    当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/ ...

  10. Vue3响应式系统api 之 ref reactive

    reactive 接收一个普通对象然后返回该普调对象的响应式代理.等同于2.x的  Vue.observable() Vue3中响应数据核心是 reactive , reactive 中的实现是由 P ...

随机推荐

  1. Jpackage-制作无需预装Java环境的Jar可执行程序

    JAR 包要在预装 JRE 环境的系统上执行.如果没有预先安装 JRE 环境,又想直接运行 Java 程序,该怎么办呢? 这篇文章我们会先学习如何将 Java 程序打包成一个可执行的 Java JAR ...

  2. WPF之命令

    目录 命令系统的基本元素 基本元素之间的关系 小试命令 WPF的命令库 命令参数 命令与Binding的结合 近观命令 ICommand接口与RoutedCommand 自定义Command 定义命令 ...

  3. 【深度学习基础】基于Numpy的循环神经网络实现和反向传播训练

    本文是<深度学习进阶:自然语言处理>.<神经网络与深度学习>和<动手学深度学习>的读书笔记.本文将介绍基于Numpy的循环神经网络的前向传播和反向传播实现,包括RN ...

  4. 已安装docker-compose,安装harbor时还是提示docker-compose未安装或者Permission denied的解决方案

    安装Harbor时,下载安装了docker-compose并赋予权限 sudo curl -L "https://github.com/docker/compose/releases/dow ...

  5. C++保证线程安全的方式

    1.互斥量 可以确保同一时间只有一个线程访问临界区,防止出现竞态条件. 2.原子操作 std::atomic<int> mutex(1); 对原子变量的操作是线程安全的. 3.读写锁 st ...

  6. do{}while(0)用法

    更安全的展开宏定义 #define DOSOMETHING foo1(); foo2(); if(condition) DOSOMETHING /* if(condition) foo1(); foo ...

  7. 5G+云渲染:如何快速推进XR和元宇宙实现?

    XR(扩展现实)领域正在以惊人的速度增长.目前,到 2024 年,一些专家表示这个行业的价值将达到 3000 亿美元. 这个行业发展如此迅速的部分原因是 XR 将在商业环境中的带来巨大利益.近年来,很 ...

  8. 不要升级!不要升级!MacOS 14.4 引发Java 应用崩溃

    如果最近您收到了MacOS 14.4的升级提醒,那么建议你暂时先不要升级! 在x上,Java开发领域的一些大v们,也发现了这个问题,并提醒大家不要升级. 根据Java官方发布的文章了解到,该问题主要是 ...

  9. 从静态到动态化,Python数据可视化中的Matplotlib和Seaborn

    本文分享自华为云社区<Python数据可视化大揭秘:Matplotlib和Seaborn高效应用指南>,作者: 柠檬味拥抱. 安装Matplotlib和Seaborn 首先,确保你已经安装 ...

  10. 【JVM】关于JVM,你需要知道这些!!

    写在前面 最近,一直有小伙伴让我整理下关于JVM的知识,经过十几天的收集与整理,初版算是整理出来了.希望对大家有所帮助. JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境. Java ...