React 的学习记录一:与 Vue 的相同点和区别

目录

一、学习目标

二、学习内容1️⃣——React的特点

1.组件化设计

2.单向数据流

3.声明式 UI

4.虚拟 DOM

5.Hooks

6.JSX 

7.React Native

三、React与vue的比较总结

四、总结


一、学习目标

时间:两周

内容:

  • React的特点
  • React的入门
  • React的功能、API
  • 深入了解 Hook
  • 学习路由和状态管理
  • React的原理等等

二、学习内容1️⃣——React的特点

这里主要是记录React的特点,中间会查询很多内容,在此记录总结一下,其中会涉及很多与vue的相同点和不同点比较,很多都是个人理解总结,所以不具备广泛的定义(不要当成文档来学习哦!记岔劈了我不负责)。

1.组件化设计

React 采用组件化的设计理念,UI 被拆分为独立的、可复用的组件。每个组件负责自己的一部分 UI,并且可以互相组合形成复杂的界面。

文档里这样描述组件:

React有两种类型的组件:函数组件、类组件,使用JSX语法能将HTML、JavaScript混在一起

相比之下,Vue 的组件化思想体现在将组件作为界面构建的基本单元,比如常见的单页面(.vue文件)就是一个组件,里面有三个部分,模板(HTML)、脚本(JavaScript)、样式(CSS)等部分。

因为都是组件化设计的思想,就都有一个特点:可复用、数据驱动UI(view)、并且都有生命周期方法/钩子。

不同点:React 组件必须以大写字母开头,而 HTML 标签则必须是小写字母。而vue就没有这个限制,但也推荐这种写法。

2.单向数据流

Vue 和 React都使用单向数据流(One-Way Data Binding),即数据从父组件传递到子组件(vue的props),而子组件只能通过回调函数(比如vue的emit通)知父组件数据的变化。

这种单向流动有助于数据的可预测性,使应用的数据流向更清晰,尤其在大型应用中便于维护和调试,也更可追溯,更可控状态变更的源头也更唯一

但是vue有双向绑定,在表单的输入时通过v-model可以自动同步数据和状态,是一种单向数据流的补充,而react就是手动设置来控制表单数据的双向绑定。

 确实,react的单向数据流需要手动控制可以避免一些隐式转换的变化,还有vue的响应式的一些坑。

3.声明式 UI

这个的意思是:开发者只需定义组件的最终状态,框架会根据数据的变化和状态的更新,自动处理 DOM 操作来实现这些效果。

也可以理解为vue的MVVM设计架构里的VM这种思路(我vue学的多,就用这个来指代了),当数据发生变化时,框架会自动计算并更新所需的 DOM 节点,而开发者不需要直接访问或操作 DOM 元素。

除了声明式UI还有一种叫做传统的命令式UI,就需要手动操作DOM,比如使用 jQuery 手动更新 DOM 的方式。

所以,这两个框架在这种情况下,都会监听界面里的数据的变化,并自动更新视图,也就是开发者只需要描述 UI 应该如何显示,而不必手动操作 DOM。

优势嘛,也就是:减少代码复杂度、提高代码可维护性等等,也更简单了吧。

4.虚拟 DOM

虚拟dom这个概念,这个东西的产生是为了提高性能和效率,避免频繁地操作真实DOM,提到这个就会提到一个不可绕开的东西——diff算法。

这里主要对两个框架生成和更新虚拟dom的过程进行对比:

React 和 Vue 虚拟 DOM 的区别
特性ReactVue
更新机制深度对比(diffing algorithm——最小化差异算法,会尽可能多地对比所有的虚拟 DOM 节点),逐层比较基于响应式系统和依赖追踪,异步更新队列(通过 nextTick 来更新),并且按需更新,diff才用双端比较策略
虚拟 DOM 生成每次重新生成新的虚拟 DOM基于响应式数据自动生成和更新虚拟 DOM
性能优化应用批量更新,即多个状态更新操作会合并到一次更新中,减少重复渲染精细化的响应式数据跟踪,减少不必要的组件更新
组件更新组件的更新需要通过 shouldComponentUpdateReact.memo 优化通过依赖追踪和异步更新,自动优化渲染
虚拟 DOM 更新的方式每次对比新旧虚拟 DOM,寻找最小差异只更新受影响的部分,减少不必要的 DOM 操作
响应式系统无内建响应式系统,需要借助 useState 等 Hook 来管理状态内建响应式系统,自动跟踪依赖并更新

