溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Vue和React的比較

發(fā)布時間:2021-07-20 17:41:49 來源:億速云 閱讀:135 作者:chen 欄目:web開發(fā)

這篇文章主要講解了“Vue和React的比較”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Vue和React的比較”吧!

在過去的 5 年中,我一直是一名 React 工程師。我愛 React,我愛開發(fā) React 應(yīng)用。我認(rèn)為它是現(xiàn)存最好的 UI 框架之一。

然而,React 在這個領(lǐng)域中有一些競爭對手,其中最大的就是 Vue.js。

我曾玩過一陣 Vue.js,但我認(rèn)為那時的經(jīng)驗已經(jīng)過時了。因為我將要深入研究 Vue.js 的工作原理以及了解它是如何讓我的工作變得更簡單。

在深入研究 Vue.js 文檔并使用之后(注意:我絕對不是 Vue.js 的專家),我驚奇地發(fā)現(xiàn)有些方面 Vue.js 甚至比 React 做得更好。

最后,我希望 React 能受到 Vue.js 的啟發(fā)并且也開始這么做。

1、不同的理念

Vue.js 和 React 之間的一個主要區(qū)別是它們對自己的定位不同。

從它們官網(wǎng)直觀來看,React 把自己描述為 “一個用于構(gòu)建用戶界面的 JavaScript 庫”,而 Vue.js 則把自己描述為“漸進式 JavaScript 框架”。

React 是一個庫,而 Vue.js 是一個框架。我認(rèn)為從很多方面來說,這是導(dǎo)致這些 UI 框架在執(zhí)行方式上有所不同的根本原因。

我想強調(diào)這一點,以便您在閱讀本文時隨時牢記這一點。 從歷史上看,庫和框架都專注于讓它們的工作表現(xiàn)得更出色,但框架的要求和提供的能力更全面詳盡,而庫則更少更輕量。

2、單文件組件

Vue 和 React 都有用來創(chuàng)建 UI 的組件。

組件通常由 3 部分組成:

  •  UI (HTML)

  •  行為 (JavaScript)

  •  外觀 (CSS)

Vue.js 的理念是使用單文件組件,用一種開箱即用的方式來編寫涵蓋所有 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 和 行為部分,但是樣式在很大程度上不受限制:

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>    );  }

當(dāng)然了,React 有一個非?;钴S的社區(qū),所以如果你想包含樣式,可以輕松使用 Emotion 或 Styled Components 來填補樣式的空缺,但是:

  •  它們是非內(nèi)置的;

  •  你必須知道這些庫才能使用他們。

這正好與默認(rèn)提供了這些的 Vue.js 相反。

3、官方支持的相關(guān)庫

任何足夠大且復(fù)雜的 UI 應(yīng)用都需要兩個附加功能的支持:

  •  路由

  •  狀態(tài)管理

Vue.js 官方支持的庫分別覆蓋了這兩個場景: Vue Router 和 Vuex 。

這些庫明確地在 Vue.js 文檔中提及,并且由 Vue.js 核心組開發(fā)和維護。這太神奇了。

它為剛使用 Vue.js 的工程師提供了解決問題的明確方法,并讓他們相信這些庫是長期維護的。

擁有第一方支持的庫并不會限制社區(qū)解決方案,但確實為新用戶提供了入門解決方案

4、風(fēng)格指南

嗯,我非常希望 React 也有風(fēng)格指南,在閱讀本節(jié)之前,請單擊鏈接并瀏覽Vue.js的樣式指南。

它回答了很多 Vue.js 新手可能遇到的問題,并提供了如何編寫 “適當(dāng)?shù)摹?和易于訪問的 Vue.js 的最佳實戰(zhàn)。

它分享了經(jīng)過實戰(zhàn)檢驗的以及社區(qū)中的最佳實踐和模式。

最重要的是:它是由 Vue.js 官方維護和支持的!這太棒了!

5、類和樣式綁定

如上所述,Vue.js 內(nèi)置了對樣式的支持。此外,Vue.js 本質(zhì)上是內(nèi)置 classNames 的。

Classnmes 是一個很棒的庫,可以方便地連接和動態(tài)構(gòu)造應(yīng)用于 HTML 元素的 CSS 類名。

而在 React 中,你需要知道這個庫,然后安裝它。

在 Vue.js 中,這只是另一個內(nèi)置特性:參考文檔:

Vue.js 模板:

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

data 內(nèi)容:

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

渲染出的 UI:

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

有這個內(nèi)置項真好。

Vue.js 進一步支持內(nèi)聯(lián)樣式。Vue.js 和 React 一樣,都支持內(nèi)聯(lián)樣式,但是 Vue.js 比 React 更棒的地方就是它能夠自動為需要的 CSS 加上前綴。

參考文檔:

當(dāng)使用 :style 時,需要添加瀏覽器引擎前綴的 CSS 屬性,拿 transform 舉例,Vue.js 會自動偵測并添加相應(yīng)的前綴。

真正顯示框架控制自己的模板語法的優(yōu)勢。

6、插槽

React 中一切都是 prop。

如果要在 React 組件中渲染多個子節(jié)點,只需添加多個 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>    );  }

但如果內(nèi)部內(nèi)容邊龐大之后,雖然能很好運行,但有一點尷尬。

Vue.js 采用了插槽的方法,我認(rèn)為它的 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>      <h2>Here might be a page title</h2>    </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 使用插槽(受Web Component 規(guī)則草案的啟發(fā))清楚地指明內(nèi)容在組件內(nèi)部的位置。

Vue.js 為反復(fù)執(zhí)行的任務(wù)提供了捷徑。在這種情況下,可以使用插槽來簡化上面的示例:

<base-layout>    <template #header>      <h2>Here might be a page title</h2>    </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>

7、指令修飾符

我認(rèn)為 Vue.js 指令修飾符的功能真的很酷。

在討論指令修飾符之前,讓我快速介紹一下指令是什么。

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

指令的作用是在表達式的值發(fā)生變化時以響應(yīng)地方式將副作用施加到 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>

還有其他更多的指令。

指令還支持修飾符。

使用通用指令執(zhí)行通用操作很開發(fā)友好。

對于事件處理指令(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 中執(zhí)行這樣的操作,可以創(chuàng)建一個輔助函數(shù)或一個自定義組件。但與指令修飾符地方式相比并不簡潔。

我很好奇是否有人可以開發(fā)一個 Babel JSX 超集,然后就可以編寫如下代碼了:

<form onSubmit.prevent={onSubmit} />

它將轉(zhuǎn)換為:

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

這不在 React 的討論范圍內(nèi),但我仍然認(rèn)為這會是一次生產(chǎn)效率地大提升。

還有更多的 Vue.js 修飾符。比如按鍵修飾符:

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

太酷了。

8、表單輸入綁定

當(dāng)將數(shù)據(jù)綁定到輸入元素時,v-model 指令會有非常有趣的特性。

從文檔中發(fā)現(xiàn),v-model 內(nèi)部使用了不同的屬性,并為不同的輸入元素發(fā)出不同的事件:

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

  •  復(fù)選框和單選按鈕使用 checked 屬性和 change 事件;

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

這樣做的好處是,您無需關(guān)心數(shù)據(jù)是如何同步的,您只需關(guān)心它是如何為你服務(wù)的。

讓我們比較一下 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>

發(fā)現(xiàn)其中的不同了嗎?

現(xiàn)在,我要為 React 辯護了,React 鼓勵(并要求)您學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)實際是如何設(shè)置以及它是如何變化的。這意味著,如果您曾經(jīng)用普通 JS 寫過一個表單,您將更了解其運行原理。 與 Vue.js 不同,后者幫您把這些特性都抽象出來了。

9、自定義指令

像任何好的框架一樣,您可以在 Vue.js 中創(chuàng)建自己的自定義指令。

Vue.js 確實關(guān)注“代碼重用和抽象的主要形式是組件”,但這里有一個使用自定義指令不錯的例子,通過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 element      el.focus()    }  })  <input v-focus />

在 React 中,你可能會編寫一個自定義組件來完成相同的事情,但對于這種簡單任務(wù)而言有些重

10、用 TypeScript 編寫

最后,Vue.js 最近正在用 TypeScript 重寫。

這意味著它們對 TypeScript 支持都是一流的,因為框架本身是就是用 TypeScript 編寫的。

其實 React 用什么編寫并不重要,我也不認(rèn)為它有什么太大的區(qū)別,但看到 Vue.js 也用 TypeScript 編寫仍然是一件很不錯事。

感謝各位的閱讀,以上就是“Vue和React的比較”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Vue和React的比較這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI