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跨平台、性能接近原生

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

四、总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用epoll监测定时器是否到达指定时间,并执行回调函数

总览&#xff1a;Linux提供了定时器&#xff0c;暴露出来了文件描述符&#xff0c;所以我们使用epoll帮助我们监测&#xff0c;时间到达后&#xff0c;epoll_wait返回&#xff0c;于是我们根据fd&#xff0c;找到对应的回调函数&#xff0c;然后执行。从而达到定时执行函数的目…

鸿蒙征文|鸿蒙技术分享:使用到的开发框架和技术概览

目录 每日一句正能量前言正文1. 开发环境搭建关键技术&#xff1a;2. 用户界面开发关键技术&#xff1a;3. 应用逻辑开发关键技术&#xff1a;4. 应用测试关键技术&#xff1a;5. 应用签名和打包关键技术&#xff1a;6. 上架流程关键技术&#xff1a;7. 后续维护和更新关键技术…

【MIT-OS6.S081笔记0.5】xv6 gdb调试环境搭建

补充一下xv6 gdb调试环境的搭建&#xff0c;我这里装的是最新的15.2的gdb的版本。我下载的是下面的第二个xz后缀的文件&#xff1a; 配置最详细的步骤可以参考下面的文章&#xff1a; [MIT 6.S081] Lab 0: 实验配置, 调试及测试 这里记录一下踩过的一些报错&#xff1a; 文…

Python和Java后端开发技术对比

在当今互联网技术飞速发展的时代&#xff0c;后端开发扮演着至关重要的角色。Python和Java作为两大主流的后端开发语言&#xff0c;各自具备独特的优势和应用场景。让我们深入了解这两种技术的特点和选择建议。 Java后端开发一直是企业级应用的首选方案。它以强大的类型系统、…

1.2.3 逻辑代数与运算

逻辑代数与运算 基本的逻辑运算常用逻辑公式 基本的逻辑运算 基本逻辑运算非常简单&#xff0c;只包含与、或、非、异或这4种。 这里主要留意对基本逻辑运算的不同叫法&#xff0c;符号表示。逻辑表达式、真值表概念。 与&#xff1a;A和B都为真时&#xff0c;结果才为真或…

解析生成对抗网络(GAN):原理与应用

目录 一、引言 二、生成对抗网络原理 &#xff08;一&#xff09;基本架构 &#xff08;二&#xff09;训练过程 三、生成对抗网络的应用 &#xff08;一&#xff09;图像生成 无条件图像生成&#xff1a; &#xff08;二&#xff09;数据增强 &#xff08;三&#xff…

零售餐饮收银台源码

收银系统早已成为门店经营的必备软件工具&#xff0c;因为各个连锁品牌有自己的经营模式&#xff0c;自然对收银系统需求各有不同&#xff0c;需要有相应的功能模块来实现其商业模式。 1. 适用行业 收银系统源码适用于零售、餐饮等行业门店&#xff0c;如商超便利店、水果生鲜…

我的第一个创作纪念日 —— 梦开始的地方

前言 时光荏苒&#xff0c;转眼间&#xff0c;我已经在CSDN这片技术沃土上耕耘了365天 今天&#xff0c;我迎来了自己在CSDN的第1个创作纪念日&#xff0c;这个特殊的日子不仅是对我过去努力的肯定&#xff0c;更是对未来持续创作的激励 机缘 回想起初次接触CSDN&#xff0c;那…

mac终端自定义命令打开vscode

1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh&#xff0c;那么配置文件是.zshrc&#xff08;打开zsh配置&#xff0c;这里举&#x1f330;使用zsh&#xff09; sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本&#xff08;这里的code就是快捷命令可以进…

计算帧率、每秒过多少次

1、c #include <iostream> #include <opencv2/opencv.hpp> #include <string> #include <thread> #include <atomic>using namespace std;const int NUM_THREADS 1; // 线程数量std::atomic<int> frameCounts[NUM_THREADS]; // 每个线程…

