漫谈前端:2025年框架是该选vue还是react?

news2024/9/30 19:36:51

相信很多前端小伙伴都有过纠结的时候,开始一个项目的时候是该选vue还是react。很多情况下,都是根据团队现有框架延续,或者是自身数量度。渐渐的公司组件和规范全基于某一种框架,虽然很爽但Allin难掉头。本文就浅浅的比较下vue和react框架,谈一谈个人看法。

目前二者的版本和周下载对比:

名称最新版本周下载(百万次)问题数
vue3.5.105.5642
react18.3.125.8650

 比较可惜的是目前npmjs官网差不多vue2的数据了,react的全球下载量是react的五分之一,而国内npmmirror下载量每周也就0.5m,react稍微小一点0.4m左右。二者都比年初要提升不少,只是vue基数比较小,总体来看vue的用户数量是比react少一些的。但国内react用户量在增加明显

下面将对比下二者使用上的差异,设计和性能就不比较了,其实都差别不太大。

1. 状态管理

Vue 3

在 Vue 3 中,setup 是一个新引入的生命周期钩子,它允许我们通过 refreactive 创建和管理组件内部的状态。setup 函数的主要优点是更容易组织和复用逻辑,尤其是与组合式 API 搭配使用时。

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script >
import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);
    
    const increment = () => {
      count.value++;
    };

    return { count, increment };
  }
};
</script>

在这个示例中,ref 用于声明响应式状态 count,并且 setup 函数返回的数据会暴露给模板。

React (函数式组件)

React 中,状态管理依赖于 useState 钩子。React 的函数式组件(FC)是无状态的,但通过 Hooks(如 useStateuseReducer)可以实现状态管理。
j

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);

  const increment = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>{count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
};

export default Counter;

在这个示例中,useState 钩子用于创建和管理 count 的状态,并通过回调函数 setCount 更新状态。

对比

特性Vue 3 (setup)React FC (useState)
状态声明使用 refreactive使用 useState
响应式处理Vue 内置响应式系统React 使用 Hooks,非响应式
逻辑组织组合 API 更易复用逻辑Hooks 使逻辑复用变得灵活
语法复杂度较为简洁,ref.value 语法相对简洁

2. 数据流

Vue 3

在 Vue 3 中,数据流主要通过 props 向下传递,emits 向上传递。父子组件间的数据流较为明确,借助 setup 函数可以简化状态和逻辑处理。

// Parent.vue
<template>
  <Child :message="parentMessage" @reply="handleReply" />
</template>

<script>
import Child from './Child.vue';

export default {
  components: { Child },
  setup() {
    const parentMessage = ref('Hello from Parent');
    const handleReply = (replyMessage) => {
      console.log(replyMessage);
    };

    return { parentMessage, handleReply };
  }
};
</script>

React (函数式组件)

在 React 中,数据流也通过 props 传递,父组件可以通过回调函数接收子组件传递回来的数据。

// Parent.js
import React from 'react';
import Child from './Child';

const Parent = () => {
  const parentMessage = 'Hello from Parent';

  const handleReply = (replyMessage) => {
    console.log(replyMessage);
  };

  return <Child message={parentMessage} onReply={handleReply} />;
};

export default Parent;

React 和 Vue 都遵循自顶向下的数据流,但 React 的 props 是单向绑定,Vue 则支持更灵活的双向绑定机制(例如 v-model)。

对比

特性Vue 3 (setup)React FC
数据传递props 向下,emits 向上props 向下,回调向上传递
数据流模式支持单向/双向数据绑定主要是单向数据流
事件处理使用 emits$emit使用回调函数传递事件

3. Provide/Inject(依赖注入)

Vue 3

Vue 3 提供了 provideinject 来实现祖先组件与后代组件之间的通信,允许在组件树中上下层级之间传递数据,而不必通过 props 层层传递。provideinjectsetup 中使用时更加简洁和直观。

 

// Parent.vue
<template>
  <Child />
</template>

<script>
import { provide, ref } from 'vue';
import Child from './Child.vue';

export default {
  components: { Child },
  setup() {
    const message = ref('Hello from Parent');
    provide('parentMessage', message);
  }
};
</script>

// Child.vue
<template>
  <p>{{ parentMessage }}</p>
</template>

<script>
import { inject } from 'vue';

export default {
  setup() {
    const parentMessage = inject('parentMessage');
    return { parentMessage };
  }
};
</script>

React (Context API)

React 中没有直接的 provide/inject,但是通过 Context API 实现类似功能。Context 允许在组件树中向下传递数据,无需通过每一级组件手动传递 props

 

import React, { createContext, useContext, useState } from 'react';

const MessageContext = createContext();

const Parent = () => {
  const [message] = useState('Hello from Parent');

  return (
    <MessageContext.Provider value={message}>
      <Child />
    </MessageContext.Provider>
  );
};

const Child = () => {
  const message = useContext(MessageContext);
  return <p>{message}</p>;
};

export default Parent;

对比

