當前位置: 華文世界 > 科技

面試官:聊聊你知道的Vue與React的區別

2024-10-27科技

最近面到很多大公司的時候,小編都會碰到一個很尷尬的問題,很多大公司的技術棧都是React,但是小編學的是Vue,其實從本質上來說兩者都是比較優秀的前端框架,所以有些面試官會問到Vue和React的區別。小編認真整理了一些自己所知道的Vue和React的區別,給大家分享分享。

1. 樣版語法 vs JSX

  • Vue 使用類似於 HTML 的樣版語法,例如:<template> 標簽中的樣版。
  • 樣版範例(Vue)

    <template> <div> <p>Hello, world!</p> <my-button @click="handleClick">Click me</my-button> </div></template><script>// 定義一個按鈕元件Vue.component('my-button', { template: '<button><slot></slot></button>'});export default { methods: { handleClick() { console.log('Button clicked'); } }};</script>

  • React 使用 JSX(JavaScript XML), 它是一種將 HTML 直接嵌入到 JavaScript 程式碼中的語法。它和Java中的xml十分類似
  • JSX 範例(React)

    import React from 'react';// 使用 JSX 描述一個簡單的按鈕元件const Button = ({ onClick, children }) => { return <button onClick={onClick}>{children}</button>;};// 在 JSX 中使用 Button 元件const App = () => { const handleClick = () => { console.log('Button clicked'); }; return ( <div> <p>Hello, world!</p> <Button onClick={handleClick}>Click me</Button> </div> );};export default App;

    2. 元件通訊

  • 在 Vue 中,元件間的通訊可以使用 props(父子元件通訊)、emit(子父元件通訊)、emit(子父元件通訊)、emit(子父元件通訊)、attrs/$listeners(特性和事件繼承)、Vuex/Pinia(用於大型套用中的狀態管理)等。
  • Vue 元件通訊範例

    父元件向子元件傳遞數據:

    <template> <div> <child-component :message="parentMessage"></child-component> </div></template><script>import ChildComponent from './ChildComponent.vue';export default { data() { return { parentMessage: 'Message from parent' }; }, components: { ChildComponent }};</script>

    子元件接收數據:

    <template> <div> <p>{{ message }}</p> </div></template><script>export default { props: { message: String }};</script>

  • 在 React 中,元件間的通訊主要依賴於 props 和 context,但對於更復雜的套用,可以使用 Redux 或其他狀態管理庫。
  • React 元件通訊範例

    父元件向子元件傳遞數據:

    import React from 'react';import ChildComponent from './ChildComponent'; class ParentComponent extends React.Component { render() { return ( <div> <ChildComponent message="Message from parent" /> </div> ); }}export default ParentComponent;

    子元件接收數據:

    import React from 'react'; class ChildComponent extends React.Component { render() { return ( <div> <p>{this.props.message}</p> </div> ); }}export default ChildComponent;

    這些範例演示了父元件向子元件傳遞數據的過程。在 Vue 中,透過 props 將數據傳遞給子元件;在 React 中,也是透過 props 實作相同的功能。

    3. 狀態管理

  • Vue 有 Vuex/Pinia 用於管理套用的狀態。
  • React 沒有官方的狀態管理庫,但有許多第三方庫可供選擇,最流行的是 Redux。
  • 4. 生命周期

  • Vue 元件有自己的生命周期勾點,如 created、mounted、updated、destroyed 等,用於在元件生命周期的不同階段執行程式碼。
  • React 元件也有生命周期方法,如 componentDidMount、componentDidUpdate、componentWillUnmount 等,但在 React 16.3 版本後,一些生命周期方法已被標記為過時,推薦使用新的生命周期方法或 React Hooks。
  • 5. diff演算法

    React 的 diff 演算法

  • React 使用的是一種基於層級的 diff 演算法。當元件的狀態發生變化時,React 會比較當前虛擬 DOM 樹和上一次更新後的虛擬 DOM 樹的差異。
  • React diff 演算法會首先比較兩棵樹的根節點,如果節點類別不同,則直接刪除舊節點,插入新節點;如果節點類別相同,則會繼續比較子節點。(核心思想是比較和替換節點)
  • React diff 演算法會使用一些啟發式的策略來盡可能地減少 DOM 操作的次數,例如將子節點列表轉換為 key-value 的形式,以便更快地找到需要更新的節點。
  • (必須有key)
  • Vue 的 diff 演算法

  • Vue 使用的是一種雙端比較的 diff 演算法。當元件的狀態發生變化時,Vue 會同時從新舊虛擬 DOM 樹的兩端開始比較,找到最長的相同子序列。
  • Vue 會對動態節點進行跟蹤,如果一個節點在新舊虛擬 DOM 中位置發生了變化,Vue 會盡可能地將其移動到新的位置,而不是刪除和重新插入節點。(核心思想是移動復用節點)
  • Vue 的 diff 演算法會透過動態規劃的方式找到最優的更新策略,以最小化 DOM 操作的次數。
  • (可以沒有key)
  • 6.不同的頁面更新的通知方式

  • Vue在進行數據更改以後,會主動向使用者聲明更改資訊。
  • React需要透過diff演算法計算得知數據變化。
  • 7.不同的監聽方式

    早期的Vue與React

  • Vue中進行頁面更新主要是透過給每個元素設定事件監聽器(Watcher),在頁面發生更改以後,對應的監聽器會去更改展示頁面。
  • React在原本的瀏覽器Dom上建立了虛擬Dom,透過原來的Dom與虛擬Dom進行對比,進行修改。(早期的Diff演算法出現)
  • 當然,隨之而來的是不同的效能問題,Vue體現在大量Watcher帶來的效能損耗上面,React則體現在Diff演算法的計算時間中(虛擬Dom計算時間過長會導致卡頓)

    不同的解決方式

  • Vue借鑒了React的監聽方式,形成了元件內部元素(diff演算法計算)+元件之間(Watcher監聽)的方式進行監聽,降低了Watcher的數量,也減少了diff大量計算帶來的卡頓問題。
  • React則使用了時間分片(允許多個任務輪流使用處理器)的思想,在使用diff演算法檢查頁面更改的過程中,分片進行使用瀏覽器,在瀏覽器的空閑時間計算Diff,如果瀏覽器有高級的需求則讓瀏覽器繼續使用進行渲染。