当然这里提及一个vue2,vue3的diff算法的区别,因为我是vue较熟练,所以对这个进行了总结:

  • Vue 2

    • 基于双端比较策略。
    • 使用完整的虚拟 DOM 树和 key 来标记节点。
  • Vue 3

    • 对静态节点进行优化:通过静态节点标记,跳过不需要 Diff 的部分,提高性能。
    • 更加高效的 PatchFlag 机制:用于标记节点变化类型,减少不必要的对比。
    • 支持 Fragment 和 Teleport 等特性。

本来想写一篇diff的相关知识,但是看了几篇发现有很不错的,就不费力去写了, 推荐这篇:

vue3手写diff算法(图解+例子+详细注释) 

写的很棒,还解释了v-for的时候key的原理,在源码中一闪而过,但是我并没有仔细去了解的。

5.Hooks

Hooks就是钩子,可以理解为特定时机会触发的东西,vue3因为组合式API的出现,就提出新的逻辑复用的方案——hooks(也被称之为vue hooks,与react做区分),都是为了更好地组织逻辑、复用功能、提升代码可维护性而设计的。当然两者的实现方式和使用场景有一定区别。

因为这个很重要,所以对两个的代码进行比较:

React Hooks:

import { useState, useEffect } from "react";function useCounter(initialValue) {const [count, setCount] = useState(initialValue);useEffect(() => {console.log(`Count updated: ${count}`);}, [count]);return { count, increase: () => setCount(count + 1) };
}// 使用
function Counter() {const { count, increase } = useCounter(0);return (<div><p>Count: {count}</p><button onClick={increase}>Increase</button></div>);
}

Vue Composition API:

import { ref, watch } from "vue";function useCounter(initialValue) {const count = ref(initialValue);watch(count, (newCount) => {console.log(`Count updated: ${newCount}`);});const increase = () => {count.value++;};return { count, increase };
}// 使用
setup() {const { count, increase } = useCounter(0);return { count, increase };
}

 关于两者的对比:

React 和 Vue 关于Hook 的区别
特性ReactVue
逻辑复用自定义Hooks,返回状态和方法,更加轻量,适合纯逻辑处理,通过函数封装独立函数或者模块,内置响应式和依赖追踪,适合复杂业务的逻辑独立
生命周期useEffect模拟组件的生命周期onMounted,onUnmounted等都有
状态管理useState:不可变值的状态更新ref,reative,基于proxy的响应式系统
计算属性无,手动实现computed
副作用处理使用useEffect,依赖数组控制执行watch、watchEffect
复杂场景需要多个Hooks配合使用,状态管理需要引入Redux等易于处理状态关联的复杂场景,因为有响应式

 总结:

  • React Hooks 偏向于函数式编程,更加轻量,但需要开发者对依赖和状态管理有良好掌控能力。
  • Vue Composition API 内置响应式系统,逻辑清晰且高度灵活,适合复杂项目

6.JSX 

JSXJavaScript XML 的缩写,它是一种语法糖,可以在 JavaScript 中直接编写类似 HTML 的代码,浏览器无法直接运行 JSX,必须通过 Babel 等工具编译成标准的 JavaScript。它是 React 社区设计和推广的,React 对 JSX 提供了强大的支持。

React的官方教程里就有对JSX的规则介绍:

JSX 规则

JSX有一些特点,比如被大家熟知的:多个 JSX 标签需要被一个父元素包裹、使用驼峰式命名法等等。

Vue 默认使用模板语法,但支持 JSX,需额外安装 Babel 插件。

7.React Native

这里我了解太少,暂时只是将概念特性整理下来了:

  • 跨平台

    • 使用一套代码,同时运行在 iOS 和 Android 上。
    • 支持大部分原生组件和 API。
  • 性能接近原生

    • 使用 JavaScript 与设备原生模块交互,通过 Native Bridge 实现性能接近原生的应用。
  • 热更新与开发效率高

    • 支持 Hot ReloadingFast Refresh,在不重启应用的情况下,立即查看代码更改的效果。
    • 可通过 OTA(Over-The-Air)技术实现热更新,无需重新发布到应用商店。
  • 社区支持强

    • React Native 社区非常活跃,提供了大量的第三方库,极大地减少了开发时间。
  • 组件化开发

    • RN 的 UI 是基于组件的,这与 React 的开发理念一致,能够轻松实现代码复用。

