【译】Vue 何以对 React“降维打击”?

大家好,这里是大家的林语冰。

免责声明

本文属于是语冰的直男翻译了属于是,仅供粉丝参考,英文原味版请临幸 Why I chose Vue over React

引言

JS(JavaScript)生态系统的现状可不是开玩笑的 ------ 有一大坨东东:一龙一猪的库、框架以自己的方式实现一毛一样的东东。

我的个人心证是,这有好有坏 ------ 存在一大坨选择,虽然但是,对于新手攻城狮而言,这可能导致"选择困难症晚期",因为新手往往黑白不分。当然啦,人气即正义 ------ 但祂们都人气爆棚。

私以为在这场"诸神之战"中,有两位高手独领风骚:React 和 Vue。一大坨道友在辩论其中之一是否更好,本文试图以我的知行合一为指导来揭晓此话题。

我的开端

我从 React 初出茅庐,当时知识有限,只完成了若干关于 HTML、CSS 和 JS 的必修课。由于 React 当时人气最高,私以为这是进军前端领域的必由之路。

我一头扎入才刚刚发布 app 路由器的 Next.js,开始啃文档并 DIY 我的"处女作"。那是一个致力于分享梦想的留言板 ------ 如果您可以 get 到我的意思,我勉强算卡尔·荣格的粉丝。

完成该项目我感觉自己棒棒哒 ------ 祂有授权、个人资料页面、表格和若干动画的优秀实践。如果您想查作业,这里是 任意门(现在有且仅有登陆和表格正常开工)。

虽然我已经用 React 达到预期目标,但我仍然在寻找更多的机会 ------ 那就是我发现 Vue.js 的地方。祂已经处于成熟阶段,已经完成了向组合式 API 的过渡,看起来几乎和 React 一模一样。

起初,该文档吓尿我了,但多瞄了几眼后,我就坠入爱河无法自拔,现在我当然可以说祂是我最喜欢的现代 Web 框架(没有之一)。

学习曲线

那时,我还没有真正接触过 React 的文档,而 Vue 文档是我阅读由创建者自己编写、而不是某些内容制造商编写的任何类型教程的开端。

时至今日,如果您瞄一眼已经十分成熟的 React 文档升级版,私以为就学习而言 Vue 还是更加优秀。优点如下:

  1. 能解答一切的文档 ------ React 的某些关键点和隐藏行为没有妥善归档,因为该文档有且仅有涵盖库的基本功能 ------ 因此,每个 React 开发人员都必须知道与现代趋势同步的奇技淫巧。
  2. 官方学习课程 ------ Vueschool.ioVuemastery.com 是学习 Vue 的美妙开局,而 React 有若干材料,其中大部分可能已经过时了。
  3. 开发者友好的 API ------ 于我而言,Vue 拥有更好且差异化的工具池,您可以用祂们开发 app。从第 1 页开始,祂们有很好的说明,并且比 React 更能为所欲为地控制您的 app。除此之外,文档中没有提到太多新手不友好的隐藏内容(渲染周期、useEffect)

当然啦,学习 React 对我后来学习 Vue 帮助很大 ------ 在您打下坚实的基础并至少对一个框架有一定了解之后,您就能更快地驯服其他框架。

但即便如此,我还是会向每个新手推荐 Vue,因为就开发而言祂比 React 更宽容,而且很难搬起石头砸到自己的猫。

更好的装备

如上所述,Vue 固有的 API 比 React 更棒。此说法的几个关键点:

没有 useEffect

这意味着您不需要处理"弗兰肯斯坦(缝合怪)式"缺点,这些缺点是被那些无视 SOLID 的单一责任原则的人使用的。在 React 中,useEffect 是一把双刃剑 ------ 组件生命周期的守护者和副作用的提供者。

这段代码的作用是什么?effect(作用)!

而这段代码?effect 返回?.....

返回数组?!

当您可以拥有一个具有无限用例的愚蠢抽象时,为什么要保留所有这些 onMounted / onUnmounted / onBeforeMount / onRouteChange / watch?只想在组件挂载时触发某些东东?提供一个空数组!为什么?因为抽象!

是的,大多数 React 爱好者可能都知道某些约定,但为什么不将祂们引入库本身并获得更好的体验呢?Hook yourself.

双向数据绑定

React 使用 Flux 架构,简而言之,这意味着数据能且仅能单向流动。这样做易于跟踪数据变化的地方,因为只有单一数据源。虽然 Vue 几乎相同 ------ 但祂有祂的好处。

