搜尋
首頁web前端js教程vue 與 react 差別有多大

vue 與 react 差別有多大

Jan 21, 2019 am 11:52 AM

Vue和React存在著較大的區別,例如在添加、刪除和更改資料、以prop形式從父組件到子組件傳遞資料、以及透過事件監聽器的形式將資料從子組件發送到父元件的實作方法都存在較大差異。

vue 與 react 差別有多大

本文操作環境:Windows7系統、Dell G3電腦、react17.0.1&&vue2.0版。

Vue 和React存在著較大的區別,例在添加、刪除和更改數據,以prop 形式從父組件到子組件傳遞數據,以及透過事件監聽器的形式將數據從子組件發送到父元件的實作方法中都存在較大差異

對於Vue 和React框架想必大家都不陌生,這兩個都是目前非常有名的前端框架。但是對於它們二者之間的區別,很多人還不是太了解,今天將為大家詳細介紹這兩者之間的區別,希望可以幫助大家更好地理解它們兩者之間的差異。

1. 目標

建立一個標準的待辦事項應用程式,用來允許使用者新增和刪除清單中的項目。這兩個應用程式都使用預設的CLI(command-line interface,命令列介面) 構建,React 使用create-react-app,Vue 使用vue-cli

兩個應用程式的外觀如下: 

vue 與 react 差別有多大

兩個應用程式的CSS 程式碼幾乎一樣,但這些程式碼的位置有差異,如下圖所示:

vue 與 react 差別有多大

從圖中可以看出它們的結構幾乎完全相同。唯一的區別在於 React App 有三個 CSS 文件,而 Vue App 中沒有 CSS 文件。這是因為 

React的 create-react-app 元件需要一個附帶檔案來保存其樣式,而 Vue CLI 採用全包方法,其樣式在實際元件檔案中宣告。

兩種不同的策略所得到的結果是一樣的,相信開發者很快就能夠掌握這兩種不同的策略。開發者可以根據自己的偏好做出選擇,你會聽到開發

社群關於如何建立 CSS 的大量討論。以上,我們遵循兩個 CLI 列出了程式碼結構。

在我們進一步討論之前,先快速看一下典型的Vue 和React 元件的外觀:

vue 與 react 差別有多大

##【推薦課程: React教學Vue.js教學

#現在開始,讓我們深入探究其中的細節!

2. 如何修改資料

修改資料就是把已經儲存好的資料變更。在這一點上,React 和 Vue 的處理方式有所區別。 Vue 本質上會建立一個資料對象,其中的資料可以自由更改;React 則建立一個狀態對象,而更改資料需要一些額外的操作。 React 之所以需要額外的操作有著自己的理由,稍後我會深入介紹。在此之前,我們先來看看Vue 中的資料物件和React 中的狀態物件: 

Vue 資料物件

vue 與 react 差別有多大

React 狀態物件


vue 與 react 差別有多大

從圖中可以看出,我們傳入了相同的數據,但它們的標記方法不同。因此,將初始資料傳遞到組件的方式非常相似。但正如我們所提到的那樣,在兩個框架中更改資料的方式有所不同。

範例:我們要修改一個名為 name: ‘Sunil’ 的資料元素

#在 Vue 中,我們透過呼叫 this.name 來引用它。我們也可以透過呼叫 this.name ='John' 來更新它。這樣一來,名字就成功改為了 「Jhon」。

在 React 中,我們透過呼叫 this.state.name 來引用同一段資料。現在關鍵的差異在於,我們不能簡單地寫成 this.state.name='John',因為 React 有限制機制,它會阻止這種簡單的修改方式。在 React 中,我們需要這樣寫:this.setState({name:'John'})。

雖然與 Vue 中實現的結果一樣,但是 React 的操作更為繁瑣。原因在於Vue 在每次更新資料時預設組合了自己的 setState 版本。而React 需要 setState,然後再更新其內部資料。

現在我們知道如何更改資料了,接下來看看如何在待辦事項應用程式中新增新的事項。

3. 新增新的待辦事項#

React 的實作方法

createNewToDoItem = () => {
    this.setState( ({ list, todo }) => ({
      list: [
          ...list,
        {
          todo
        }
      ],
      todo: ''
    })
  );
};