特性Vue 3 (provide/inject)React (Context API)
用途祖先与后代组件之间的数据传递全局或层级深的状态共享
语法复杂度相对简单,内置 API相对复杂,需要 Context 和 Hooks
使用场景轻量级依赖注入状态、主题、配置等全局数据

4. 组件管理

Vue 3 (setup)

Vue 3 通过 setup 更容易将逻辑拆分到多个文件或组合函数中,逻辑复用也更灵活。在 Vue 3 中,组合式 API 提供了一种清晰的方式来管理组件的生命周期和逻辑。

示例:通过组合函数(useCounter)将逻辑抽离出来:

// useCounter.js
import { ref } from 'vue';

export function useCounter() {
  const count = ref(0);
  const increment = () => {
    count.value++;
  };
  
  return { count, increment };
}

// Counter.vue
<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { useCounter } from './useCounter';

export default {
  setup() {
    const { count, increment } = useCounter();
    return { count, increment };
  }
};
</script>

React (函数式组件)

React 使用 Hooks 进行逻辑复用和组件管理,通过自定义 Hooks 可以将组件的逻辑抽离和复用。

示例

// useCounter.js
import { useState } from 'react';

export const useCounter = () => {
  const [count, setCount] = useState(0);

  const increment = () => {
    setCount(count + 1);
  };

  return { count, increment };
};

// Counter.js
import React from 'react';
import { useCounter } from './useCounter';