首先是输入绑定。使用 React,您需要编写如下内容来将输入值绑定到组件的状态:

这适用于每个输入组件。Vue 的等价功能是这样:

是的,您可以在 React 中编写一个自定义 hook 来处理所有同款功能,而不是在所有输入组件中重写它......但是何必呢?

其次是父子组件间的双向绑定,这意味着您可以通过 props 和父组件的数据通信,并通过 emits 从子组件回答父组件。在 React 中,为了处理子组件的某些数据,您可以这样写:

Vue 的等价功能类似:

哪种语法更好?假设我们 React 中有一个附带大约 20 个 props 的组件(这是一种极端情况,因为这是小概率事件,但不是不可能事件)。该组件的 props 接口类似于:

是的,您可以理解函数绑定从 on 开始,但为什么呢?没有传递给组件的函数是什么?祂会使您的 app 崩溃。在 Vue 中,这些东东会用 @ 符号来区分,并且其他每个开发者都会更好地理解到底发生了什么事。

编译器,而不是库

Vue 的另一个好处是祂为 .vue 文件提供了编译器,而不是使用纯粹的 JS 表达式。乍一听可能既变态又复杂 ------ 但在您深入了解 React jsx 的变态和我下面将提到的其他事情之后,您就会明白我的观点了。

jsx 加入 React 时,有些人有点反感,某种程度上祂们是对的。经典的网页设计考虑了 3 个核心部分 ------ HTML、CSS 和 JS。祂们旨在通过文件扩展名进行区分,并且关注点分离应该奏效。

虽然但是,现实世界中存在一大坨可复用逻辑,并且由于基于组件方法来创建界面的起源,私以为将祂们组合在一起是一个不错的决定,因为在三个文件之间切换(你好,Angular!)肯定不是一个好的体验。

但是 React 所做的 ------ Vue 做得更好,原因如下:

  1. 不需要 CSS 文件 ------ Vue 有一个 scoped 样式区块,您可以简单地设置所有样式。如果您不愿意,祂们不会在其他组件间共享。这样一来,React 的每个 CSS-in-JS 库就变得过时了,您不需要只为了能够编写十行代码,过度设计和创建一大坨 css modules。此外,如果您想避免使用 Tailwind,您不会被迫使用(˵ ͡° ͜ʖ ͡°˵)
  2. 更好的约定 ------ 没有 jsx,因此您不会迷路。想要让 html 标签触发某些事件(点击、选择.....)?只需添加 @ 并处理它:

想要设置 innerHtml?别担心,您不需要记住这一点:

只需要:

写太多也很危险,懂不?

需要一大坨 classNames 吗?连接字符串!

想要另辟蹊径?使用 !(当然了,祂的大小低于 1 kb,但祂仍是一个外部依赖)

  1. 属性继承的处理要好得多。举个栗子,在 React 中,要将 className 传递给将来可能是动态的 UI 组件,您需要将其写在 props 中,然后将其传入组件的根 HTML 标签:

Vue 的等价功能就只需:

无需说明该组件需要占用祂。

是的,这褒贬不一,但如果您认为这是 React 更好的原因 ------ 您似乎没有为每个组件编写 prop,这些组件会有一种极端情况,祂需要一个不应该成为其主题一部分的边界。

您也可以认为有时您不需要将属性直接传递给根标签 ------ 而 Vue 为您提供了一个解决方案:

  1. 插槽更棒

要在 React 中将某些模板传递给子组件,您应该在组件的 props 中定义 children 属性,然后使用 jsx 大括号来渲染它:

而在 Vue 中,不仅更容易做到这一点,而且提供了更好的自由度来制作动态组件:

a. 您可以只留下 <slot/> 标签来处理 children 而不是 children:

b. 您可以有多个具名插槽:

c. 插槽可以会向父组件公开数据:

这对于孵化和其他组件梦幻联动的可复用组件非常有用(举个栗子,封装库的组件(走马灯等等......))

渲染由我

当 React 横空出世时,这是一个启示。在当时占主导地位的技术中,您必须自己编写所有重新渲染逻辑 ------ 这就出现了一个可以刷掉其他所有内容的绝对解决方案, ------ 只需重新渲染所有内容即可!

虽然祂解决了某些问题并使开发者的生活更轻松 ------ 但它必有其缺陷。与其试图追赶重新渲染,不如确保您没有重新渲染。