在 React 中,我們的輸入欄位有一個名為 value 的屬性。這個 value 透過使用幾個函數自動更新,這些函數綁定在一起以創建雙向綁定。我們透過在輸入欄位上附加一個 onChange 事件監聽器來創建這種形式的雙向綁定。如下所示:

<input type="text" 
       value={this.state.todo} 
       onChange={this.handleInput}/>

只要輸入欄位的值發生更改,handleInput 函數就會運行。它透過將狀態物件設定為輸入欄位中的任何內容來更新狀態物件內的 todo。 handleInput 函數如下:

handleInput = e => {
  this.setState({
    todo: e.target.value
  });
};

現在,只要使用者按下頁面上的 按鈕新增項目,createNewToDoItem 函數就會執行 this.setState 並向其傳遞一個函數。此函數有兩個參數,第一個是來自狀態物件的整個列表數組,第二個是由 handleInput 函數更新的todo。然後函數傳回一個新對象,該對象包含先前的整個列表,並在其末尾添加todo。整個清單是透過使用擴充運算子來新增的。

最後,我們將 todo 設為空字串,它會自動更新輸入欄位中的 value。

Vue 的實作方法

createNewToDoItem() {
    this.list.push(
        {
            &#39;todo&#39;: this.todo
        }
    );
    this.todo = &#39;&#39;;
}

在 Vue 中,我們的輸入欄位中有一個名為 v-model 的句柄。這實現了**雙向綁定。輸入欄位代碼如下:

<input type="text" v-model="todo"/>

V-Model 將輸入欄位的內容綁定到名為 toDoItem 的資料物件的鍵(key)上。當頁面載入時,我們將 toDoItem 設為空字串,例如:todo:' '。如果已經存在數據,例如 todo:'添加文本處',輸入字段將加載添加文本處的輸入內容。無論如何,將其作為空字串,我們在輸入欄位中鍵入的任何文字都會綁定到 todo。這實際上是雙向綁定(輸入欄位可以更新資料對象,資料對象可以更新輸入欄位)。

因此,回顧前面的 createNewToDoItem() 程式碼區塊,我們將 todo 的內容存放到清單陣列中 ,然後將 todo 改為空字串。

4. 刪除待辦事項

React 的實作方法

deleteItem = indexToDelete => {
    this.setState(({ list }) => ({
      list: list.filter((toDo, index) => index !== indexToDelete)
    }));
};

儘管deleteItem 函數位於 ToDo.js 檔案中,但是從 ToDoItem.js 檔案中引用它也很容易,將 deleteItem() 函數作為 上的prop 傳遞:

<ToDoItem deleteItem={this.deleteItem.bind(this, key)}/>

這會將該函數傳遞給子元件,使其可以存取。我們綁定了 this 並傳遞 key 參數,當使用者點選刪除項目時,函數透過 key 區分使用者點選的是哪一條 ToDoItem 。然後,在ToDoItem 元件內部,我們執行以下操作:

<div className=”ToDoItem-Delete” onClick={this.props.deleteItem}>-</div>

想要引用位於父元件內部的函數,只要引用 this.props.deleteItem 即可。

Vue 的實作方法

onDeleteItem(todo){
  this.list = this.list.filter(item => item !== todo);
}

Vue 的實作方法稍有不同,我們需要做到以下三點:

Step 1 :首先,在元素上呼叫函數:

<div class=”ToDoItem-Delete” @click=”deleteItem(todo)”>-</div>

Step 2:然後我們必須建立emit 函數,將其作為子元件的內部方法(在本例中為ToDoItem.vue),如下所示:

deleteItem(todo) {
    this.$emit(&#39;delete&#39;, todo)
}

Step 3:之後,你會發現,當我們加入 ToDo.vue的 ToDoItem.vue 時,實際上引用了一個函數:

<ToDoItem v-for="todo in list" 
          :todo="todo" 
          @delete="onDeleteItem" // <-- this :)
          :key="todo.id" />

這就是所謂的自訂事件監聽器。它會監聽任何使用 'delete' 字串的觸發事件。一旦監聽到事件,它會觸發一個名為 onDeleteItem 的函數。此函數位於 ToDo.vue 內部,而非 ToDoItem.vue。如前所述,該函數只是過濾資料物件內的 todo 數組 ,以刪除被點擊的待辦事項。

在Vue 範例中也需要注意的是,我們可以在 @click 偵聽器中寫 $emit 部分,這樣更簡單,如下所示:

 <div class=”ToDoItem-Delete” @click=”$emit(‘delete’, todo)”>-</div>

如果你喜歡,這樣做可以把3 步減少到2 步。

React 中的子元件可以透過 this.props 存取父函數,而在 Vue 中,你需要從子元件中發出事件,父元件來收集事件。

5. 如何傳遞事件監聽器

#React 的實作方法

事件監聽器處理簡單事件(例如點擊)非常直接。我們為待辦事項建立了點擊事件,用於建立新的待辦事項,程式碼如下: 

<div className=”ToDo-Add” onClick={this.createNewToDoItem}>+</div>

非常簡單,就像使用 vanilla JS 處理內聯 onClick 一樣。如前文所述,只要按下回車按鈕,設定事件監聽器就需要花費更長的時間。這需要輸入標籤處理onKeyPress 事件,程式碼如下:

<input type=”text” onKeyPress={this.handleKeyPress}/>

該函數只要辨識到'enter'鍵被按下,它就會觸發**createNewToDoItem** 函數,程式碼如下所示:

handleKeyPress = (e) => {
if (e.key === ‘Enter’) {
this.createNewToDoItem();
}
};

Vue 的實作方法

Vue 的事件監聽器更直接。我們只需要使用一個簡單的 @ 符號,就可以建立我們想要的事件監聽器。例如,想要新增 click 事件監聽器,程式碼:

<div class=”ToDo-Add” @click=”createNewToDoItem()”>+</div>

注意:@click 实际上是 v-on:click 的简写。Vue 事件监听器很强大,你可以为其选择属性,例如 .once 可以防止事件监听器被多次触发。此外,它还包含很多快捷方式。按下回车按钮时,React 就需要花费更长的时间来创建事件监听器,从而创建新的 ToDo 项目。在 Vue,代码如下:

<input type=”text” v-on:keyup.enter=”createNewToDoItem”/>

6. 如何将数据传递给子组件

React 的实现方法

在 React 中,我们将 props 传递到子组件的创建处。比如:

<ToDoItem key={key} item={todo} />

此处我们向 ToDoItem 组件传递了两个 prop。之后,我们可以在子组件中通过 this.props 引用它们

因此,想要访问 item.todo prop,我们只需调用this.props.item 。

Vue 的实现方法

在 Vue 中,我们将 props 传递到子组件创建处的方式如下:

<ToDoItem v-for="todo in list" 
            :todo="todo"
            :key="todo.id"
            @delete="onDeleteItem" />

我们将它们传递给子组件中的 props 数组,如:props:['id','todo']。然后可以在子组件中通过名字引用它们。

7. 如何将数据发送回父组件

React 的实现方法

我们首先将函数传递给子组件,方法是在我们调用子组件时将其引用为 prop。

然后我们通过引用 this.props.whateverTheFunctionIsCalled,为子组件添加调用函数,例如 onClick。然后,这将触发父组件中的函

数。删除待办事项一节中详细介绍了整个过程。

Vue 的实现方法

在子组件中我们只需编写一个函数,将一个值发送回父函数。在父组件中编写一个函数来监听子组件何时发出该值的事件,监听到事件之后触发函数调用。同样,删除待办事项一节中详细介绍了整个过程。

8. 总结

通过介绍了如何添加、删除和更改数据,以 prop 形式从父组件到子组件传递数据,以及通过事件监听器的形式将数据从子组件发送到父组件等方法来理解React 和 Vue 之间的差异,希望通过本文的内容有助于大家理解这两个框架

以上是vue 與 react 差別有多大的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

JavaScript是用C編寫的嗎?檢查證據JavaScript是用C編寫的嗎?檢查證據Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript的角色:使網絡交互和動態JavaScript的角色:使網絡交互和動態Apr 24, 2025 am 12:12 AM

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

從網站到應用程序:JavaScript的不同應用從網站到應用程序:JavaScript的不同應用Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python vs. JavaScript:比較用例和應用程序Python vs. JavaScript:比較用例和應用程序Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器