译文 | Vue 在哪些方面做的比 React 更好?

大家好,我是若川。

在过去的五年中,我一直是一名 React 工程师。我爱React。我喜欢开发 React 应用程序。我认为它是目前最好的UI框架之一。

但是,在这个领域有一些竞争对手。其中最大的是 Vue.js 。

我以前玩过一些 Vue.js,但我认为它已经过时了,因为我要深入研究 Vue.js 的工作原理,以及它如何让我的工作更简单。

在深入研究 Vue.js 文档并使用 Vue.js 之后(注意:我不是 Vue.js 专家),在有些方面 Vue.js 比 React 做的更好。

最终我希望 React 受到 Vue.js 所做的这些事情的启发,并且也开始这样做。

不同的理念

Vue.js 和 React 之间的主要区别之一是它们如何称呼自己。

React 把自己描述为 “一个用于构建用户界面的JavaScript库”,而 Vue.js 则把自己描述为“渐进式JavaScript框架”

React 是一个库,Vue.js 是一个框架。我认为这是在很多方面他们处理方式不同的原因。

从历史上看,框架在提供和要求方面更全面、更详尽,而库则更简洁、功能更少,但它们所专注的事情却做得非常好。

单个组件

Vue.js 和 React 都具有作为创建UI的构件的组件。