memo 我的屁股!祂在过去效果很好,但我们,尤其是那些刚开始写代码的人,真的不需要步人后尘。

我并不是说您不应该掌握渲染周期并了解祂幕后的工作机制,但是当某些更新更好的技术能为您做到这点时,为什么每个人还需要亦步亦趋?

尽管 Vue 的渲染机制仍然依赖于类似 React 的虚拟 DOM(尤雨溪说将在 2024 年推出新的东东),但与炫酷的 Svelte 和 Solid 不同,祂仍然比 React 好得多,因为祂不是愚蠢地重新渲染所有内容,而是做了其他事情。

编译时,Vue 会跟踪每个需要更新的 DOM 节点,当其依赖发生变化时像外科手术一样精准更新祂。没有 useMemo / useCallback 以及过多响应性过时技术导致的性能瓶颈。

在 Vue 中,您宁愿找到一种方法来重新渲染你的组件,来规避此行为,私以为这比处理作者创建的某些不变的极端情况要好得多。

内置

至于某些非常适合包含在 UI 渲染解决方案中的工具,比如 React 和 Vue,Vue 也占了上风。当我想再次尝试 React 时,有时我邂逅了某个需求,需要使用 Vue 提供的开箱即用的 诸如 Transition 组件的东东。有了祂,您可以处理正在重新渲染的组件的动画。至于每个问题,React 确实为我的情况提供了一个 解决方案库。就这样,我感动得泪中带血,我开始泣不成声,我很抱歉,所以我只用纯粹的 css 处理动画。看啊:

您可能理解了祂的作用。

React 的等价功能是这样:

想要保持组件缓存,以便祂记住之前的数据并保持更好的性能?您得安装一个库!

而在 Vue 中:

React 想出了 Suspense ------ 我很乐意!package.json 对于其中三者而言还不够大。

完结撒花

想到这篇文章,我得出了一个结论,私以为在这场框架之间的战争中最好的是 ------ 您可以为所欲为,只是殊途同归。

如果您了解某件事的基础知识,您就会冷静看待您邂逅的每个库和框架。如果您只想盯着抽象层并比较祂们 ------ 您必败无疑。

虽然但是,在选择要使用的工具时,我想在得出结论之前最好先尝试一下。

于我而言,React 感觉就像一个有技巧的老战士,但年龄越来越大,而某些新的年轻人身体状况良好,祂们没有被祂们的黑历史所束缚 ------ 祂们正在另辟蹊径。

除此之外,这位老战士是由一个组织委托的,而年轻人是大家的英雄,祂们试图在阳光下赢得自己的位置,并将一大坨人民与祂们的战斗联系起来(我的意思是,Vue 是真正的开源,没有像 Meta 这样的东东背书)。

祂们每个人都屡战屡胜,老人拥有积年累月的庞大粉丝群,而 youngun 的粉丝则尖叫着永远支持祂。

如果没有 React,很可能就不会有这种 Vue,但如果没有 Vue 和其他框架,比如 Svelte 和 Solid,就会停滞不前。

您现在收看的是直男翻译系列,学废了的小伙伴可以点赞友情赞助本系列,我们每天佛系投稿,欢迎关注和订阅最新动态。谢谢大家的彼芯,掰掰~

相关推荐
一只小阿乐22 分钟前
前端web端项目运行的时候没有ip访问地址
vue.js·vue·vue3·web端
计算机学姐1 小时前
基于python+django+vue的旅游网站系统
开发语言·vue.js·python·mysql·django·旅游·web3.py
.ccl1 小时前
web开发 之 HTML、CSS、JavaScript、以及JavaScript的高级框架Vue(学习版2)
前端·javascript·vue.js
小徐不会写代码1 小时前
vue 实现tab菜单切换
前端·javascript·vue.js
2301_765347541 小时前
Vue3 Day7-全局组件、指令以及pinia
前端·javascript·vue.js
辛-夷2 小时前
VUE面试题(单页应用及其首屏加载速度慢的问题)
前端·javascript·vue.js
刘志辉3 小时前
vue传参方法
android·vue.js·flutter
dream_ready4 小时前
linux安装nginx+前端部署vue项目(实际测试react项目也可以)
前端·javascript·vue.js·nginx·react·html5
编写美好前程4 小时前
ruoyi-vue若依前端是如何防止接口重复请求
前端·javascript·vue.js
喵喵酱仔__4 小时前
阻止冒泡事件
前端·javascript·vue.js