三、React与vue的比较总结

对上面提到的几点特效进行总结,以下:

React与Vue的特点比较
相同点不同点:React不同点:Vue
1.组件化设计都是组件构成、可复用、数据驱动UI(view)、并且都有生命周期方法/钩子

组件的定义:函数组件、类组件JSX语法;

命名:React 组件必须以大写字母开头而 HTML 标签则必须是小写字母

组件的定义:一个单文件(.vue);

三个部分混在一起;

命名:不强制要求

2.单向数据流都遵循强调数据状态的可追溯、更严格

强调响应式;双向绑定

3.声明式 UI都遵循
4.虚拟 DOM都有更新机制、重新生成、批量更新、更新方式、没有响应式更新机制、自动生成、按需更新、有响应式和依赖追踪
5.Hooks都有,但是表现形式不一致生命周期是useEffect实现的,需要多个Hooks配合使用,状态管理需要引入Redux等生命周期有,易于处理状态关联的复杂场景,因为有响应式
6.JSX有,特定的规则没有,只是有模板语言
7.React Native跨平台、性能接近原生

对上面提到的几点特效进行总结,以下

四、总结

以上,暂时是这些,未完~学习过程中会持续更新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)

数据库管理267期 2024-11-286 数据库管理-第267期 23ai&#xff1a;Oracle Data Redaction演示&#xff08;20241128&#xff09;1 示例表及数据2 创建编校策略2.1 名字全编校2.2 电话部分编校 3 DML演示3.1 场景13.2 场景2 总结 数据库管理-第267期 23ai&#xff1a;Oracle Da…

hue 4.11容器化部署,已结合Hive与Hadoop

配合《Hue 部署过程中的报错处理》食用更佳 官方配置说明页面&#xff1a; https://docs.gethue.com/administrator/configuration/connectors/ 官方配置hue.ini页面 https://github.com/cloudera/hue/blob/master/desktop/conf.dist/hue.ini docker部署 注意&#xff1a; …

Spring Boot自定义启动banner

在启动 Springboot 应用时&#xff0c;默认情况下会在控制台打印出 Springboot 相关的banner信息。 自定义banner 如果你想自定义一个独特的启动banner&#xff0c;该怎么做呢&#xff1f;Springboot 允许我们通过自定义启动banner来替换默认的banner。只需要在 resources 目…

leaflet 的基础使用

目录 一、创建dom节点 二、创建地图 三、添加底图&#xff08;天地图&#xff09;&#xff0c;在地图创建完成后添加底图 本章主要讲述leaflet在vue中的使用&#xff1a; leaflet 详情总目录&#xff1a;传送 一、创建dom节点 <div class"map" id"map_…

ubuntu的用户使用

ubuntu系统中的常规用户登录方式 在系统root用户是无法直接登录的,因为root用户的权限过大所以其安全性比较差 在登录系统时一般使用在安装系统时建立的普通用户登录 如果需要超级用户权限: Ubuntu用户密码破解 在系统安装完成后默认grub启动等待时间为0&#xff0c;建议改…

浏览器拨测:将网站护航的阵地再前推一米

作者&#xff1a;泉思 “从你在地址栏里敲下回车开始到你在网页上看到内容中间经过了哪些步骤”&#xff0c; 这是一个非常常见的互联网公司的面试题。想必很多开发者对于这个问题可以给出一个非常完整的回答&#xff0c;但是对于用户来说&#xff0c;在网页上看到内容仅仅是服…

【RL Application】语义分割中的强化学习方法

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

【C++】优先队列(Priority Queue)全知道

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 一、前言 二、优先队列&#xff08;Priority Queue&#xff09…

STL:相同Size大小的vector和list哪个占用空间多?

在C中&#xff0c;vector和list是两种不同的序列容器。vector底层是连续的内存&#xff0c;而list是非连续的&#xff0c;分散存储的。因此&#xff0c;vector占用的空间更多&#xff0c;因为它需要为存储的元素分配连续的内存空间。 具体占用多少空间&#xff0c;取决于它们分…

GPT vs Claude到底如何选?