组件通常由3部分组成:

  • 界面(HTML

  • 行为(JavaScript

  • 外观(CSS

Vue.js 的概念是 Single File Component 是一种开箱即用的方式来编写涵盖所有3个部分的组件。

<template><p>{{ greeting }} World!</p>
</template><script>module.exports = {data() {return {greeting: 'Hello',};},};
</script><style scoped>p {font-size: 2em;text-align: center;}
</style>

你不必是 Vue.js 工程师就能理解这里发生了什么。

React 组件提供了开箱即用的 UI 和 Behavior,但是样式在很大程度上不受限制:

import React, { useState } from 'react';function Button() {const [count, setCount] = useState(0);return (<button onClick={() => setCount(count + 1)}>Current count: {count}<br />Click me</button>);
}

当然,React 有一个非常丰富的社区,因此如果你想包含样式,可以轻松获取 Emotion 或 Styled Components ,它们将填补 Style 的空缺,但是:

  • 它不是内置的

  • 你必须知道这些库存在才能使用它们。

官方支持的相关库

任何足够大且复杂的UI应用程序都需要两个附加功能来支持它们的实现:

  • 路由

  • 状态管理

Vue.js 官方支持的库分别覆盖了这两种用例,Vue Router和 Vuex

这些库在 Vue.js 文档页面中明确提到,它们是在 Vue.js 核心中开发和维护的。

它为新的 Vue.js 工程师提供了解决问题的清晰方法,并使他们相信这些库可以持久使用。

拥有第一方支持的库并不限制社区解决方案,但确实为新用户提供了入门解决方案。

风格指南

嗯,我非常希望 React 也有这个,Vue.js 的风格指南 https://v3.vuejs.org/style-guide/ 回答了新手可能遇到的许多问题。它提供了有关如何编写 适当的 和 易于访问的 Vue.js 应用程序的最佳实践和指南。

它共享了经过实战使用的经验,以及社区中的最佳实践和模式。

最重要的是:它是由 Vue.js 本身维护和支持的!

类和样式绑定

如上所述,Vue.js 内置了对样式的支持。此外,Vue.js 本质上是内置库类名的。

Classnmes 是一个很棒的库,可以方便地连接和动态构造应用于HTML元素的CSS类名。

在 React 中,你必须知道这个库的存在,然后安装它。

在 Vue.js 中,这只是另一个内置特性。

<divclass="static":class="{ active: isActive, 'text-danger': hasError }"
></div>

像这样的数据:

data() {return {isActive: true,hasError: false}
}

最终的用户界面将是:

<div class="static active"></div>

内置此功能真棒。

Vue.js 进一步支持内联样式。Vue.js 和 React 一样,都支持内联样式,但是 Vue.js 超越 React 的地方是它能够自动为需要的 CSS 加上前缀。

来自文档:

当 v-bind:style 使用需要添加浏览器引擎前缀的 CSS property 时,如 transform,Vue.js 会自动侦测并添加相应的前缀。

插槽

React 中的一切都是 prop

如果要在 React 组件中渲染多个子代,则只需添加更多 prop

function Nav({ left, right }) {return (<nav><div className="left">{left}</div><div className="right">{right}</div></nav>);
}function App() {return (<main><Nav left={<Logo />} right={<UserDropdown />} /></main>);
}

效果很好,但是有点尴尬,尤其是当 prop 内部的内容变大时。

Vue.js 通过 Slots 采用了不同的方法,我认为它的 API 更加简洁。

<!-- A Vue.js component template named "base-layout" -->
<div class="container"><header><slot name="header"></slot></header><main><slot></slot></main><footer><slot name="footer"></slot></footer>
</div><!-- When "base-layout" is used -->
<base-layout><template v-slot:header><h1>Here might be a page title</h1></template><template v-slot:default><p>A paragraph for the main content.</p><p>And another one.</p></template><template v-slot:footer><p>Here's some contact info</p></template>
</base-layout>

Vue.js 使用 Slots 清楚地指示内容在组件内部的位置。

Vue.js 反复执行的操作为常见任务提供了捷径。在这种情况下,可以使用 Slot 来简化上面的示例:

<base-layout><template #header><h1>Here might be a page title</h1></template><template #default><p>A paragraph for the main content.</p><p>And another one.</p></template><template #footer><p>Here's some contact info</p></template>
</base-layout>

指令修饰符

Vue.js 具有称为“指令修饰符”的功能,我认为它真的很酷。

在我谈论指令修饰符之前,让我快速介绍一下指令是什么。

指令 v- 是你在 Vue.js 模板中使用的“带有前缀的特殊属性”。

指令的工作是在其表达式的值发生变化时以反应方式将副作用施加到DOM

例如:

// If "seen" variable is false then this p tag is not rendered
<p v-if="seen">Now you see me</p>

有针对事件处理程序的指令:

<!-- full syntax -->
<a v-on:click="doSomething"> ... </a><!-- shorthand -->
<a @click="doSomething"> ... </a>

指令还支持修饰符。

这是使用通用指令执行通用任务的非常友好的开发人员方式。

对于事件处理程序指令(v-on),有很多修饰符:

<!-- the click event's propagation will be stopped -->
<a @click.stop="doThis"></a><!-- the submit event will no longer reload the page -->
<form @submit.prevent="onSubmit"></form><!-- modifiers can be chained -->
<a @click.stop.prevent="doThat"></a><!-- just the modifier -->
<form @submit.prevent></form>...and more!

如果你想在 React 中执行这样的操作,可以创建一个辅助函数或一个自定义组件。但与指令修饰符相比并不简洁。

我很好奇是否有人可以开发一个 Babel JSX 超集,然后可以编写如下代码:

<form onSubmit.prevent={onSubmit} />

它将转换为:

React.createElement(form, { onSubmit: preventWrapper(onSubmit) });

这不在 React 的精神范围内,但我仍然认为这是一次超级简洁的生产效率提升。

还有更多的 Vue.js 修饰符。最酷的一些是关键修饰符:

<!-- only call `submit()` when the `key` is `Enter` -->
<input @keyup.enter="submit" /><input @keyup.page-down="onPageDown" />

非常非常酷

表单输入绑定

当将数据绑定到输入元素时,v-model 指令有一个非常有趣的特性。

从文档中发现,v-model 内部使用了不同的属性,并为不同的输入元素发出了不同的事件:

  • text 和 textarea 元素使用 value 属性和 input 事件;

  • 复选框和单选按钮使用 checked 属性和 change 事件;

  • select 使用 value 用作属性和 change事件。

这样做的好处是,你不需要关心数据是如何同步的,你只需要关心它是如何为你服务的。

让我们比较一下 React 将如何进行这些绑定以及 Vue.js 如何进行绑定:

// Input// React
<input type="input" value={message} onChange={onChange} />// Vue.js
<input type="input" v-model="message" />// Checkboxes and Radiobuttons// React
<input type="checkbox" checked={message != null} onChange={onChange} />// Vue.js
<input type="checkbox" v-model="message" />// Select// React
<select value={message} onChange={onChange}><option>A</option>
</select>// Vue.js
<select v-model="message"><option>A</option>
</select>

现在,我要为 React 辩护的一点是,React 鼓励你学习数据实际上是如何设置的以及它是如何变化的。这意味着,如果你曾经用普通JS写过一个表单,你将有更多关于它如何工作的知识,并能够正确地编码它。与Vue.js不同,Vue.js只是将所有用法抽象出来。

自定义指令

像任何好的框架一样,你可以在 Vue.js 中创建自己的自定义指令。

Vue.js 确实注意到“代码重用和抽象的主要形式是组件”,但是为什么自定义指令可能会更好的最好的例子之一是它们的自定义 v-focus 指令自动将输入元素放在 mount 上:

const app = Vue.createApp({})
// Register a global custom directive called `v-focus`
app.directive('focus', {// When the bound element is mounted into the DOM...mounted(el) {// Focus the elementel.focus()}
})<input v-focus />

在 React 中,你可能会编写一个自定义组件来完成相同的事情,对于这么轻便的任务而言,这似乎有点繁重。

用 TypeScript 编写

最后但并非最不重要的一点是,最近在 TypeScript 中彻底重写了 Vue.js 。

这意味着它们的 TypeScript 支持是一流的,因为框架本身是用 TypeScript 编写的。

最终,React 用什么编写并不重要,我也不认为它有什么太大的区别,但看到 Vue.js 所拥有的仍然是一个很不错的小事情。

总结

我要放弃 React 并开始专门使用 Vue.js 吗?不。我仍然非常喜欢 React ,坦率地说,我已经非常精通编写 React 应用程序。

但是,我很希望看到 React 从 Vue.js 中汲取一些灵感,并将其中一些很棒的想法整合到 React 中。如果我只能从文中提到的几个点中选择一个,那绝对是 风格指南。我很乐意看到 React 有一个官方支持和维护的风格指南。

希望我能让你看到一些你不知道 Vue.js 做过的事情!我很惊讶地发现自己真的很喜欢 Vue.js 工作的方式!

本文授权译自:https://hswolff.com/blog/what-vuejs-does-better-than-react/

最近组建了一个江西人的前端交流群,如果你是江西人可以加我微信 ruochuan12 私信 江西 拉你进群。


推荐阅读

我在阿里招前端,该怎么帮你(可进面试群)
毕业年限不长的前端焦虑和突破方法

前端抢饭碗系列之Vue项目如何做单元测试
老姚浅谈:怎么学JavaScript?

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》多篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经写了7篇,点击查看年度总结。
同时,活跃在知乎@若川,掘金@若川。致力于分享前端开发经验,愿景:帮助5年内前端人走向前列。

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

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

相关文章

web mp4第一帧_Web成帧器就在这里!

web mp4第一帧The Framer Team is pulling up it’s pants. I sniffed something cooking when they announced a public beta for Framer for web… FRAMER FOR WEB? Yes, I don’t know how they did it, but their powerful set of tools, plugins and animation controls …

Lucene学习总结之三:Lucene的索引文件格式(2)

2019独角兽企业重金招聘Python工程师标准>>> 四、具体格式 上面曾经交代过&#xff0c;Lucene保存了从Index到Segment到Document到Field一直到Term的正向信息&#xff0c;也包括了从Term到Document映射的反向信息&#xff0c;还有其他一些Lucene特有的信息。下面对这…

JavaScript 数组 API 全解析

在编程世界中&#xff0c;数组是指元素的集合。数组将数据作为元素进行存储&#xff0c;并在需要时将其取出。在支持数组的编程语言中广泛地采用了这个数据结构。这个手册会介绍 JavaScript 数组的所有知识。你将会学到复杂数据处理、解构、常用数组方法等内容。我为什么写这篇…

美学设计评价_死亡的孩子无法使用的设计美学

美学设计评价In the popular anime series, Soul Eater, Death the Kid is a Shinigami (Japanese death god) who vanquishes evil with his dual pistols, Liz and Patty. Although he’s strikingly powerful, his battles are often hindered by his obsessive-compulsive …

【送书】2021年哪些好书值得读(小姐姐配音)

大家好&#xff0c;我是若川。记得点上面的小姐姐再次录制的配音。为感谢大家一直以来的支持和肯定。不知道是今年第几次送书了。昨天送书的音频广受好评&#xff0c;没参与的可以参与。今天联合华章图书再送文中任选一本 * 3 包邮送&#xff0c;详细规则看文末。Web开发01《斯…

Flash获取html参数的方法

一. swf?传参 html代码:代码<html><head><meta http-equiv”Content-Type” content”text/html charsetutf-8″ /><title>as</title></head><body><object classid”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ codebase”h…

方法重载_方法

方法重载Recently, I wrote an article about moving XD designs to Figma. It was a really interesting experiment and one that seemed to interest quite a lot of people.最近&#xff0c;我写了一篇有关将XD设计移至Figma的文章。 这是一个非常有趣的实验&#xff0c;似…

Node.js 框架设计及企业 Node.js 基础建设相关讨论

大家好&#xff0c;我是若川。19年我写的 lodash源码 文章投稿到海镜大神知乎专栏竟然通过了&#xff0c;后来20年海镜大神还star了我的博客&#xff0c;同时还转发了我的微博。时间真快啊。今天分享这篇Node.js的讨论。2021 年上半年早已过去&#xff0c;回顾 Node.js 在国内的…

DAS、NAS、SAN、iSCSI 存储方案概述

目前服务器所使用的专业存储方案有DAS、NAS、SAN、iSCSI几种。存储根据服务器类型可以分为&#xff1a;封闭系统的存储和开放系统的存储&#xff1a; &#xff08;1&#xff09;封闭系统主要指大型机. &#xff08;2&#xff09;开放系统指基于包括Windows、UNIX、Linux等操作系…

同态加法_同态—当旧趋势突然变酷时

同态加法Designers get excited at every year’s end to see what next year’s trend is going to be. What the future of design is going to look like. What they can carry forward to the next year; And Neumorphism was one among the lists which gained great atte…

网页标题设置,为什么在SERP中,显示结果不一致?

在网站建设与运营的过程中&#xff0c;我们经常会遇到各种各样的问题&#xff0c;特别是关于网页标题设置的问题&#xff0c;如果一个页面标题出错&#xff0c;那么&#xff0c;你整个页面建设的过程&#xff0c;就完全是事倍功半&#xff0c;得不偿失。 那么&#xff0c;网页标…

阿里专有钉钉前端面试指南

大家好&#xff0c;我是若川。今天推荐这篇掘金高赞文章&#xff0c;欢迎留言交流。经作者子奕大佬授权转载&#xff0c;原文链接&#xff1a;https://juejin.cn/post/6986436944913924103作者介绍子弈[1]&#xff0c;专有钉钉前端团队成员&#xff0c;负责专有钉钉 PC 客户端的…

安全态势感知产品对比_设计中的对比和人的感知

安全态势感知产品对比In this article, we’re going to explore the concept of contrast and its fundamental role in UX and visual design.在本文中&#xff0c;我们将探讨对比度的概念及其在UX和视觉设计中的基本作用。 Let’s start by defining what contrast is.让我…

在字节做前端一年后,有啥收获~

大家好&#xff0c;我是若川。今天分享这篇&#xff0c;相信读完会有些收获。本文经作者授权转载&#xff0c;原文链接&#xff1a;https://juejin.cn/post/6980671091526074404个人简介19年底12月进入字节实习&#xff0c; 第二年7月毕业转正。到前几天正好全职一周年。进入公…

app用户隐私协议相关法律_隐私图标和法律设计

app用户隐私协议相关法律During its 2020 Worldwide Developers Conference, Apple spent time on one of today’s hottest topics — privacy. During the past couple of years, Apple has been rolling out various public campaigns aiming to position itself as a compa…

35 点击全图后发现地图“不见了”

相信很多用ArcGIS软件作图的时候会习惯用全图按钮&#xff0c;但是有的时候工程文件是他人提供的&#xff0c;也不太清楚是怎么做的&#xff0c;一点全图&#xff0c;软件界面就一片空白&#xff0c;找数据找半天&#xff0c;很是苦恼啊 这虽然不是什么大问题&#xff0c;但还是…

成为优秀沟通者的要素_如果您想成为更好的设计师,请成为更好的沟通者

成为优秀沟通者的要素Little changes that go a long way.小变化大有帮助。 I started my career in motion design.我的职业生涯始于运动设计。 My focus was on the visual and technical skills required to make emotionally compelling work. I believed great design s…

我读源码的经历~

你好&#xff0c;我是若川。最近来了一些读者朋友&#xff0c;在这里简单介绍自己的经历&#xff0c;也许对你有些启发。可以点击 ruochuan12 加我微信进群交流。这是我的公众号卡片&#xff0c;可以加下星标。我是谁我是若川&#xff0c;毕业于江西高校&#xff0c;《面试官问…

php建一个表按删除就删除,php怎样删除数据库表_后端开发

php删除数据库表的要领&#xff1a;起首建立一个PHP示例文件&#xff1b;然后衔接mysql数据库&#xff1b;末了经由过程“DROP TABLE runoob_tbl”语句删除MySQL数据表即可。引荐&#xff1a;《PHP视频教程》php MySQL 删除数据表MySQL中删除数据表是异常轻易操纵的&#xff0c…

字节招人

大家好&#xff0c;我是若川。这应该是第五次发招聘了&#xff0c;友情帮一个朋友宣传。普通高校的很多大学生因为信息差导致慢一两年才醒悟过来&#xff0c;原来大三就有校招了。如果能早些知道早做准备&#xff0c;结果可能会更好。而知名高校&#xff0c;身边很大学长学姐进…