【在Linux世界中追寻伟大的One Piece】读者写者问题与读写锁

目录 1 -> 读者写者问题 1.1 -> 什么是读者写者问题 1.2 -> 读者写者与生产消费者的区别 1.3 -> 如何理解读者写者问题 2 -> 读写锁 2.1 -> 读写锁接口 3 -> 读者优先(Reader-Preference) 4 -> 写者优先(Writer-Preference) 1 -> 读者写者…

PS的功能学习(修复、画笔)

混合器画笔工具 就像&#xff0c;电子毛笔 关键功能有两个&#xff0c;自带一个混合器色板 清理画笔是全清&#xff0c;换一支新的毛笔&#xff0c;执行完之后在判断是否载入画笔 载入画笔就是把前景色上的颜色进行叠加处理&#xff0c;重新混入当前的混合色 &#xff08;…

centos 7 离线安装postgis插件

前一段时间记录了下如何在centos7中离线安装postgresql&#xff0c;因为工作需要&#xff0c;我不仅要安装postgresql&#xff0c;还需要安装postgis插件&#xff0c;这篇文章记录下postgis插件的安装过程。 1. 安装前的参考 如下的链接都是官网上的链接&#xff0c;对你安装p…

Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)

目录 前言 在开发过程中&#xff0c;我们经常遇到一些看似简单的问题&#xff0c;但有时正是这些细节问题让我们头疼不已。今天&#xff0c;我就来和大家分享一个我在开发过程中遇到的 el-switch 使用的小坑&#xff0c;希望大家在使用时能够避免。 一. 问题背景 二. 问题分…

同时使用Tmini和GS2两个雷达

24.12.02 要求&#xff1a;同时使用两个雷达。 问题在于:两个雷达都是ydlidar&#xff0c;使用同一个包。 因此同时启动GS2.launch和Tmini.launch会调用同一个功能节点&#xff0c;使用同一个cpp文件。 方法&#xff1a;新建一个cpp节点。 但同时保持在同一个坐标系&#xff0…

高等数学函数的性质

牛顿二项公式 ( x y ) n ∑ k 0 n C n k ⋅ x n − k y k (xy)^n\stackrel{n}{\sum\limits_{k0}}C^k_n\sdot x^{n-k}y^k (xy)nk0∑​n​Cnk​⋅xn−kyk. 映射 f : X → Y f:X\rightarrow Y f:X→Y&#xff0c; f f f 为 X X X 到 Y Y Y 的映射。 f f f 是一个对应关系&am…

【MySQL】深度学习数据库开发技术:mysql事务穿透式解析

前言&#xff1a;本节内容开始讲解事务。 博主计划用三节来讲解事务。 本篇为第一节&#xff0c; 主要解释什么是事务&#xff0c; 事务有什么用。 以及事物的基本操作和异常退出回滚情况。 下面不多说&#xff0c;友友们&#xff0c; 开始学习吧&#xff01; ps&#xff1a;本…

Swift解题 | 求平面上同一条直线的最多点数

文章目录 前言摘要问题描述解题思路Swift 实现代码代码分析示例测试与结果时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 149. 直线上最多的点数 不积跬步&#xff0c;无以至千里&#xff1b;不积…

使用Ansible自动化部署Zabbix6监控

1、获取Ansible离线部署包 链接&#xff1a;https://pan.baidu.com/s/1EjI02Ni8m9J4eJeBcJ-ZUQ?pwdzabx 提取码&#xff1a;zabx 2、安装Ansible wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo yum -y install ansible3、修改hosts文件…

lua闭包Upvalue

闭包 lua任何函数都是闭包&#xff0c;闭包至少带1个upValue&#xff1b; CClosure是使用Lua提供的lua_pushcclosure这个C-Api加入到虚拟栈中的C函数&#xff0c;它是对LClosure的一种C模拟 如string.gmatch就是cclosure 定义&#xff1a; #define ClosureHeader \CommonH…