前言

欧阳最近找工作面试时总是被问到两个问题:Vue和React的区别从编译原理的角度来聊聊Vue的template和React的jsx。面试官问这些问题一般是想了解你对这两个框架的理解,所以这是一个开放性的问题,不同的同学对框架的理解程度不同、侧重点不同,回答出来的答案也不同。这篇文章欧阳将从Vue出发来聊聊Vue和React的区别,大家有补充的欢迎在评论区提出。

欧阳也在找工作,坐标成都求内推!

简单概述

先来说说相同点,这个简单,组件化、采用虚拟DOM、以及都在向函数式编程靠拢,具体的表现就是Vue推出了Composition(组合式) API,React推出了hooks。

相同点都是一些老生常谈的话题了,我们这篇文章主要来聊聊不同点。关于不同欧阳列出了下面几点:

  • 设计理念不同

  • Vue的组件编译后是一个组件对象,而React的组件就是一个函数

  • diff优化

  • 中文文档

设计理念

我们先来看一张React官网的截图:

从这张图中我们可以提取出两个主要信息:React组件就是函数编写组件的语法是JSX,本质就是Javascript

我们平时写React实际就是在写JS,这也就是为什么React那么灵活的原因。灵活带来的优势就是上限高,劣势就是上手难度相对Vue较难。

所以在React社区中有高阶组件、compose函数、纯函数等概念,但是这些概念在Vue社区中很少提及。

而Vue从出生开始就一直在尽可能的降低前端开发门槛,通过什么方式降低呢?

Vue内置了很多黑魔法,比如SFC宏函数指令scoped等,其中最大的黑魔法就是单文件组件SFC。只要我们按照Vue的设计规范来,就能轻松的写出漂亮的代码。

同时Vue的设计也不会让人反感,因为学习他的这一套东西真的很容易,这也就是为什么很多后端同学写前端都是从Vue开始。

也正是因为有这么多黑魔法,所以导致很多同学一年工作经验用三年。他们将这些黑魔法当作前端语言中的一部分,离开这些黑魔法后发现自己什么都不懂。

组件存在的形式

从前面的官网截图可以看到React中定义一个组件就是在定义一个函数,一个文件里面可以定义多个函数,所以理所应当的在一个文件中可以定义多个组件。

但是在Vue中事情就不一样了。

大家都知道在Vue中一个.vue文件就是一个Vue组件,所以想正常的在一个.vue文件中定义多个Vue组件是不可能的。

大家知道一个Vue组件到底是什么样的吗?比如这个子组件count-child.vue

<template>
<h1>count的值是: {{ count }}</h1>
<button @click="count++">count++</button>
</template> <script setup lang="ts">
import { ref } from "vue"; const count = ref(0);
</script>

很简单!我们直接在父组件里面把他打印出来就知道这个组件到底是什么玩意了,父组件代码如下:

<script setup lang="ts">
import CountChild from "./count-child.vue";
console.log(CountChild);
</script>

我们来控制台上面看看打印出来的CountChild长什么样,如下图:

从上图中可以看到import导入进来的CountChild变量是一个对象,并且对象上面还有一些属性的方法:rendersetup

在父组件里面import CountChild from "./count-child.vue",这是使用了import语法,讲道理子组件里面应该是有export的,但是在子组件里面没有看到任何export的代码。

其实这些都是vue-loader或者@vitejs/plugin-vue做的工作,底层还是调用Vue暴露出来的编译API。

经过他们的处理一个.vue文件就变成了一个组件对象。

所以在Vue中组件其实就是对象,只是这个对象中拥有rendersetup等方法。其实我们可以自己手写一个对象,按照Vue他的规则去定义对象里面的rendersetup等方法同样可以定义一个Vue组件。

正是因为在Vue中组件就是对象,所以在Vue社区中才很少出现高阶组件、compose函数、纯函数等概念。因为这些东西都是依赖于函数去实现的,而React中组件就是函数。

diff优化

众所周知每重新渲染一次都会执行一次diff算法,如果参与diff的DOM足够复杂,那么这个diff的过程也是很耗时的。

在优化diff上面Vue和React走向了两个极端,Vue走向了更加细粒度的更新,也就是大名鼎鼎的靶向更新,如果你不知道可以看一下我的这篇 靶向更新 文章。而React则是引入了fiber,采用时间切片的方式进行优化。

那么为什么React中没有实现靶向更新呢?

原因很简单,因为Vue的template模版很不灵活,也正是因为不灵活所以可以在编译时就对代码进行分析出哪些节点是动态的。相反在React中的JSX是相当灵活,想对他进行静态分析很难实现。

中文文档

尤大和大部分Vue团队成员都是国人,所以每当英文文档更新后,对应的中文文档就会很快的更新。这对于英文不好的同学是特别友好的,React虽然也有中文文档,但是相比英文文档来说还是有一些滞后。

总结

这篇文章我们分别从设计理念、组件存在形式、diff优化、中文文档方面聊了一下Vue和React的区别,欢迎大家在评论区进行补充。

关注公众号:【前端欧阳】,给自己一个进阶vue的机会

面试官最想听到的Vue和React区别的更多相关文章

  1. Get与Post的区别?(面试官最想听到的答案)

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  2. 【Java面试】这应该是面试官最想听到的回答,Mysql如何解决幻读问题?

    "Mysql如何解决幻读问题" 一个工作了4年小伙伴,去一个美团面试,遇到了这样一个问题. 大家好,我是Mic,一个工作了14年的Java程序员 关于这个问题,面试官想考察什么?我 ...

  3. vue和react区别

    vue和react区别  

  4. 面试官:自己搭建过vue开发环境吗?

    开篇 前段时间,看到群里一些小伙伴面试的时候被面试官问到这类题目.平时大家开发vue项目的时候,相信大部分人都是使用 vue-cli脚手架生成的项目架构,然后 npm run install 安装依赖 ...

  5. 前端-关于 Vue 和 React 区别的一些笔记

    监听数据变化的实现原理不同 1.Vue 通过 getter/setter 以及一些函数的劫持,能精确知道数据变化,不需要特别的优化就能达到很好的性能 2.React 默认是通过比较引用的方式进行的,如 ...

  6. 金三银四,如何征服面试官,拿到Offer

    又到了茶余饭后的时间,想想写点什么,掐指一算,噢呦,快到3月份了,职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息,就是好多公司在优化裁 ...

  7. 如何征服面试官,拿到Offer [转]

    转自 https://my.oschina.net/cccyb/blog/3012768 又到了茶余饭后的时间,想想写点什么,掐指一算,噢呦,快到3月份了,职场的金三银四跳槽季又来了,不同的是今年比往 ...

  8. 面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号?

    前言 关于Redis的知识,总结了一个脑图分享给大家 1.在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚, ...

  9. 【MySQL】我这样分析MySQL中的事务,面试官对我刮目相看!!

    写在前面 相信大部分小伙伴在面试过程中,只会针对面试官提出的表面问题来进行回答.其实不然,面试官问的每一个问题都是经过深思熟虑的,面试的时间相对来说也是短暂的,面试官不可能在很短的时间内就对你非常了解 ...

  10. 关键词:ACM & 大小端 & 面试官

    关于“ACM” fender0107401 :面试了一个在ACM拿过奖的人 我问了他几个问题: 读取数组中的一个元素,计算复杂度是多少,回答不清楚. 往链表里面存一个数,不排序的情况下,计算复杂度是多 ...

随机推荐

  1. 开源 - Ideal库 - Excel帮助类,ExcelHelper实现(四)

    书接上回,前面章节已经实现Excel帮助类的第一步TableHeper的对象集合与DataTable相互转换功能,今天实现进入其第二步的核心功能ExcelHelper实现. 01.接口设计 下面我们根 ...

  2. solon 集成 kafka-clients

    使用 kafka-clients 原本是比较简单的事情.但有些同学习惯了 spring-kafka 后,对原始 java 接口会陌生些.会希望有个集成的示例. <dependency> & ...

  3. Sealos Devbox 基础教程:使用 Cursor 从零开发一个完整的项目

    作者:熊猫Jay,上市公司技术负责人,破局AI 提示词.AI编程教练.通往AGI之路内容共创者 最近发现身边越来越多人尝试用 Cursor 写代码.开发小产品了. 如果想要实现商业化或引流,我们的小工 ...

  4. Net中RabbitMq.Client7.0通过依赖注入DI来管理RabbitMQ客户端的生命周期

    在 RabbitMQ.Client 7.0.0 版本中, IModel 在 RabbitMQ.Client 7.0.0-alpha2 版本中已经被重命名,现在应该使用 IChannel 替代 IMod ...

  5. Acrobat Pro DC 2024.005 像word一样编辑PDF

    随着数字化的推广,PDF文件凭借其强大的优势和稳定性逐渐成为各类文档交流和存储的首选格式.随之而来的是对PDF文件的阅读.编辑.转换.转曲等各种操作需求的不断增长.因此,一款强大的PDF处理软件不仅需 ...

  6. R机器学习:特征工程与特征选择的介绍

    两个月没更新了,没有其它理由,就是懒惰,间接持续性的懒惰,一直持续了2个月,简直懒惰!!!大家的好多的私信也没回就过期回不了了.请大家批评我!!!. 看了很多高深的算法之后,实在是看不太明白,所以今天 ...

  7. Advanced .NET Remoting: 第 9 章 3.在 Remoting 中传递额外的运行时信息

    Advanced .NET Remoting:第 9 章 3.传递运行时信息 前面使用的接收器 ( Sink ) 是 IClientChannelSinks 与 IServerChannelSinks ...

  8. 【报错解决】【Python】'Failed to import pydot. You must pip install pydot and install graphviz (https://graphviz.gitlab.io/download/), ', 'for pydotprint to work.'

    可视化函数式API的形式seq2seq模型的过程中发生报错. 报错内容: 'Failed to import pydot. You must pip install pydot and install ...

  9. Qt编写地图综合应用33-雨量分布

    一.前言 雨量分布图是在区域地图基础上,针对区域中的每个最小单位区域比如县城点位不同颜色显示,最开始做这个封装的时候,并没有提供单独设置每个点颜色的接口,后面经过几个客户的强烈建议,咬咬牙把每个点都可 ...

  10. Qt编写项目作品26-一维码二维码解析及生成

    一.功能特点 支持本地USB摄像头实时解析. 支持网络视频流实时解析. 解码格式支持一维码二维码等各种编码. 可生成一维码二维码,一维码支持EAN_13格式,其他格式可定制. 条形码参数支持宽度.高度 ...