vue與react的區(qū)別是什么?相信有很多人都不太了解,今天小編為了讓大家更加了解vue與react的區(qū)別,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。
堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都發(fā)電機(jī)租賃小微創(chuàng)業(yè)公司專業(yè)提供成都定制網(wǎng)頁設(shè)計營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。Vue 和 React存在著較大的區(qū)別,例在添加、刪除和更改數(shù)據(jù),以 prop 形式從父組件到子組件傳遞數(shù)據(jù),以及通過事件監(jiān)聽器的形式將數(shù)據(jù)從子組件發(fā)送到父組件的實(shí)現(xiàn)方法中都存在較大差異
對于Vue 和 React框架想必大家都不陌生 ,這兩個都是目前非常有名的前端框架。但是對于它們二者之間的區(qū)別,很多人還不是太了解,今天將為大家詳細(xì)介紹這兩者之間的區(qū)別,希望可以幫助大家更好地理解它們兩者之間的差異。
1. 目標(biāo)
構(gòu)建一個標(biāo)準(zhǔn)的待辦事項應(yīng)用程序,用來允許用戶添加和刪除列表中的項目。這兩個應(yīng)用程序都使用默認(rèn)的 CLI(command-line interface,命令行界面) 構(gòu)建,React 使用 create-react-app,Vue 使用 vue-cli
兩個應(yīng)用程序的外觀如下:
兩個應(yīng)用程序的 CSS 代碼幾乎一樣,但這些代碼的位置存在差異,如下圖所示:
從圖中可以看出它們的結(jié)構(gòu)幾乎完全相同。唯一的區(qū)別在于 React App 擁有三個 CSS 文件,而 Vue App 中沒有 CSS 文件。這是因?yàn)?/p>
React的 create-react-app 組件需要一個附帶文件來保存其樣式,而 Vue CLI 采用全包方法,其樣式在實(shí)際組件文件中聲明。
兩種不同的策略得到的結(jié)果是一樣的,相信開發(fā)者很快能夠掌握這兩種不同的策略。開發(fā)者可以根據(jù)自己的偏好做出選擇,你會聽到開發(fā)
社區(qū)關(guān)于如何構(gòu)建 CSS 的大量討論。以上,我們遵循兩個 CLI 列出了代碼結(jié)構(gòu)。
在我們進(jìn)一步討論之前,先快速看一下典型的 Vue 和 React 組件的外觀:
現(xiàn)在開始,讓我們深入探究其中的細(xì)節(jié)!
2. 如何修改數(shù)據(jù)
修改數(shù)據(jù)就是把已經(jīng)存儲好的數(shù)據(jù)進(jìn)行更改。在這一點(diǎn)上,React 和 Vue 的處理方式有所區(qū)別。Vue 本質(zhì)上會創(chuàng)建一個數(shù)據(jù)對象,其中的數(shù)據(jù)可以自由更改;React 則創(chuàng)建一個狀態(tài)對象,更改數(shù)據(jù)需要一些額外的操作。React 之所以需要額外的操作有著自己的理由,稍后我會深入介紹。在此之前,我們先看看 Vue 中的數(shù)據(jù)對象和 React 中的狀態(tài)對象:
Vue 數(shù)據(jù)對象
React 狀態(tài)對象
從圖中可以看出,我們傳入了相同的數(shù)據(jù),但它們的標(biāo)記方法不同。因此,將初始數(shù)據(jù)傳遞到組件的方式非常相似。但正如我們提到的那樣,在兩個框架中更改數(shù)據(jù)的方式有所不同。
例:我們要修改一個名為 name: ‘Sunil’ 的數(shù)據(jù)元素
在 Vue 中,我們通過調(diào)用 this.name 來引用它。我們也可以通過調(diào)用 this.name ='John' 來更新它。這樣一來,名字就被成功改為了 “Jhon”。
在 React 中,我們通過調(diào)用 this.state.name 來引用同一段數(shù)據(jù)?,F(xiàn)在關(guān)鍵的區(qū)別在于,我們不能簡單地寫成 this.state.name='John',因?yàn)?React 有限制機(jī)制,它會阻止這種簡單的修改方式。在 React 中,我們需要這樣寫:this.setState({name:'John'})。
雖然與 Vue 中實(shí)現(xiàn)的結(jié)果一樣,但是 React 的操作更為繁瑣。原因在于Vue 在每次更新數(shù)據(jù)時默認(rèn)組合了自己的 setState 版本。而React 需要 setState,然后再更新其內(nèi)部數(shù)據(jù)。
現(xiàn)在我們知道如何更改數(shù)據(jù)了,接下來看看如何在待辦應(yīng)用程序中添加新的事項。
3. 添加新的待辦事項
React 的實(shí)現(xiàn)方法
createNewToDoItem = () => { this.setState( ({ list, todo }) => ({ list: [ ...list, { todo } ], todo: '' }) ); };
在 React 中,我們的輸入字段有一個名為 value 的屬性。這個 value 通過使用幾個函數(shù)自動更新,這些函數(shù)綁定在一起以創(chuàng)建雙向綁定。我們通過在輸入字段上附加一個 onChange 事件監(jiān)聽器來創(chuàng)建這種形式的雙向綁定。如下所示:
只要輸入字段的值發(fā)生更改,handleInput 函數(shù)就會運(yùn)行。它通過將狀態(tài)對象設(shè)置為輸入字段中的任何內(nèi)容來更新狀態(tài)對象內(nèi)的 todo。handleInput 函數(shù)如下:
handleInput = e => { this.setState({ todo: e.target.value }); };
現(xiàn)在,只要用戶按下頁面上的 + 按鈕添加新項目,createNewToDoItem 函數(shù)就會運(yùn)行 this.setState 并向其傳遞一個函數(shù)。該函數(shù)有兩個參數(shù),第一個是來自狀態(tài)對象的整個列表數(shù)組,第二個是由 handleInput 函數(shù)更新的todo。然后該函數(shù)返回一個新對象,該對象包含之前的整個列表,并在其末尾添加todo。整個列表是通過使用擴(kuò)展運(yùn)算符添加的。
最后,我們將 todo 設(shè)置為空字符串,它會自動更新輸入字段中的 value。
Vue 的實(shí)現(xiàn)方法
createNewToDoItem() { this.list.push( { 'todo': this.todo } ); this.todo = ''; }
在 Vue 中,我們的輸入字段中有一個名為 v-model 的句柄。這實(shí)現(xiàn)了**雙向綁定。輸入字段代碼如下:
V-Model 將輸入字段的內(nèi)容綁定到名為 toDoItem 的數(shù)據(jù)對象的鍵(key)上。當(dāng)頁面加載時,我們將 toDoItem 設(shè)置為空字符串,比如:todo:' '。如果已經(jīng)存在數(shù)據(jù),例如 todo:'添加文本處',輸入字段將加載添加文本處的輸入內(nèi)容。無論如何,將其作為空字符串,我們在輸入字段中鍵入的任何文本都會綁定到 todo。這實(shí)際上是雙向綁定(輸入字段可以更新數(shù)據(jù)對象,數(shù)據(jù)對象可以更新輸入字段)。
因此,回顧前面的 createNewToDoItem() 代碼塊,我們將 todo 的內(nèi)容存放到列表數(shù)組中 ,然后將 todo 改為空字符串。
4. 刪除待辦事項
React 的實(shí)現(xiàn)方法
deleteItem = indexToDelete => { this.setState(({ list }) => ({ list: list.filter((toDo, index) => index !== indexToDelete) })); };
盡管 deleteItem 函數(shù)位于 ToDo.js 文件中,但是從 ToDoItem.js 文件中引用它也很容易,將 deleteItem() 函數(shù)作為 上的 prop 傳遞:
這會將該函數(shù)傳遞給子組件,使其可以訪問。我們綁定了 this 并傳遞 key 參數(shù),當(dāng)用戶點(diǎn)擊刪除項時,函數(shù)通過 key 區(qū)分用戶點(diǎn)擊的是哪一條 ToDoItem 。然后,在ToDoItem 組件內(nèi)部,我們執(zhí)行以下操作:
-
想要引用位于父組件內(nèi)部的函數(shù),只需引用 this.props.deleteItem 即可。
Vue 的實(shí)現(xiàn)方法
onDeleteItem(todo){ this.list = this.list.filter(item => item !== todo); }
Vue 的實(shí)現(xiàn)方法稍有不同,我們需要做到以下三點(diǎn):
Step 1:首先,在元素上調(diào)用函數(shù):
-
Step 2:然后我們必須創(chuàng)建一個 emit 函數(shù),將其作為子組件的內(nèi)部方法(在本例中為ToDoItem.vue),如下所示:
deleteItem(todo) { this.$emit('delete', todo) }
Step 3:之后,你會發(fā)現(xiàn),當(dāng)我們添加 ToDo.vue的 ToDoItem.vue 時,實(shí)際上引用了一個函數(shù):
這就是所謂的自定義事件監(jiān)聽器。它會監(jiān)聽任何使用 'delete' 字符串的觸發(fā)事件。一旦監(jiān)聽到事件,它會觸發(fā)一個名為 onDeleteItem 的函數(shù)。此函數(shù)位于 ToDo.vue 內(nèi)部,而不是 ToDoItem.vue。如前所述,該函數(shù)只是過濾數(shù)據(jù)對象內(nèi)的 todo 數(shù)組 ,以刪除被點(diǎn)擊的待辦事項。
在 Vue 示例中還需要注意的是,我們可以在 @click 偵聽器中編寫 $emit 部分,這樣更加簡單,如下所示:
-
如果你喜歡,這樣做可以把 3 步減少到 2 步。
React 中的子組件可以通過 this.props 訪問父函數(shù),而在 Vue 中,你需要從子組件中發(fā)出事件,父組件來收集事件。
5. 如何傳遞事件監(jiān)聽器
React 的實(shí)現(xiàn)方法
事件監(jiān)聽器處理簡單事件(比如點(diǎn)擊)非常直接。我們?yōu)榇k事項創(chuàng)建了點(diǎn)擊事件,用于創(chuàng)建新的待辦事項,代碼如下:
+
非常簡單,就像使用 vanilla JS 處理內(nèi)聯(lián) onClick 一樣。正如前文所述,只要按下回車按鈕,設(shè)置事件監(jiān)聽器就需要花費(fèi)更長的時間。這需要輸入標(biāo)簽處理 onKeyPress 事件,代碼如下:
該函數(shù)只要識別到'enter'鍵被按下,它就會觸發(fā) **createNewToDoItem** 函數(shù),代碼如下所示:
handleKeyPress = (e) => { if (e.key === ‘Enter’) { this.createNewToDoItem(); } };
Vue 的實(shí)現(xiàn)方法
Vue 的事件監(jiān)聽器更加直接。我們只需要使用一個簡單的 @ 符號,就可以構(gòu)建出我們想要的事件監(jiān)聽器。例如,想要添加 click 事件監(jiān)聽器,代碼:
+
注意:@click 實(shí)際上是 v-on:click 的簡寫。Vue 事件監(jiān)聽器很強(qiáng)大,你可以為其選擇屬性,例如 .once 可以防止事件監(jiān)聽器被多次觸發(fā)。此外,它還包含很多快捷方式。按下回車按鈕時,React 就需要花費(fèi)更長的時間來創(chuàng)建事件監(jiān)聽器,從而創(chuàng)建新的 ToDo 項目。在 Vue,代碼如下:
6. 如何將數(shù)據(jù)傳遞給子組件
React 的實(shí)現(xiàn)方法
在 React 中,我們將 props 傳遞到子組件的創(chuàng)建處。比如:
此處我們向 ToDoItem 組件傳遞了兩個 prop。之后,我們可以在子組件中通過 this.props 引用它們
因此,想要訪問 item.todo prop,我們只需調(diào)用this.props.item 。
Vue 的實(shí)現(xiàn)方法
在 Vue 中,我們將 props 傳遞到子組件創(chuàng)建處的方式如下:
我們將它們傳遞給子組件中的 props 數(shù)組,如:props:['id','todo']。然后可以在子組件中通過名字引用它們。
7. 如何將數(shù)據(jù)發(fā)送回父組件
React 的實(shí)現(xiàn)方法
我們首先將函數(shù)傳遞給子組件,方法是在我們調(diào)用子組件時將其引用為 prop。
然后我們通過引用 this.props.whateverTheFunctionIsCalled,為子組件添加調(diào)用函數(shù),例如 onClick。然后,這將觸發(fā)父組件中的函
數(shù)。刪除待辦事項一節(jié)中詳細(xì)介紹了整個過程。
Vue 的實(shí)現(xiàn)方法
在子組件中我們只需編寫一個函數(shù),將一個值發(fā)送回父函數(shù)。在父組件中編寫一個函數(shù)來監(jiān)聽子組件何時發(fā)出該值的事件,監(jiān)聽到事件之后觸發(fā)函數(shù)調(diào)用。同樣,刪除待辦事項一節(jié)中詳細(xì)介紹了整個過程。
8. 總結(jié)
通過介紹了如何添加、刪除和更改數(shù)據(jù),以 prop 形式從父組件到子組件傳遞數(shù)據(jù),以及通過事件監(jiān)聽器的形式將數(shù)據(jù)從子組件發(fā)送到父組件等方法來理解React 和 Vue 之間的差異,希望通過本文的內(nèi)容有助于大家理解這兩個框架
關(guān)于vue與react的區(qū)別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的參考價值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。