前端框架大比拼:2022年的Vue与React谁更胜一筹?

简介: 前端框架大比拼:2022年的Vue与React谁更胜一筹?

前端框架经历了十多年的争奇斗艳百花齐放,经历了 JSP、jQuery、Ember、Angular、React、Vue、Solid、Svelte 等等。如今所有人都要承认的一个事实是:在上百个前端框架中,最具影响力的只剩下了两个,Vue 与 React。

Vue 进入 3.x 时代已经将近 2 年了,React 也在今年 3 月 29 日发布了 React 18 版本。

今天就来聊聊在当今 2022 年,两者还有哪些区别。

下面我们从头开始对比它们,看看到底谁更胜一筹。


安装与启动


从两个框架的安装开始。


Vue


Vue 提供了 Vue CLI 创建 Vue 项目,安装命令如下:


npm install -g @vue/cli

安装成功后可以通过查看版本来确定安装成功。


vue --version

创建新的项目运行以下命令:


vue create project
cd project
npm run serve


React


创建 React 项目的工具是 create-react-app,简称 CRA。


npm install -g create-react-app

创建新的项目运行以下命令:


npx create-react-app project
cd project
npm run start


结论


两者在安装和启动项目上几乎一致,平手。


Props


两个框架都是使用组件作为基础开发的,那么父子组件传值就成了一个问题。props 是将数据从父组件传递给子组件的关键技术。


Vue


在 Vue 中,props 使用普通的字符串传递。也可以通过 v-bind 指令传递变量,缩写是冒号(:)。

父组件传值:


<template>
  <Modal :isOpen="open" title="创建项目" />
</template>

子组件访问 props 需要使用 defineProps 函数:


<template>
  <form v-if="isOpen">
    <p>{{ title }} </p>
  </form>
</template>
<script setup>
  const props = defineProps({
    isOpen: Boolean,
    title: String
  });
</script>

React


在 React 中,props 是通过花括号传递变量的。

父组件传值:


<Modal isOpen={open} title="创建项目" />

子组件通过参数的方式获取 props:


function Modal({ isOpen, title }) {
  return (
    {isOpen &&
     <form>
        <p>{ title }</p>
      </form>
  );
}

结论


在传递 props 时,Vue 需要在属性前面额外添加指令,如果忘记添加指令会导致传递字符串。React 则不会有这种情况。

在子组件取值时,Vue 需要调用 defineProps 函数,React 通过函数的参数获取,更加自然。

综合对比,Vue 心智负担更大,React 则更加自然。这一轮 React 胜。


Event


Vue 使用了模板语法,React 使用了 JSX 语法。所以在编写 HTML 上发生了变化。但我们仍然需要为元素添加鼠标事件、键盘事件等。事件的处理也是一个必须事情。


Vue


Vue 处理事件通过 v-on 指令完成的,简写是 AT 符号(@)。


<template>
    <button @click="displayName"> Show Name </button>
<template>
<script setup>
    function displayName() {
      // TODO
    }
</script>

React


React 创建事件的方式和原生 HTML 几乎一致,区别是将绑定事件的属性名要求为驼峰命名法。


function NameAlert() {
    const displayName = () => {
      // TODO
    }
    return (
        <button onClick="displayName"> Show Name </button>
    );
}

结论


React 更加自然,Vue 仍然是需要额外的操作符,如果忘记添加操作符,就会变成传递字符串的 props,React 则没有这个问题。这一轮 React 胜。


State


两者都是数据驱动的响应式框架,那么管理状态就成了一个关键问题。


Vue


在 Vue 中,通过 ref 或者 reactive 来创建状态。

两者的用法稍有不同,ref 是用来处理基础类型的状态的,而 reactive 通常处理引用类型的状态。

使用 ref 状态时需要通过 ref.value 来访问状态。


<template>
  <div>
    <p>{{ firstname }}</p>
    <p>{{ lastname }}</p>
  </div>
</template>
<script setup>
  import { ref, reactive } from 'vue';
  const firstname = ref('张');
  console.log(firstname.value);
  const lastname = reactive('三');
  console.log(lastname);
</script>

监听某个状态变化的方法是 watch 和 watchEffect。

两者的区别是 watchEffect 会在最初运行一次,并且自动收集依赖。


import { watch, watchEffect } from 'vue';
watch(firstname, () => alert('firstname 改变了!');
watchEffect(() => alert('lastname 改变了!');

React


React 使用 useState 来创建状态。


import { useState } from 'react';
function ShowName() {
  const [firstName, setFirstName] = useState('张');
  const [lastName, setLastName] = useState('三');
  console.log(firstName, lastName);
  return (
    <div>
      <p>{ firstname }</p>
      <p>{ lastname }</p>
    </div>
  )
}

React 使用 useEffect Hook 来监听状态变化。这个 Hook 接受一个回调函数和一个依赖数组。当依赖数组中任意一个状态发生变化时,回调函数就会触发。


import { useEffect } from 'React';
useEffect(() => {
  console.log('名字改变了!');
}, [firstName, lastName]);


结论


Vue 在创建状态和监听状态时分别提供了多种方式,我们在使用时需要考虑哪种情况该用哪种 API,而 React 分别只提供了一种方式,但是它同样可以做到应对各种情况。综合对比,Vue 心智负担更高,React 更简单。这一轮 React 胜。


Ref


尽管两门框架都使用组件进行编程,但我们还是难免需要访问 DOM,比如添加动画、控制输入框焦点等。为了解决这类问题,两门框架都提供了 ref 的概念,使用它可以创建对 DOM 的引用。


Vue


Vue 提供了 ref API。


<template>
  <div>
    <input type="text" ref="name" />
    <button @click="handleBtnClick"> 开始输入 </button>
  </div>
</template>
<script setup>
  import { ref } from 'vue';
  const name = ref(null);
  handleBtnClick(() => {
    name.value.focus();
  }
</script>

React


React 提供了 useRef Hook。但是要访问 DOM,需要使用 ref.current 属性。


import { useRef } from 'react';
function MyName() {
  const name = useRef(null);
  handleBtnClick(() => {
    name.current.focus();
  });
  return (
    <input type="text" ref="name" />
    <button onClick={handleBtnClick}> 开始输入 </button>
  )
}


结论


几乎没什么区别,平。


双向数据绑定


我们在使用 input、select、textarea 这类元素的时候,输入的值需要和状态进行同步。而状态发生变化时,元素的值也应该被同步。这个功能被称作数据双向绑定。


Vue


Vue 提供了 v-model 指令创建双向绑定。


<template>
  <input v-model="searchQuery" />
</template>
<script setup>
import { ref } from 'vue';
const searchQuery = ref('');
</script>

React


React 没有为这项功能单独提供 API,但我们也可以实现。


import { useState } from 'react';
function MyComponent() {
  [searchQuery, setSearchQuery] = useState('');
  const handleChange = (event) => {
     setSearchQuery(event.target.value);
  }
  return (
    <input value={searchQuery} onChange={handleChange}/>
  );
}

结论


从语法上看,Vue 更简洁。但是这会破坏单向数据流的原则,因为改变数据的方式不再是只有一种。React 的代码虽然不简洁,但更加容易追踪状态。这也是 React 和 Vue 在设计理念上的不同。在「让开发者写更少的代码」和「代码结构更加清晰易于维护」之间,Vue 选择了前者,React 选择了后者。至于谁好谁坏,个人更加倾向于后者,但是也有人倾向于前者。因为是取舍问题,平。


动态渲染


有些时候我们的组件是根据某些条件进行渲染的,这也就是动态渲染。


Vue


Vue 提供了三个指令:v-if、v-else 和 v-show。


<template>
  <div>
    <p v-if="isLoggedIn"> 欢迎 </p>
    <p v-else> 请登录 </p>
    <button v-show="!isLoggedIn">登陆</button>
  </div>
</template>

React


React 没有为这种功能提供任何 API,而是使用原生 JavaScript 的条件语句,if、&& 或者是三元运算符等。


function MyComponent() {
  return (
    {isLoggedIn ? 
     <p>欢迎</p> :
     <p> 请登录 </p>
    }
    {!isLoggedIn && <button> 登陆 </button>}
  );
}

结论


Vue 的语法是在元素上添加特殊的属性,而 React 的语法是纯粹的 JavaScript 语法。从语法上看,没有太大差别。但是 Vue 会有额外的学习成本。综合来看,这轮 React 略胜一筹。


渲染子组件


有时我们需要在组件中将子组件传递给其他组件一起渲染。


Vue


Vue 提供了 slot 来传递子组件。

容器组件:


<template>
  <div>
    <h1>Welcome</h1>
    <slot><slot>
  </div>
</template>

父组件:


<template>
  <div>
    <h1>欢迎来到我的网站</h1>
    <Modal>
        <input type="text" />
        <button>登陆</button>
    </Modal>
  </div>
</template>

React


React 的子组件是一个 props 上面的一个属性:children。

容器组件:


function Modal( {children} ) {
  return (
    <div>
       <h1>Welcome</h1>
       { children }
    </div>
  );
}

父组件:


function UserPage() {
  return (
     <div>
     <h1>欢迎来到我的网站</h1>
      <Modal>
        <input type="text" />
        <button>登陆</button>
      </Modal>
    </div>
  );
}

结论


从上面的例子中看不出两者太大的差距。但是在更复杂的情况下,比如要传递 N 个子组件。React 可以通过属性进行传递,操作组件就和操作变量一样;Vue 则有了命名插槽、插槽动态名称、范围插槽等概念,操作起来比较麻烦,而且心智负担也高。这一轮 React 胜。


总结


通过本文,我对比了两个框架中大部分的概念和语法,各自有各自的优势,很难说清楚到底谁更好。

早在 2016 年左右我第一次对两者做对比的时候,感觉差距还是蛮大的,那时候 React 还是 class 组件的时代,还要靠 this.setState 来更新状态,组件也拥有很多复杂的生命周期。Vue 还是 Options API 的时代,也不怎么好用,比如 this 的问题;data 必须传递函数再返回一个对象;所有东西都要定义,使用组件要定义,使用事件要定义......

再来看今天的 React 和 Vue,似乎都在向同一个方向房展,而且越来越像。

虽然有相互借鉴的成分存在,但是从几年前就一直有一个质疑的声音,说 Vue 抄袭 React。特别是 Vue3 推出了 Composition API 之后,越来越像 React。甚至于有人说 Vue3 的代号海贼王,就是暗喻自己是从 React 那里偷走了很多东西。

你认为呢?



相关文章
|
8天前
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
29 3
|
7天前
|
JavaScript 前端开发 API
如何在前端开发中有效管理状态:React vs. Vue
在现代前端开发中,状态管理是一个关键因素,它直接影响到应用的性能和可维护性。React 和 Vue 是当前最流行的前端框架,它们在状态管理方面各有优势和劣势。本文将深入探讨 React 和 Vue 在状态管理中的不同实现,分析它们的优缺点,并提供实际应用中的最佳实践,以帮助开发者选择最适合他们项目的解决方案。
|
20天前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
52 0
|
20天前
|
前端开发 Java JSON
Struts 2携手AngularJS与React:探索企业级后端与现代前端框架的完美融合之道
【8月更文挑战第31天】随着Web应用复杂性的提升,前端技术日新月异。AngularJS和React作为主流前端框架,凭借强大的数据绑定和组件化能力,显著提升了开发动态及交互式Web应用的效率。同时,Struts 2 以其出色的性能和丰富的功能,成为众多Java开发者构建企业级应用的首选后端框架。本文探讨了如何将 Struts 2 与 AngularJS 和 React 整合,以充分发挥前后端各自优势,构建更强大、灵活的 Web 应用。
34 0
|
20天前
|
前端开发 Java UED
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
35 0
|
20天前
|
开发者 安全 UED
JSF事件监听器:解锁动态界面的秘密武器,你真的知道如何驾驭它吗?
【8月更文挑战第31天】在构建动态用户界面时,事件监听器是实现组件间通信和响应用户操作的关键机制。JavaServer Faces (JSF) 提供了完整的事件模型,通过自定义事件监听器扩展组件行为。本文详细介绍如何在 JSF 应用中创建和使用事件监听器,提升应用的交互性和响应能力。
18 0
|
20天前
|
开发者 自然语言处理 存储
语言不再是壁垒:掌握 JSF 国际化技巧,轻松构建多语言支持的 Web 应用
【8月更文挑战第31天】JavaServer Faces (JSF) 框架提供了强大的国际化 (I18N) 和本地化 (L10N) 支持,使开发者能轻松添加多语言功能。本文通过具体案例展示如何在 JSF 应用中实现多语言支持,包括创建项目、配置语言资源文件 (`messages_xx.properties`)、设置 `web.xml`、编写 Managed Bean (`LanguageBean`) 处理语言选择,以及使用 Facelets 页面 (`index.xhtml`) 显示多语言消息。通过这些步骤,你将学会如何配置 JSF 环境、编写语言资源文件,并实现动态语言切换。
21 0
|
20天前
|
开发者 Java
JSF EL 表达式:乘技术潮流之风,筑简洁开发之梦,触动开发者心弦的强大语言
【8月更文挑战第31天】JavaServer Faces (JSF) 的表达式语言 (EL) 是一种强大的工具,允许开发者在 JSF 页面和后台 bean 间进行简洁高效的数据绑定。本文介绍了 JSF EL 的基本概念及使用技巧,包括访问 bean 属性和方法、数据绑定、内置对象使用、条件判断和循环等,并分享了最佳实践建议,帮助提升开发效率和代码质量。
26 0
|
20天前
|
前端开发 UED 开发者
React组件优化全攻略:深度解析让你的前端应用飞速运行的秘诀——从PureComponent到React.memo的彻底性能比较
【8月更文挑战第31天】在构建现代Web应用时,性能是提升用户体验的关键因素。React作为主流前端库,其组件优化尤为重要。本文深入探讨了React组件优化策略,包括使用`PureComponent`、`React.memo`及避免不必要的渲染等方法,帮助开发者显著提升应用性能。通过实践案例对比优化前后效果,不仅提高了页面渲染速度,还增强了用户体验。优化React组件是每个开发者必须关注的重点。
35 0
|
20天前
|
前端开发 API 开发者
【前端数据革命】React与GraphQL协同工作:从理论到实践全面解析现代前端数据获取的新范式,开启高效开发之旅!
【8月更文挑战第31天】本文通过具体代码示例,介绍了如何利用 GraphQL 和 React 搭建高效的前端数据获取系统。GraphQL 作为一种新型数据查询语言,能精准获取所需数据、提供强大的类型系统、统一的 API 入口及实时数据订阅功能,有效解决了 RESTful API 在复杂前端应用中遇到的问题。通过集成 Apollo Client,React 应用能轻松实现数据查询与实时更新,大幅提升性能与用户体验。文章详细讲解了从安装配置到查询订阅的全过程,并分享了实践心得,适合各层次前端开发者学习参考。
27 0