响应式系统与 React
0x1 React 的历史与应用
应用场景
- 前端应用开发,如 Meta、Ins、Netflix 的网页版
- 移动原生应用开发,如 Ins、Discord
- 结合 Electron 进行桌面应用开发
发展历史
Facebook 引入了 xhp 框架,其组合式组件的思想启发了 React 的设计
Jordan Walke 创造了 React 的原型—— FaxJS
FaxJS 的四个特性:
- 既可在服务端渲染,也可在客户端渲染
- 响应式(Reactive):当状态变更时,其 UI 也会自动更新
- 高性能
- 结构化
在 Facebook 收购 Ins 后,Jordan Walke 创造了 React
0x2 React 的设计思路
单向数据流:父组件向子组件单向传递数据
UI 编程痛点
- 状态更新时,UI 不会自动更新,需要手动调整
- 欠缺基本的代码层面的封装和隔离
- UI 之间的数据依赖关系需要手动维护
转换式与响应式
转换式:给定输入,求解输出。如:编译器
响应式:监听事件,消息驱动。如:监控系统
响应式系统:
graph LR
A(事件)-->B(执行既定的回调)
B-->C(状态变更)
C--前端 UI-->D(UI 更新)
响应式编程
- 状态更新,UI 自动更新
- 前端代码组件化,可复用,可封装
- 状态之间的互相依赖关系,只需声明即可
组件化的特点
- 组件时组件的组合/原子组件
- 组件拥有的状态是外部不可见的
- 父组件可将状态传入组件内部
组件设计
- 组件声明了状态和 UI 的映射
- 组件有 Props[外部传入]/State[内部私有] 两种状态
- 组件可由其他组件拼装而成
组件代码结构
- 内部拥有私有状态 State
- 接受外部的 Props 状态提供复用性
- 根据当前的 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>
);
}
在 React 中声明一个新状态时,需要手动调用 useState
对 useState 传入一个初始值后,返回一个状态
对 useEffect 传入一个函数和一个数组。数组是状态的数组,称作依赖项。“副作用”函数
副作用:代表除了基础函数操作外,还可以进行网络请求、更新 DOM、存储数据等功能
0x4 React 的实现
JSX/TSX 中的代码不符合 JS/TS 的标准
- 通过转译成一般 JS/TS 代码
返回的 JSX 发生改变时如何更新 DOM
虚拟 DOM(用于平衡 Diff 算法更少的更新次数和更快的计算速度)
Diff 算法:
- 替换不同类型的元素
- 更新同类型的 DOM 元素
- 递归同类型的组件元素
Props/State 更新时要重新触发 render
0x5 React 状态管理库
React 状态管理库
将组件的状态从根节点中抽离出来,集中到 UI 外部统一管理,构成 React 状态管理库
如:redux、xstate、mobx、recoil
状态机
在当前状态下,接受外部事件后,迁移至下一个状态
0x6 应用级框架科普
- next.js——React 开发框架
- modern.js——全栈开发框架
- blitz——无 API 思想的全栈开发框架'
-End-
响应式系统与 React的更多相关文章
- 你是如何理解Vue的响应式系统的
1.响应式系统简述: 任何一个 Vue Component 都有一个与之对应的 Watcher 实例. Vue 的 data 上的属性会被添加 getter 和 setter 属性. 当 Vue Co ...
- 前端必读:Vue响应式系统大PK(下)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...
- vue原理探索--响应式系统
Vue.js 是一款 MVVM 框架,数据模型仅仅是普通的 JavaScript 对象,但是对这些对象进行操作时,却能影响对应视图,它的核心实现就是「响应式系统」. 首先看一下 Object.defi ...
- Vue 及框架响应式系统原理
个人bolg地址 全局概览 Vue运行内部运行机制 总览图: 初始化及挂载 在 new Vue()之后. Vue 会调用 _init 函数进行初始化,也就是这里的 init 过程,它会初始化生命周期. ...
- Vuejs - 深入浅出响应式系统
Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 Javascript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作原理同样非常重要,这样 ...
- Vue的响应式系统
Vue的响应式系统 我们第一次使用Vue的时候,会感觉有些神奇,举个例子: <div id="app"> <div>价格:¥{{price}}</di ...
- 【js】vue 2.5.1 源码学习 (七) 初始化之 initState 响应式系统基本思路
大体思路(六) 本节内容: 一.生命周期的钩子函数的实现 ==> callHook(vm , 'beforeCreate') beforeCreate 实例创建之后 事件数据还未创建 二.初始化 ...
- 前端必读:Vue响应式系统大PK
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...
- 一些vue 响应式系统的底层的细节
当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/ ...
- Vue3响应式系统api 之 ref reactive
reactive 接收一个普通对象然后返回该普调对象的响应式代理.等同于2.x的 Vue.observable() Vue3中响应数据核心是 reactive , reactive 中的实现是由 P ...
随机推荐
- Jpackage-制作无需预装Java环境的Jar可执行程序
JAR 包要在预装 JRE 环境的系统上执行.如果没有预先安装 JRE 环境,又想直接运行 Java 程序,该怎么办呢? 这篇文章我们会先学习如何将 Java 程序打包成一个可执行的 Java JAR ...
- WPF之命令
目录 命令系统的基本元素 基本元素之间的关系 小试命令 WPF的命令库 命令参数 命令与Binding的结合 近观命令 ICommand接口与RoutedCommand 自定义Command 定义命令 ...
- 【深度学习基础】基于Numpy的循环神经网络实现和反向传播训练
本文是<深度学习进阶:自然语言处理>.<神经网络与深度学习>和<动手学深度学习>的读书笔记.本文将介绍基于Numpy的循环神经网络的前向传播和反向传播实现,包括RN ...
- 已安装docker-compose,安装harbor时还是提示docker-compose未安装或者Permission denied的解决方案
安装Harbor时,下载安装了docker-compose并赋予权限 sudo curl -L "https://github.com/docker/compose/releases/dow ...
- C++保证线程安全的方式
1.互斥量 可以确保同一时间只有一个线程访问临界区,防止出现竞态条件. 2.原子操作 std::atomic<int> mutex(1); 对原子变量的操作是线程安全的. 3.读写锁 st ...
- do{}while(0)用法
更安全的展开宏定义 #define DOSOMETHING foo1(); foo2(); if(condition) DOSOMETHING /* if(condition) foo1(); foo ...
- 5G+云渲染:如何快速推进XR和元宇宙实现?
XR(扩展现实)领域正在以惊人的速度增长.目前,到 2024 年,一些专家表示这个行业的价值将达到 3000 亿美元. 这个行业发展如此迅速的部分原因是 XR 将在商业环境中的带来巨大利益.近年来,很 ...
- 不要升级!不要升级!MacOS 14.4 引发Java 应用崩溃
如果最近您收到了MacOS 14.4的升级提醒,那么建议你暂时先不要升级! 在x上,Java开发领域的一些大v们,也发现了这个问题,并提醒大家不要升级. 根据Java官方发布的文章了解到,该问题主要是 ...
- 从静态到动态化,Python数据可视化中的Matplotlib和Seaborn
本文分享自华为云社区<Python数据可视化大揭秘:Matplotlib和Seaborn高效应用指南>,作者: 柠檬味拥抱. 安装Matplotlib和Seaborn 首先,确保你已经安装 ...
- 【JVM】关于JVM,你需要知道这些!!
写在前面 最近,一直有小伙伴让我整理下关于JVM的知识,经过十几天的收集与整理,初版算是整理出来了.希望对大家有所帮助. JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境. Java ...