React与Vue的对比
异同总结
相同点:
-
都有组件化思想
-
都支持服务器端渲染
-
都有Virtual DOM(虚拟dom)
-
数据驱动视图
-
都有支持native的方案:
Vue的weex、React的React native -
都有自己的构建工具:
Vue的vue-cli、React的Create React App
区别:
-
数据流向的不同。
react从诞生开始就推崇单向数据流,而Vue是双向数据流 -
数据变化的实现原理不同。
react使用的是不可变数据,而Vue使用的是可变的数据 -
组件化通信的不同。
react中我们通过使用回调函数来进行通信的,而Vue中子组件向父组件传递消息有两种方式:事件和回调函数 -
diff算法不同。
react主要使用diff队列保存需要更新哪些DOM,得到patch树,再统一操作批量更新DOM。Vue使用双向指针,边对比,边更新DOM
具体分析
数据状态
为什么vue用data,react用state
1. Vue 中的 data()
data函数返回的对象,内存地址并不相同,每个实例对象的数据不会收到其他实例对象数据的污染
-
数据响应式系统:
-
Vue 的核心特性之一是其响应式系统,它能够自动追踪组件依赖并在数据变化时自动更新视图。
-
Vue 通过
data()函数来定义组件的状态,这个函数返回一个对象,该对象中的属性会被 Vue 转换为响应式的。这意味着当这些数据发生变化时,Vue 会自动更新相关的视图。
-
-
组件复用性:
-
在 Vue 中,尤其是使用单文件组件时,每个组件都是一个类的实例。因此,为了避免多个实例共享同一个
data对象,Vue 要求data必须是一个函数,从而每次创建新实例时,都会返回一个新的data对象。这确保了组件实例之间的状态是相互独立的。 -
举例来说,多个按钮组件可以独立地管理自己的状态,而不会相互干扰。
-
export default {data() {return {count: 0, // 组件状态};},methods: {increment() {this.count++;}}
};
-
这里的
data()返回一个对象,Vue 会将其转换为响应式数据。当count改变时,Vue 自动更新视图。
2. React 中的 state
-
函数式编程风格:
-
React 更倾向于函数式编程理念,
state是组件内部的状态管理工具。React 使用useState钩子(在函数组件中)或this.state和this.setState(在类组件中)来管理状态。 -
在 React 中,状态管理是通过显式调用
setState(类组件)或useState的状态更新函数(函数组件)来触发的。每次状态更新都会触发组件的重新渲染。
-
-
不可变性:
-
React 强调状态的不可变性,每次状态更新时,
setState不会修改原始状态,而是返回一个新的状态对象。这与 Vue 的响应式系统不同,Vue 会直接修改状态对象。 -
不可变性使得 React 更容易进行调试和优化,如在组件的
shouldComponentUpdate或React.memo中判断状态是否发生变化。
-
import React, { useState } from 'react';
function Counter() {const [count, setCount] = useState(0); // React 的 state
return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}
-
这里的
useState钩子用于声明组件的状态,并返回当前状态和更新状态的函数。
-
对比总结
状态初始化与管理
-
Vue 的 data() 函数:
-
每个组件实例都有独立的状态,因为
data()每次都返回一个新的状态对象。 -
响应式数据直接更新会自动触发视图更新。
-
-
React 的 state:
-
状态是不可变的,状态更新是通过
setState(类组件)或useState(函数组件)来管理的,更新状态会触发重新渲染。 -
函数式组件中使用
useState钩子进行状态管理,更加符合 React 的函数式编程风格。
-
组件复用性
-
Vue:
-
由于
data()返回一个新的对象,每个组件实例都有自己独立的状态,这使得复用组件更加安全和简单。
-
-
React:
-
React 通过
useState或this.state来管理状态,每个组件实例的状态也是独立的。
-
总结
-
Vue 使用
data()函数来初始化组件状态,主要是为了支持其响应式系统和确保组件实例之间的状态独立。 -
React 使用
state来管理组件状态,强调不可变性和函数式编程,这与 Vue 的响应式数据模型有所不同。
react的单向数据流和vue的双向数据流对比?
React 单向数据流
-
数据流向:
-
数据从父组件通过
props传递给子组件。 -
子组件不能直接修改父组件的数据,只能通过回调函数将数据传回父组件。
-
-
状态管理:
-
使用
useState、useReducer或外部状态管理库(如 Redux)来管理状态。
-
Vue 双向数据绑定
-
数据流向:
-
使用
v-model实现表单元素的双向绑定,自动同步数据和 UI。 -
父组件可以通过
props传递数据给子组件,子组件可以通过$emit事件将更新传回父组件。
-
-
状态管理:
-
使用
data、computed、watch等来管理组件状态。 -
可以使用 Vuex 进行全局状态管理。
-
组件化通信方式?
react中我们通过使用回调函数来进行通信的,而Vue中子组件向父组件传递消息有两种方式:事件和回调函数。
React
-
回调函数
-
父组件将一个函数作为
props传递给子组件。 -
子组件调用这个函数,将数据传递回父组件。
-
Vue
-
事件:
-
子组件使用
$emit触发一个事件,父组件监听这个事件来接收数据。 -
常用于父组件需要响应子组件的某个动作。
-
-
回调函数:
-
父组件可以将一个函数作为
props传递给子组件。 -
子组件调用这个函数,将数据传递回父组件。
-
类似于 React 的方式。
-
diff算法
React 的 Diff 算法
-
Diff 队列:
-
React 会对新旧虚拟 DOM 树进行比较,找出变化的部分。
-
使用 diff 队列记录需要更新的节点。
-
-
Patch 树:
-
根据 diff 队列生成 patch 树,描述如何更新实际 DOM。
-
最后批量应用这些更新,减少直接操作 DOM 的次数。
-
-
优化策略:
-
假设同层级比较,不跨层级移动节点。
-
使用 key 来优化列表 diff,快速定位节点变化。
-
Vue 的 Diff 算法
-
双向指针:
-
Vue 使用双向指针(从头和尾同时遍历)来比较新旧节点。
-
通过指针移动来确定节点的增删改。
-
-
边对比边更新:
-
在对比的同时直接更新实际 DOM。
-
更加实时地处理节点更新。
-
-
优化策略:
-
使用 key 来优化列表更新。
-
通过模板编译生成优化的渲染函数,减少不必要的更新。
-
总结
-
React:构建 patch 树后批量更新,适合大型应用的复杂更新。
-
Vue:边对比边更新,实时处理更新,适合高效处理小规模更新。
关注我,不迷路!
会不定时为大家更新优质内容,欢迎👍🏻+⭐️+☁️!!!方便随时查阅
相关文章:
React与Vue的对比
异同总结 相同点: 都有组件化思想 都支持服务器端渲染 都有Virtual DOM(虚拟dom) 数据驱动视图 都有支持native的方案:Vue的weex、React的React native 都有自己的构建工具:Vue的vue-cli、React的Create React A…...
精密量测软件(仿KLA免费浏览器程序ProfilmOnline)
KLA在线软件分析图 软件仿KLA公司免费浏览器软件ProfilmOnline,软件地址ProfilmOnline - 用于3D轮廓仪和AFM的表面成像、分析和测量软件 可以直接从profilmonline上下载3D图加载对比分析,当前已完成的内容有 1、调平 2、尖峰去噪 3、能量密度图&…...
Java项目: 基于SpringBoot+mybatis+maven实现的IT技术交流和分享平台(含源码+数据库+毕业论文)
一、项目简介 本项目是一套基于SpringBootmybatismaven实现的IT技术交流和分享平台 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美…...
STL02——手写简单版本的list
手写一个简单版本的list 设计一个名为 List 的 List 类,该类具有以下功能和特性: 1、基础成员函数 构造函数:初始化 List 实例析构函数:清理资源,确保无内存泄露 2、核心功能 在 List 末尾添加元素在 List 开头添…...
基于SpringBoot的校园自助洗衣服务管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的校园自助洗衣服务…...
音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件
在文章《音视频入门基础:PCM专题(1)——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为AAC裸流文件: ./ffmpeg -f s16le -ar 44100 -ac 2 -i audio1.pcm audio1.aac 由于…...
第 6 篇 自定义 Helm Chart
文章目录 第 1 步:创建 chartChart.yamlvalues.yamltemplates 模板文件_helpers.tpl 模板辅助文件serviceaccount.yamlservice.yamldeployment.yamlhpa.yamlingress.yamlNOTES.txttests/test-connection.yaml 第 2 步:检查 chart 格式第 3 步:…...
Jenkis部署vue前端项目提示:sh: vue-cli-service: command not found
解决方法: 1. 进入到/var/lib/jenkins/workspace/项目名下,查看是否有node_modules,如果没有执行 npm install 2. 如果执行npm intall的过程中提示:npm ERR! 407 Proxy Authentication Required - GET http://registry.npm.taob…...
中介者模式mediator
学习笔记,原文链接 https://refactoringguru.cn/design-patterns/mediator 减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。...
GO语言性能分析
Go语言基准测试与pprof工具性能分析详解 在现代软件开发中,性能优化是一个重要的环节。Go语言提供了强大的工具来进行基准测试和性能分析,其中 testing 包用于基准测试,而 pprof 工具用于性能分析。本文将详细讲解如何使用这些工具来进行性能…...
关于 PreparedStatement
Mysql 层面的语法也支持 prepare 这个确实第一次见 PREPARE prepares a statement for execution (see Section 13.5.1, “PREPARE Statement”).EXECUTE executes a prepared statement (see Section 13.5.2, “EXECUTE Statement”).DEALLOCATE PREPARE releases a prepared…...
漫谈设计模式 [9]:外观模式
引导性开场 菜鸟:老鸟,我最近在做一个项目,感觉代码越来越复杂,我都快看不懂了。尤其是有好几个子系统,它们之间的调用关系让我头疼。 老鸟:复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你…...
多进程编程
基本概念 进程是一个具有单独功能的程序对某个数据集在处理机上的执行过程,进程也是作为资源分配的一个单位。 进程和程序是相辅相成的,进程是一个动态概念。 进程具有并行性特征。进程具有独立性和异步性。 进程的描述 进程分为三部分:…...
7-Zip压缩包如何添加密码,加密后如何取消
压缩包文件大家经常使用,最熟悉的肯定是RAR、ZIP格式压缩文件,但是7z压缩文件格式也很好用,它是三种压缩文件格式中压缩率最大的。想要将文件压缩到最小,使用7z格式可以达到最大化。那么在使用7z压缩格式的时候,我们可…...
HarmonyOS---应用测试概述
一、应用质量要求 应用质量要求分为应用体验质量建议和应用内容合规要求两大部分。 1、应用体验质量建议 功能数据完备、基础体验要求、HarmonyOS特征增强体验要求。 (1)功能数据完备 (2)基础体验要求 (3)增…...
密码学---真题演练
✨Base加密:题目-base? 靶场网址:https://polarctf.com/ Base100加密!!! 得到的新的一串密码是 rot47 密码,属于凯撒密码的一种变体. ✨斐波那契:题目-FB 从第三项开始,每一项都等…...
时间日期工具类
时间日期工具类 import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit;public class DateTimeUtils {private static final String DEFAULT_DATE_FORMAT "yyyy-MM-dd";private static final String DEFAULT_TIME_…...
linux中vim常用命令大全
前言 Linux有大量的配置文件,所以 Linux的文本处理工具也是比较多的,其中编辑一些配置文件时,常用的工具就是 vim。在Linux中,Vim编辑器是一个非常强大的文本编辑工具,它提供了多种模式和命令来满足不同的编辑需求。以…...
计算机的错误计算(八十九)
摘要 探讨反双曲余切函数 acoth(x) 在 附近的计算精度问题。 Acoth(x) 函数的定义为: 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002) . 不妨在 Excel 的单元格中计算,则有: 若在Python中用定义直接计算,则有几乎…...
深入理解java并发编程之aqs框架
跟synchronized 相比较,可重入锁ReentrankLock其实原理有什么不同? 所得基本原理是为了达到一个目的;就是让所有线程都能看到某种标记。synchronized通过在对象头中设置标记实现了这一目的,是一种JVM原生的锁实现方式。而Reentran…...
阿里图标库(Iconfont)的本地引入 详细步骤
阿里图标库(Iconfont)本地引入 Vue3 详细步骤(文字版) 一、准备工作 登录 Iconfont 官网 访问 Iconfont 官网,使用账号登录(若无账号需注册)。 选择图标并加入项目 在搜索框输入关键词&#x…...
gcoord与proj4js对比分析:选择最适合你的地理坐标库
gcoord与proj4js对比分析:选择最适合你的地理坐标库 【免费下载链接】gcoord 地理坐标系转换工具 项目地址: https://gitcode.com/gh_mirrors/gc/gcoord 在Web地图开发中,地理坐标系转换是一个常见需求。gcoord和proj4js都是优秀的JavaScript坐标…...
Luau数据流分析技术:如何实现精准的类型推断
Luau数据流分析技术:如何实现精准的类型推断 【免费下载链接】luau A fast, small, safe, gradually typed embeddable scripting language derived from Lua 项目地址: https://gitcode.com/gh_mirrors/lu/luau Luau是一种快速、小巧、安全且支持渐进类型化…...
量子行走:从理论到Python实现——量子力学原理与Qubit物理
目录 2. 量子力学原理与Qubit物理 2.1 量子比特的物理实现 2.1.1 双能级系统建模 2.1.2 布洛赫球表示与可视化 2.2 叠加与纠缠现象 2.2.1 量子叠加原理 2.2.2 量子纠缠理论 2.3 量子测量与退相干 2.3.1 测量公设的实现 2.3.2 噪声与退相干机制 2. 量子力学原理与Qubi…...
OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现
OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现 1. 为什么需要关注硬件配置 去年冬天,当我第一次尝试在本地部署OpenClaw对接百川2-13B模型时,我的旧显卡GTX 1660 Ti直接崩溃了。那次经历让我深刻认识到——选择合适的硬件对…...
提升嵌入式代码注释质量的工具与技术方案
提升代码注释质量的实用工具与技术方案1. 代码注释工具概述1.1 代码注释的重要性在嵌入式系统开发中,良好的代码注释是保证项目可维护性的关键因素。专业的注释工具能够帮助开发者:创建可视化注释,提升代码可读性生成标准化的文档结构维护代码…...
深入解析卷积层参数量与FLOPs的计算原理及优化策略
1. 卷积层参数量计算原理 要理解卷积层的参数量计算,我们先从一个实际例子入手。假设有个输入特征图尺寸是64643(HWC),卷积核大小33,输出通道数64,带偏置项。这时候参数量是多少呢? 参数量的构…...
高密度PCB贴装实战:如何用模块化治具解决0.3mm间距元件定位难题
高密度PCB贴装实战:模块化治具在0.3mm间距元件定位中的创新应用 当智能手表的PCB板面积缩小到指甲盖大小时,上面的0402元件间距已经突破0.3mm极限——这相当于在1元硬币上精准摆放50根头发丝。消费电子微型化浪潮下,传统治具的定位误差正在吞…...
联想ThinkPad声卡驱动安装避坑指南:从E470到X1 Carbon的通用解法
ThinkPad声卡驱动安装全攻略:从型号识别到疑难排解 ThinkPad作为商务笔记本的代表,其稳定性和兼容性一直备受推崇。但即便是这样成熟的产品线,声卡驱动问题依然困扰着不少用户——从经典的E470到高端的X1 Carbon,不同机型可能面临…...
高性能指纹特征提取开源方案:FingerJetFX OSE架构解析与实现指南
高性能指纹特征提取开源方案:FingerJetFX OSE架构解析与实现指南 【免费下载链接】FingerJetFXOSE Fingerprint Feature Extractor; the initial contribution by DigitalPersona is MINEX Compliant (SDK 3F). 项目地址: https://gitcode.com/gh_mirrors/fi/Fing…...