const Counter = () => {
  const { count, increment } = useCounter();

  return (
    <div>
      <p>{count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
};

export default Counter;

对比

特性Vue 3 (setup)React FC (Hooks)
逻辑复用组合 API(自定义组合函数)自定义 Hooks
代码可读性逻辑集中,提升可读性Hooks 易于拆分和管理
生命周期管理提供组合 API,直观通过 Hooks 处理(如 useEffect

5 总结

特性Vue 3 (setup)React FC
状态管理refreactive 提供响应式状态useState 提供非响应式状态
数据流propsemits 实现单向/双向流props 和回调函数实现单向流
依赖注入内置依赖注入,适合祖孙组件通信使用 Context API 实现全局状态
组件管理和逻辑复用组合 API 更灵活且可读性强Hooks 易于拆分逻辑,但有时复杂

选型建议

  • Vue 3 更适合那些希望简化组件逻辑和状态管理的开发者,特别适用于中小型项目或希望以更加响应式的方式管理状态的场景。但并不是说vue3无法开发大型项目。
  • React 更适合大型项目,特别是具有复杂交互逻辑、需要深度拆分逻辑和复用组件的场景。(目前vue3的jsx还是有些gap的,后续章节我会说明下)React 的生态系统广泛,适合团队协作和长期维护
  • 国内政企项目推荐vue3,毕竟有点优势,vue2也够用,但上2.7版本得谨慎。
  • 个人项目随意,建议交叉混用,以便训练思维,如果比较急就挑顺手的吧
  • 对外项目,比如跨境、港澳合作以及面向国外团队,选择react会有优势,毕竟react的外部生态更庞大,又有大公司背书,这个主要是一信任度的问题,尤其是fb的开源做的真不差

最后,通过二者兼修(甚至多修svelte-angular等),尝试找到适合自己的开发模式,找到合适的状态管理(我选了rxjs作为中间层),剥离出UI和状态,后续我会介绍一些实践经验。

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

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

相关文章

鸿蒙开发(NEXT/API 12)【穿戴设备信息查询】手机侧应用开发

// 在使用Wear Engine服务前&#xff0c;请导入WearEngine与相关模块 import { wearEngine } from kit.WearEngine; import { BusinessError } from kit.BasicServicesKit;查询穿戴设备是否支持某种WearEngine能力集 注意 该接口的调用需要在开发者联盟申请设备基础信息权限。…

Java 异常处理机制

目录 1.异常处理的五个关键字 测试一&#xff1a;理解try catch finally 的作用 测试二&#xff1a;设置想要捕获的异常类型 测试三&#xff1a;可以写多个catch。 2.异常快捷键 3.在方法体中抛出异常用throw&#xff1b;在方法参数后面抛出异常用throws &#xff08;1&…

Ubuntu 手动安装 ollama

官方linux安装ollama命令: curl -fsSL https://ollama.com/install.sh | sh 运行结果&#xff1a; 由于官方提供的ollama安装命令老是安装中断&#xff0c;所以我选择手动安装。 手动安装步骤&#xff1a; 官网链接&#xff1a;ollama/docs/linux.md at main ollama/ollama…

盛事启幕 | 第三届OpenHarmony技术大会重磅官宣,邀您共绘智联未来

未来已来&#xff0c;科技何向&#xff1f; ——10月12日-13日众多大咖齐聚上海 聚焦OpenHarmony生态前沿 与您一同解码技术的下一片蓝海

【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 timer驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "timer.h"int main(void) {H…

seata服务端部署

1.下载seata 官网下载地址&#xff1a;http://seata.io/zh-cn/blog/download.html 或者下载 作者已经下载的压缩包1.4.0 注意&#xff01;&#xff01;&#xff01; 要参考对应的版本&#xff0c;否则可能出现无法正常启动的情况。 参考文档 下载完毕后解压压缩文件 2.修改配…

6个Android ANR面试题和优化方案

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 面试题 1、 解释什么是ANR以及它在Android中是如何产生的&#xff1f; ANR是指应用程序未响应&#xff0c;通常是因为主线程被阻塞导致无法及…

【性能测试】jmeter工具核心组件说明手册

前言 Apache JMeter 是一个用于压力测试和性能测量的开源工具&#xff0c;它被设计用来测试静态和动态资源&#xff08;例如静态文件、CGI接口、Java 对象、数据库和 FTP 服务器&#xff09;&#xff0c;以及分析整体系统性能。JMeter提供了丰富的组件集&#xff0c;使得用户可…

国内邮件推送防拦截秘籍与内容优化技巧详解

企业需优化邮件内容、选择优质服务商、配置域名验证&#xff0c;避免垃圾邮件特征&#xff0c;控制发送频率和策略&#xff0c;以提高邮件送达率和用户互动率。ZohoCampaigns等平台提供多项功能助力邮件营销。 一、了解邮件拦截的常见原因 在讨论如何避免邮件被拦截之前&#…

Cookie Session Token的各种知识

Session 1、为什么有session&#xff1f; 因为HTTP是无状态协议&#xff0c;每次请求服务器并不知道历史请求的记录&#xff0c;Session和Cookie主要就是为了弥补无状态的特性 2、Session是什么 客户端请求时&#xff0c;服务端开辟一块内存空间存放Session对象&#xff0c;存…

(二)大模型调用

一、基本概念 1.1、Prompt 大模型的所有输入&#xff0c;即&#xff0c;我们每一次访问大模型的输入为一个 Prompt&#xff0c; 而大模型给我们的返回结果则被称为 Completion。 1.2、Temperature LLM 生成是具有随机性的&#xff0c;在模型的顶层通过选取不同预测概率的预测结…

SOLIDWORKS 2025 PDM 更新亮点:效率与性能的提升!

SOLIDWORKS PDM 持续致力于为用户提供更加高效、直观且灵活的数据管理解决方案。SOLIDWORKS 2025 也对PDM功能进行了多方面的改进&#xff0c;旨在提高工作效率&#xff0c;并增强系统性能。 以下是SOLIDWORKS 2025 PDM中的几项关键功能的详细介绍。 1经过改进的材料明细表可…

【C++】面向对象编程的三大特性:深入解析多态机制

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

这次PostgreSQL事故后,我把表膨胀清理工具撸了一遍

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

预训练技巧:在训练末尾对领域数据上采样

1. 简介 介绍了一种在模型训练结尾对领域数据上采样能够提升在benchmark上的指标。通过实验表明上采样比例在10-20%是能够在通用语言能力与目标benchmark保持权衡的最好比例。 2. 实验 数据&#xff1a;1T模型&#xff1a;decoder-only结构&#xff0c;7B大小&#xff0c;具…

Linux:进程间通信之共享内存

我们无论使用命名管道还是匿名管道&#xff0c;都是在文件层面上实现的通信&#xff0c;实际上还有基于系统层面的system v标准的进程间通信方式。 因为操作系统不相信用户&#xff0c;所以用户使用的时候只能通过调用的方式 进程间通信的本质&#xff1a;先让不同的进程看到…

C++中list类的使用及模拟实现

目录 1.C中list的底层结构 2.C中list容器各个接口函数的使用 3.迭代器的分类 3.1从功能上进行分类 3.2从性质上进行分类 4.list的结构 5.list的模拟实现 5.1默认成员函数(Member functions) 5.1.1构造函数(constructor) 5.1.1.1默认构造函数 5.1.1.2 initializer …

OSError: [WinError 126] 找不到指定的模块。 Error loading \torch\lib\fbgemm.dll“

遇到问题&#xff1a; 在使用torch 、 或者任何设计到torch的库中&#xff0c;只要导入torch就会报错 解决方案 https://blog.csdn.net/Changxing_J/article/details/140489278 https://blog.csdn.net/weixin_43591849/article/details/140715890&#xff08;最终这个解决&…

初识Linux · 进程终止

目录 前言&#xff1a; 进程终止在干什么 进程终止的3种情况 进程如何终止 前言&#xff1a; 由上文的地址空间的学习&#xff0c;我们已经知道了进程不是单纯的等于PCB 自己的代码和数据&#xff0c;进程实际上是等于PCB mm_struct(地址空间) 页表 自己的代码和数据。…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之⑥:NL2SQL技术探讨

一、概述 NL2SQL&#xff08;Natural Language to SQL&#xff09;是一种将自然语言转换为结构化查询语言的技术。它可以帮助用户通过使用自然语言来与数据库进行交互&#xff0c;而无需了解复杂的SQL语法。 NL2SQL技术的背景&#xff1a; 随着人工智能的发展&#xff0c;越…