当前位置: 首页 > news >正文

React与Vue的对比

异同总结

相同点:

  • 都有组件化思想

  • 都支持服务器端渲染

  • 都有Virtual DOM(虚拟dom)

  • 数据驱动视图

  • 都有支持native的方案:VueweexReactReact native

  • 都有自己的构建工具:Vuevue-cliReactCreate 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.statethis.setState(在类组件中)来管理状态。

    • 在 React 中,状态管理是通过显式调用 setState(类组件)或 useState 的状态更新函数(函数组件)来触发的。每次状态更新都会触发组件的重新渲染。

  • 不可变性:

    • React 强调状态的不可变性,每次状态更新时,setState 不会修改原始状态,而是返回一个新的状态对象。这与 Vue 的响应式系统不同,Vue 会直接修改状态对象。

    • 不可变性使得 React 更容易进行调试和优化,如在组件的 shouldComponentUpdateReact.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 钩子用于声明组件的状态,并返回当前状态和更新状态的函数。

  1. 对比总结

状态初始化与管理

  • Vue 的 data() 函数:

    • 每个组件实例都有独立的状态,因为 data() 每次都返回一个新的状态对象。

    • 响应式数据直接更新会自动触发视图更新。

  • React 的 state:

    • 状态是不可变的,状态更新是通过 setState(类组件)或 useState(函数组件)来管理的,更新状态会触发重新渲染。

    • 函数式组件中使用 useState 钩子进行状态管理,更加符合 React 的函数式编程风格。

组件复用性

  • Vue:

    • 由于 data() 返回一个新的对象,每个组件实例都有自己独立的状态,这使得复用组件更加安全和简单。

  • React:

    • React 通过 useStatethis.state 来管理状态,每个组件实例的状态也是独立的。

总结

  • Vue 使用 data() 函数来初始化组件状态,主要是为了支持其响应式系统和确保组件实例之间的状态独立。

  • React 使用 state 来管理组件状态,强调不可变性和函数式编程,这与 Vue 的响应式数据模型有所不同。

react的单向数据流和vue的双向数据流对比?

React 单向数据流

  1. 数据流向

    • 数据从父组件通过 props 传递给子组件。

    • 子组件不能直接修改父组件的数据,只能通过回调函数将数据传回父组件。

  2. 状态管理

    • 使用 useStateuseReducer 或外部状态管理库(如 Redux)来管理状态。

Vue 双向数据绑定

  1. 数据流向

    • 使用 v-model 实现表单元素的双向绑定,自动同步数据和 UI。

    • 父组件可以通过 props 传递数据给子组件,子组件可以通过 $emit 事件将更新传回父组件。

  2. 状态管理

    • 使用 datacomputedwatch 等来管理组件状态。

    • 可以使用 Vuex 进行全局状态管理。

组件化通信方式?

        react中我们通过使用回调函数来进行通信的,而Vue中子组件向父组件传递消息有两种方式:事件和回调函数。

React

  • 回调函数

    • 父组件将一个函数作为 props 传递给子组件。

    • 子组件调用这个函数,将数据传递回父组件。

Vue

  • 事件

    • 子组件使用 $emit 触发一个事件,父组件监听这个事件来接收数据。

    • 常用于父组件需要响应子组件的某个动作。

  • 回调函数

    • 父组件可以将一个函数作为 props 传递给子组件。

    • 子组件调用这个函数,将数据传递回父组件。

    • 类似于 React 的方式。

diff算法

React 的 Diff 算法

  1. Diff 队列

    • React 会对新旧虚拟 DOM 树进行比较,找出变化的部分。

    • 使用 diff 队列记录需要更新的节点。

  2. Patch 树

    • 根据 diff 队列生成 patch 树,描述如何更新实际 DOM。

    • 最后批量应用这些更新,减少直接操作 DOM 的次数。

  3. 优化策略

    • 假设同层级比较,不跨层级移动节点。

    • 使用 key 来优化列表 diff,快速定位节点变化

Vue 的 Diff 算法

  1. 双向指针

    • Vue 使用双向指针(从头和尾同时遍历)来比较新旧节点。

    • 通过指针移动来确定节点的增删改。

  2. 边对比边更新

    • 在对比的同时直接更新实际 DOM。

    • 更加实时地处理节点更新。

  3. 优化策略

    • 使用 key 来优化列表更新。

    • 通过模板编译生成优化的渲染函数,减少不必要的更新。

总结

  • React构建 patch 树后批量更新,适合大型应用的复杂更新

  • Vue边对比边更新,实时处理更新,适合高效处理小规模更新。

关注我,不迷路!

会不定时为大家更新优质内容,欢迎👍🏻+⭐️+☁️!!!方便随时查阅

相关文章:

React与Vue的对比

异同总结 相同点&#xff1a; 都有组件化思想 都支持服务器端渲染 都有Virtual DOM&#xff08;虚拟dom&#xff09; 数据驱动视图 都有支持native的方案&#xff1a;Vue的weex、React的React native 都有自己的构建工具&#xff1a;Vue的vue-cli、React的Create React A…...

精密量测软件(仿KLA免费浏览器程序ProfilmOnline)