美国当地时间6月20日&#xff0c;OpenAI的“劲敌”Anthropic公司发布了最新模型Claude 3.5 Sonnet。据Anthropic介绍&#xff0c;该模型是Claude 3.5系列模型中的首个版本&#xff0c;也是Anthropic迄今为止发布的“最强大、最智能”的模型。它不仅在性能上超越了竞争对手和自家…

OGRE 3D----5. OGRE和QML事件交互

在现代图形应用程序开发中,OGRE(Object-Oriented Graphics Rendering Engine)作为一个高性能的3D渲染引擎,广泛应用于游戏开发、虚拟现实和仿真等领域。而QML(Qt Modeling Language)则是Qt框架中的一种声明式语言,专注于设计用户界面。将OGRE与QML结合,可以充分利用OGR…

mysql系列2—InnoDB数据存储方式

背景 本文将深入探讨InnoDB的底层存储机制&#xff0c;包括行格式、页结构、页目录以及表空间等核心概念。通过全面了解这些基础概念&#xff0c;有助于把握MySQL的存储架构&#xff0c;也为后续深入讨论MySQL的索引原理和查询优化策略奠定了基础。 1.行格式 mysql中数据以行…

matlab2024a安装

1.开始安装 2.点击安装 3.选择安装密钥 4.接受条款 5.安装密钥 21471-07182-41807-00726-32378-34241-61866-60308-44209-03650-51035-48216-24734-36781-57695-35731-64525-44540-57877-31100-06573-50736-60034-42697-39512-63953 6 7.选择许可证文件 8.找许可证文件 9.选…

交换机四大镜像(端口镜像、流镜像、VLAN镜像、MAC镜像)应用场景、配置实例及区别对比

在网络管理中&#xff0c;端口镜像、流镜像、VLAN镜像和MAC镜像都是用于监控和分析网络流量的重要技术。 端口镜像&#xff08;Port Mirroring&#xff09; 定义&#xff1a;端口镜像是将一个或多个源端口的流量复制到一个目标端口&#xff0c;以便于网络管理员能够监控和分析…

JVM知识点学习-1

学习视频&#xff1a;狂神说Java 类加载器和双亲委派机制 类加载器 作用&#xff1a;加载Class文件 流程&#xff1a;这里的名字car1。。在栈里面&#xff0c;但是数据在堆里面 类加载器的几个类型&#xff1a; 虚拟机自带的类加载器&#xff1b;启动类&#xff08;根Boot…

Linux下的三种 IO 复用

目录 一、Select 1、函数 API 2、使用限制 3、使用 Demo 二、Poll 三、epoll 0、 实现原理 1、函数 API 2、简单代码模板 3、LT/ET 使用过程 &#xff08;1&#xff09;LT 水平触发 &#xff08;2&#xff09;ET边沿触发 4、使用 Demo 四、参考链接 一、Select 在…

python学习笔记 - python安装与环境变量配置

目录 前言1. 版本选择1.1 什么版本合适&#xff1f;1.2 版本越新越好吗&#xff1f;1.3 维护中的大版本里&#xff0c;选择最早的好吗&#xff1f;1.4 我的选择1.5 Python 发布周期1.6 Python维护中的版本及截止时间 2. 安装包下载2.1 官网地址2.2 下载安装包3. 环境安装3.1 新…

管理表空间和数据文件(二)

只读表空间 使用以下命令将表空间设置为只读模式&#xff1a; ALTER TABLESPACE userdata READ ONLY;必须等到TABLESPACE所有的过程都commit&#xff1b;才能可以执行成功。 导致检查点 Causes a checkpoint 意思是将内存中的数据&#xff08;如缓冲区中的更改&#xff09;写…

解决el-card上绑定@click事件,点击无效

解决&#xff1a; 在click后面加一个.native的修饰符即可 解释&#xff1a; .native 修饰符的作用&#xff1a;告诉 Vue&#xff0c;在绑定事件时&#xff0c;使用原生的 DOM 事件&#xff0c;而不是 Vue 自定义的事件。 因为 el-card 作为一个 Element UI 组件&#xff0c;默认…

AD7606使用方法

AD7606是一款8通道最高16位200ksps的AD采样芯片。5V单模拟电源供电&#xff0c;真双极性模拟输入可以选择10 V&#xff0c;5 V两种量程。支持串口与并口两种读取方式。 硬件连接方式&#xff1a; 配置引脚 引脚功能 详细说明 OS2 OS1 OS2 过采样率配置 000 1倍过采样率 …