KLA在线软件分析图 软件仿KLA公司免费浏览器软件ProfilmOnline&#xff0c;软件地址ProfilmOnline - 用于3D轮廓仪和AFM的表面成像、分析和测量软件 可以直接从profilmonline上下载3D图加载对比分析&#xff0c;当前已完成的内容有 1、调平 2、尖峰去噪 3、能量密度图&…...

Java项目: 基于SpringBoot+mybatis+maven实现的IT技术交流和分享平台(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven实现的IT技术交流和分享平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美…...

STL02——手写简单版本的list

手写一个简单版本的list 设计一个名为 List 的 List 类&#xff0c;该类具有以下功能和特性&#xff1a; 1、基础成员函数 构造函数&#xff1a;初始化 List 实例析构函数&#xff1a;清理资源&#xff0c;确保无内存泄露 2、核心功能 在 List 末尾添加元素在 List 开头添…...

基于SpringBoot的校园自助洗衣服务管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的校园自助洗衣服务…...

音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件

在文章《音视频入门基础&#xff1a;PCM专题&#xff08;1&#xff09;——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为AAC裸流文件&#xff1a; ./ffmpeg -f s16le -ar 44100 -ac 2 -i audio1.pcm audio1.aac 由于…...

第 6 篇 自定义 Helm Chart

文章目录 第 1 步&#xff1a;创建 chartChart.yamlvalues.yamltemplates 模板文件_helpers.tpl 模板辅助文件serviceaccount.yamlservice.yamldeployment.yamlhpa.yamlingress.yamlNOTES.txttests/test-connection.yaml 第 2 步&#xff1a;检查 chart 格式第 3 步&#xff1a…...

Jenkis部署vue前端项目提示:sh: vue-cli-service: command not found

解决方法&#xff1a; 1. 进入到/var/lib/jenkins/workspace/项目名下&#xff0c;查看是否有node_modules&#xff0c;如果没有执行 npm install 2. 如果执行npm intall的过程中提示&#xff1a;npm ERR! 407 Proxy Authentication Required - GET http://registry.npm.taob…...

中介者模式mediator

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/mediator 减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。...

GO语言性能分析

Go语言基准测试与pprof工具性能分析详解 在现代软件开发中&#xff0c;性能优化是一个重要的环节。Go语言提供了强大的工具来进行基准测试和性能分析&#xff0c;其中 testing 包用于基准测试&#xff0c;而 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]:外观模式

引导性开场 菜鸟&#xff1a;老鸟&#xff0c;我最近在做一个项目&#xff0c;感觉代码越来越复杂&#xff0c;我都快看不懂了。尤其是有好几个子系统&#xff0c;它们之间的调用关系让我头疼。 老鸟&#xff1a;复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你…...

多进程编程

基本概念 进程是一个具有单独功能的程序对某个数据集在处理机上的执行过程&#xff0c;进程也是作为资源分配的一个单位。 进程和程序是相辅相成的&#xff0c;进程是一个动态概念。 进程具有并行性特征。进程具有独立性和异步性。 进程的描述 进程分为三部分&#xff1a;…...

7-Zip压缩包如何添加密码,加密后如何取消

压缩包文件大家经常使用&#xff0c;最熟悉的肯定是RAR、ZIP格式压缩文件&#xff0c;但是7z压缩文件格式也很好用&#xff0c;它是三种压缩文件格式中压缩率最大的。想要将文件压缩到最小&#xff0c;使用7z格式可以达到最大化。那么在使用7z压缩格式的时候&#xff0c;我们可…...

HarmonyOS---应用测试概述

一、应用质量要求 应用质量要求分为应用体验质量建议和应用内容合规要求两大部分。 1、应用体验质量建议 功能数据完备、基础体验要求、HarmonyOS特征增强体验要求。 &#xff08;1&#xff09;功能数据完备 &#xff08;2&#xff09;基础体验要求 &#xff08;3&#xff09;增…...

密码学---真题演练

✨Base加密&#xff1a;题目-base? 靶场网址&#xff1a;https://polarctf.com/ Base100加密&#xff01;&#xff01;&#xff01; 得到的新的一串密码是 rot47 密码&#xff0c;属于凯撒密码的一种变体. ✨斐波那契&#xff1a;题目-FB 从第三项开始&#xff0c;每一项都等…...

时间日期工具类

时间日期工具类 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有大量的配置文件&#xff0c;所以 Linux的文本处理工具也是比较多的&#xff0c;其中编辑一些配置文件时&#xff0c;常用的工具就是 vim。在Linux中&#xff0c;Vim编辑器是一个非常强大的文本编辑工具&#xff0c;它提供了多种模式和命令来满足不同的编辑需求。以…...

计算机的错误计算(八十九)

摘要 探讨反双曲余切函数 acoth(x) 在 附近的计算精度问题。 Acoth(x) 函数的定义为&#xff1a; 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002) . 不妨在 Excel 的单元格中计算&#xff0c;则有&#xff1a; 若在Python中用定义直接计算&#xff0c;则有几乎…...

深入理解java并发编程之aqs框架

跟synchronized 相比较&#xff0c;可重入锁ReentrankLock其实原理有什么不同&#xff1f; 所得基本原理是为了达到一个目的&#xff1b;就是让所有线程都能看到某种标记。synchronized通过在对象头中设置标记实现了这一目的&#xff0c;是一种JVM原生的锁实现方式。而Reentran…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...