1、請簡述Vue插件和組件的區別 ?
Vue的插件(Plugin)和組件(Component)是Vue.js中非常重要的兩個概念,它們在功能上有着明顯的差異。
- Vue組件(Component): Vue組件是Vue.js最強大的功能之一。組件可以擴展HTML元素,封裝可重用的代碼。在較大的Vue.js應用中,我們會把整個應用拆分成一些小的、獨立的、可複用的組件以使整個項目結構更清晰。例如,一個電商網站的頁面可以被拆分爲頭部組件,側邊欄組件,產品列表組件等。
- Vue插件(Plugin): Vue插件通常用來爲Vue添加全局功能。插件的範圍沒有嚴格的限制——通常是添加全局方法或者通過全局混入等方式影響Vue構造器,也可以提供額外的命令行選項。它可能會爲Vue添加全局方法或屬性(如vue-custom-element),提供一些自定義選項,或者向Vue實例添加方法。例如,Vue Router和Vuex就是Vue的插件。
簡單來說,Vue組件是Vue應用的一部分,用於封裝和重用代碼,而Vue插件則是用於添加全局級別的功能。
2、簡述Vue的MVVM 模式?
MVVM模式是Model-View-ViewModel的縮寫,是一種設計思想。MVVM模式分爲三部分:
- Model(模型):負責數據的存儲以及處理問題的部分,它代表的是你的數據和業務邏輯。在Vue中,Model就是我們在data中聲明的數據。
- View(視圖):負責數據展示的部分,簡單來說,就是用戶看到並與之交互的界面。在Vue中,View就是我們寫的模板。
- ViewModel(視圖模型):它是連接View和Model的橋樑。在Vue中,ViewModel就是Vue實例。Vue實例在創建時,會接收data對象,並遍歷此對象所有的屬性,並使用Object.defineProperty將屬性全部轉爲getter/setter,以便追蹤屬性的變化。當用戶在View層進行操作時,ViewModel能感知到變化並對Model層的數據進行更新,反之亦然。
MVVM的最大優點就是數據驅動和雙向數據綁定,即Model變化會自動更新到View,反之View變化也會自動改變Model。這種方式讓開發者只需關注業務邏輯,不需要手動操作DOM,極大地提高了開發效率。
3、簡述MVC與MVVM的區別 ?
MVC 和 MVVM 都是常見的設計模式,它們的主要區別在於對視圖和業務邏輯的處理方式。
-
MVC(Model-View-Controller)模式:
- Model(模型):負責數據的存儲。
- View(視圖):負責數據展示。
- Controller(控制器):作爲模型和視圖之間的橋樑,處理用戶交互,並更新視圖和模型。
在MVC模式中,用戶的操作會首先到達控制器,然後控制器更新模型,模型變化後會反過來更新視圖。但是,這種模式的問題在於,控制器可能變得過於複雜,因爲它需要處理視圖和模型之間的所有交互。
-
MVVM(Model-View-ViewModel)模式:
- Model(模型):負責數據的存儲。
- View(視圖):負責數據展示。
- ViewModel(視圖模型):作爲模型和視圖之間的橋樑,處理用戶交互,並更新視圖和模型。
MVVM模式的出現是爲了解決MVC中控制器過於複雜的問題。在MVVM中,視圖模型替代了控制器的角色,它使用數據綁定的方式來實現視圖和模型的同步。當模型的數據發生變化時,視圖模型會自動更新視圖,反之亦然。這種方式降低了視圖和模型之間的耦合度,使得代碼更易於管理和維護。
總的來說,MVVM相比MVC,更加註重數據驅動和視圖的自動更新,使得開發者可以更專注於業務邏輯,而不需要手動操作DOM,提高了開發效率。
4、簡述Vue組件通訊有哪些方式 ?
Vue組件間的通信主要有以下幾種方式:
-
父子組件通信:
- Props down / Events up:父組件通過 props 向子組件傳遞數據,子組件通過 emit 發送事件來通知父組件數據的變更。
- 使用
$refs
:父組件可以通過$refs
獲取子組件的實例,從而訪問其數據和方法。 .sync
修飾符:Vue 2.3.0 版本引入了.sync
修飾符,可以作爲一種雙向綁定的語法糖,方便父子組件間的數據同步。
-
非父子組件通信:
- 事件總線(Event Bus):創建一個新的 Vue 實例作爲事件總線,在需要通信的組件之間觸發和監聽事件。
- Vuex:Vue 的官方狀態管理工具,能夠幫助我們管理共享狀態,非常適合大型應用。
- Vue Router:如果使用了 Vue Router,可以通過路由參數進行通信。
-
跨級組件通信:
$parent
/$children
:訪問父/子組件實例。- provide/inject:Vue 提供的依賴注入機制,能夠實現祖先組件向後代組件注入數據或方法。
以上就是Vue中常見的組件間通信方式,選擇哪種方式取決於具體的應用場景和需求。
5、簡述Vue的生命週期方法有哪些?
Vue實例從創建到銷燬的過程,就是生命週期。Vue的生命週期主要包括以下幾個階段:
-
創建階段:
beforeCreate
:在實例初始化之後,數據觀測 (data observer) 和 event/watcher 事件配置之前被調用。created
:在實例創建完成後被立即調用。在這一步,實例已完成以下的配置:數據觀測 (data observer),屬性和方法的運算,watch
/event
事件回調。然而,掛載階段還沒開始,$el
屬性目前不可見。
-
掛載階段:
beforeMount
:在掛載開始之前被調用。相關的render
函數首次被調用。mounted
:el
被新創建的vm.$el
替換,並掛載到實例上去之後調用。此時,你會有一些直接的 DOM 操作任務需要在這個階段完成。
-
更新階段:
beforeUpdate
:數據更新時調用,發生在虛擬DOM打補丁之前。這裏適合在更新之前訪問現有的DOM,比如手動移除已添加的事件監聽器。updated
:由於數據更改導致的虛擬DOM重新渲染和打補丁,在這之後會調用該鉤子。
-
銷燬階段:
beforeDestroy
:實例銷燬之前調用。在這一步,實例仍然完全可用。destroyed
:Vue實例銷燬後調用。調用後,所有的事件監聽器會被移除,所有的子實例也會被銷燬。
這些生命週期鉤子函數爲用戶在不同階段添加自己的代碼提供了便利,比如你可以在 created
鉤子函數中進行Ajax請求數據,在 mounted
鉤子函數中操作DOM等。
6、簡述 v-if 和 v-show 的區別 ?
v-if
和 v-show
都是 Vue 中用來進行條件渲染的指令,但它們之間有一些重要的區別:
v-if
:是“真正的”條件渲染,因爲它會確保在切換過程中條件塊內的事件監聽器和子組件適當地被銷燬和重建。v-if
也是惰性的:如果在初始渲染時條件爲假,則什麼也不做——直到條件第一次變爲真時,纔會開始渲染條件塊。簡單來說,如果條件爲假,v-if
指令會完全銷燬元素。v-show
:不管初始條件是什麼,元素總是會被渲染,並且只是簡單地基於 CSS 進行切換。v-show
只會在元素上切換 CSS 的display
屬性。如果條件爲假,v-show
指令只會將元素隱藏,而不是銷燬。
總的來說,v-if
有更高的切換消耗,v-show
有更高的初始渲染消耗。因此,如果需要非常頻繁地切換,則使用 v-show
較好;如果在運行時條件很少改變,則使用 v-if
較好。
7、簡述 Vue 有哪些內置指令 ?
Vue提供了一些內置指令,可以在模板中進行一些常見的任務。以下是一些最常用的內置指令:
v-bind
:用於綁定一個屬性到表達式。簡寫爲:
。例如,v-bind:class
可以綁定一個 class 到一個表達式。v-model
:在表單元素或者組件上創建雙向數據綁定。v-show
:根據表達式之真假值,切換元素的顯示/隱藏狀態。v-if
、v-else-if
、v-else
:根據表達式的值的真假,在DOM中渲染或者銷燬元素。v-for
:基於源數據多次渲染元素或模板塊。v-on
:綁定事件監聽器。事件類型由參數指定。簡寫爲@
。例如,v-on:click
可以監聽一個點擊事件。v-text
:更新元素的textContent
。如果要更新部分的textContent
,需要使用{{ Mustache }}
插值。v-html
:更新元素的innerHTML
。注意,內容按普通 HTML 插入 - 不會作爲 Vue 模板進行編譯。v-cloak
:這個指令保持在元素上直到關聯實例結束編譯。和 CSS 規則如[v-cloak] { display: none }
一起用時,這個指令可以隱藏未編譯的 Mustache 標籤直到實例準備完畢。v-pre
:跳過這個元素和它的子元素的編譯過程。可以用來顯示原始的 Mustache 標籤。跳過大量沒有指令的節點會加快編譯。v-once
:只渲染元素和組件一次。隨後的重新渲染, 元素/組件及其所有的子節點將被視爲靜態內容並跳過。
這些內置指令大大增強了模板的功能,使我們可以在模板中實現更多的邏輯。
8、簡述Vue computed 和 watch 的區別和運用的場景 ?
computed
和 watch
都是 Vue 中的重要特性,它們都用於觀察和響應 Vue 實例上的數據變動。但是它們的使用場景和方式有所不同:
-
computed
(計算屬性):- 計算屬性是基於它們的依賴進行緩存的。只有在相關依賴發生改變時纔會重新求值。這意味着只要依賴沒有改變,多次訪問計算屬性會立即返回之前的計算結果,而不必再次執行函數。
- 計算屬性適合用在模板渲染中,某個值是依賴其他的響應式對象甚至多個計算屬性計算而來;當這些依賴發生變化時,計算屬性會重新計算新的值。這使得我們在處理複雜邏輯時,能夠將複雜邏輯拆分在各個計算屬性中,使得代碼更清晰易讀。
-
watch
(偵聽器):- 偵聽器允許我們對數據進行異步操作,每當監聽的數據變化時,都會執行回調進行後續操作。
- 當需要在數據變化時執行異步或開銷較大的操作時,這個方式是最有用的。例如,當一些數據改變需要向服務器發送請求,或者在數據改變後需要進行一些延時的複雜邏輯,這些場景下,使用
watch
是非常有用的。
總的來說,當你需要在數據變化後執行異步或開銷較大的操作時,使用 watch
;當你需要根據其他數據變動實時計算或處理一些數據時,使用 computed
。
9、簡述 Vue 2.0 響應式數據的原理( 重點 )?
Vue 2.0 的響應式系統的核心是 Object.defineProperty,它允許 Vue 跟蹤依賴,並在屬性被訪問和修改時通知變更。以下是 Vue 2.0 響應式數據的原理:
- 當你把一個普通的 JavaScript 對象傳給 Vue 實例的
data
選項,Vue 將遍歷此對象所有的屬性,並使用 Object.defineProperty 把這些屬性全部轉爲 getter/setter。 - 每個組件實例都對應一個 watcher 實例,它會在組件渲染的過程中把“接觸”過的數據屬性記錄爲依賴。之後當依賴項的 setter 觸發時,會通知 watcher,從而使它關聯的組件重新渲染。
- Vue 在更新 DOM 時是異步執行的。只要偵聽到數據變化,Vue 將開啓一個隊列,並緩衝在同一事件循環中發生的所有數據變更。如果同一個 watcher 被多次觸發,只會被推入到隊列中一次。這種在緩衝時去除重複數據對於避免不必要的計算和 DOM 操作是非常重要的。然後,在下一個的事件循環“tick”中,Vue 刷新隊列並執行實際(已去重的)工作。
- Vue 在內部嘗試對異步隊列使用原生的 Promise.then、MutationObserver 和 setImmediate,如果執行環境不支持,則會採用 setTimeout(fn, 0) 代替。
通過這種方式,Vue 能夠智能地知道何時更新視圖,而無需在數據變化時手動操作 DOM,這大大提高了應用的效率。
10、請解釋Vue的父子組件生命週期鉤子函數執行順序 ?
Vue.js中的每個組件都有自己的生命週期,從創建(creation)到掛載(mounting),更新(updating)和銷燬(destruction)。在這個過程中,Vue提供了一些生命週期鉤子函數,如 created
, mounted
, updated
, destroyed
等,這些函數可以讓我們在特定的時機執行一些代碼。
當一個父組件包含一個子組件時,他們的生命週期鉤子函數的執行順序如下:
beforeCreate
: 父組件首先執行beforeCreate
鉤子函數。created
: 父組件接着執行created
鉤子函數。beforeMount
: 父組件接着執行beforeMount
鉤子函數。然後開始處理子組件。beforeCreate
: 子組件執行beforeCreate
鉤子函數。created
: 子組件接着執行created
鉤子函數。beforeMount
: 子組件接着執行beforeMount
鉤子函數。mounted
: 子組件首先執行mounted
鉤子函數,然後父組件執行mounted
鉤子函數。這是因爲父組件等待其所有子組件都掛載完成後,纔會執行自己的mounted
鉤子函數。
當組件更新時,執行順序如下:
beforeUpdate
: 父組件首先執行beforeUpdate
,然後子組件執行beforeUpdate
。updated
: 子組件首先執行updated
,然後父組件執行updated
。
當組件銷燬時,執行順序如下:
beforeDestroy
: 父組件首先執行beforeDestroy
,然後子組件執行beforeDestroy
。destroyed
: 子組件首先執行destroyed
,然後父組件執行destroyed
。
這個順序很重要,因爲它決定了我們可以在哪個鉤子函數中進行數據獲取、操作DOM等操作。例如,如果我們想在組件掛載後操作DOM,那麼我們應該在mounted
鉤子函數中進行。
11、簡述 v-model 雙向綁定的原理是什麼?
v-model
是 Vue.js 中的一個重要指令,它實現了數據和表單元素之間的雙向綁定。簡單來說,雙向綁定就是數據改變會影響視圖,視圖改變也會影響數據。
v-model
的雙向綁定原理主要基於以下兩個部分:
- 數據到視圖的綁定:這一部分主要通過 Vue 的響應式系統完成。當我們在組件的 data 中定義一個變量,例如
message
,Vue 會使用 Object.defineProperty() 方法將它轉換爲 getter/setter。當我們在模板中使用{{message}}
或v-model="message"
時,Vue 會將當前組件添加到message
的依賴中。當message
發生變化時,Vue 會通知所有依賴message
的組件重新渲染,從而更新視圖。 - 視圖到數據的綁定:這部分主要通過監聽 DOM 事件完成。對於
<input>
元素,v-model
指令會監聽input
事件。當用戶在輸入框中輸入內容時,觸發input
事件,然後v-model
指令的事件處理函數會把新的值賦給message
,從而更新數據。
所以,v-model="message"
相當於 v-bind:value="message"
和 v-on:input="message = $event.target.value"
的語法糖。
這種雙向綁定機制使得我們在處理表單元素時更加簡單,只需要操作數據,不需要直接操作 DOM,提高了開發效率。
12、請簡述Vue3.x 響應式數據原理是什麼?( 重點 )
Vue 3.x 的響應式系統是基於 ES6 的 Proxy
對象和 Reflect
對象實現的,相比於 Vue 2.x 使用的 Object.defineProperty
,Proxy
可以直接監聽對象而非屬性,它可以攔截並定義基本操作的行爲,如屬性查找、賦值、枚舉、刪除等。
下面是 Vue 3.x 響應式系統的基本原理:
- 數據劫持:當我們使用
reactive
或ref
創建響應式數據時,Vue 3.x 會使用Proxy
創建一個代理對象,對原始對象進行劫持。Proxy
可以攔截對象的多種操作,包括獲取屬性值、設置屬性值、刪除屬性等。 - 依賴收集:當我們首次訪問屬性值時,
Proxy
的get
陷阱會被觸發。在get
陷阱中,Vue 3.x 會把當前正在執行的副作用函數(即響應式效果函數)添加到當前屬性的依賴列表中。這個過程叫做依賴收集。 - 派發更新:當我們修改屬性值時,
Proxy
的set
陷阱會被觸發。在set
陷阱中,Vue 3.x 會遍歷當前屬性的依賴列表,執行每個依賴(副作用函數)。這個過程叫做派發更新。
舉個例子,假設我們有一個響應式對象 data
:
const data = reactive({ count: 0 });
當我們在組件的 setup
函數中使用 data.count
時:
watchEffect(() => {
console.log(data.count);
});
Vue 3.x 會在 Proxy
的 get
陷阱中,把 console.log(data.count)
這個副作用函數添加到 count
屬性的依賴列表中。
當我們修改 data.count
時:
data.count++;
Vue 3.x 會在 Proxy
的 set
陷阱中,遍歷 count
屬性的依賴列表,執行每個副作用函數。所以,console.log(data.count)
會被執行,打印出新的 count
值。
通過這種方式,Vue 3.x 實現了數據的響應式。只要數據發生變化,所有依賴這個數據的地方都會自動更新。
13、請簡述vue-router 動態路由是什麼?
Vue-router 的動態路由主要是指路由的路徑中包含動態部分,也就是說,我們可以在一個路由中插入一些變量。
動態路由主要用於處理 URL 參數,使我們能夠創建一個路由來匹配任意路徑,其中包含的參數可以在 Vue 組件中獲取。
例如,我們可能有一個用戶組件,用於顯示用戶的詳細信息。每個用戶都有一個唯一的 ID。我們可以創建一個動態路由來匹配 "/user/:id",其中 ":id" 是一個動態的部分,可以匹配任意的用戶 ID:
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User }
]
})
這樣,當我們訪問 "/user/123" 時,Vue-router 會顯示 User 組件,並將 "123" 作爲參數傳遞給它。
在 User 組件中,我們可以使用 $route.params.id
來獲取用戶 ID:
export default {
computed: {
userId() {
return this.$route.params.id
}
}
}
這種方式使得我們能夠使用同一個組件來顯示不同的用戶,而不需要爲每個用戶都創建一個單獨的路由和組件,從而簡化了代碼的複雜性並提高了代碼的重用性。
14、Vue生命週期鉤子是如何實現的?
Vue 的生命週期鉤子函數是 Vue 實例在不同生命週期階段會自動調用的一些函數。這些函數讓我們有機會在特定的時刻添加自己的代碼,如在組件創建時獲取數據,在組件更新前做一些清理工作等。
Vue 的生命週期鉤子的實現主要依賴於 Vue 的組件系統。在 Vue 內部,每個 Vue 組件都被表示爲一個 Vue 實例,在這個實例的生命週期中,Vue 會在特定的時機調用相應的鉤子函數。
以下是 Vue 生命週期鉤子函數的主要實現過程:
- 創建階段:當我們使用
new Vue()
創建一個新的 Vue 實例時,Vue 會調用_init
方法來初始化這個實例。在_init
方法中,Vue 會調用beforeCreate
和created
鉤子函數。在這兩個鉤子函數中,我們可以訪問到組件的數據和方法,但是無法訪問到 DOM,因爲此時 DOM 還沒有被創建。 - 掛載階段:當我們調用
vm.$mount()
方法來掛載這個 Vue 實例時,Vue 會開始編譯模板並創建 DOM。在這個過程中,Vue 會調用beforeMount
和mounted
鉤子函數。在beforeMount
鉤子函數中,我們可以獲取到編譯後的模板,但是無法獲取到 DOM,因爲此時 DOM 還沒有被插入到頁面中。在mounted
鉤子函數中,我們可以獲取到 DOM,並可以進行 DOM 操作。 - 更新階段:當組件的數據發生變化時,Vue 會重新渲染組件。在這個過程中,Vue 會調用
beforeUpdate
和updated
鉤子函數。在beforeUpdate
鉤子函數中,我們可以獲取到更新前的數據和 DOM。在updated
鉤子函數中,我們可以獲取到更新後的數據和 DOM。 - 銷燬階段:當我們調用
vm.$destroy()
方法來銷燬這個 Vue 實例時,Vue 會開始銷燬組件。在這個過程中,Vue 會調用beforeDestroy
和destroyed
鉤子函數。在beforeDestroy
鉤子函數中,我們可以獲取到銷燬前的數據和 DOM,並可以進行一些清理工作,如清除定時器、取消事件監聽等。在destroyed
鉤子函數中,我們可以確認組件已經被銷燬,所有的數據和方法都已經被清除。
以上就是 Vue 生命週期鉤子函數的主要實現過程。需要注意的是,這些鉤子函數都是可選的,我們可以根據需要在組件中定義這些函數。當這些函數存在時,Vue 會在相應的時機自動調用它們。
15、如何理解Vue中的模板編譯原理?
Vue.js的模板編譯原理主要包括兩個步驟:解析(Parse)和生成(Generate)。
-
解析(Parse) :這個階段會把模板轉換成抽象語法樹(AST,Abstract Syntax Tree)。抽象語法樹是一種以樹狀的形式表現源代碼結構的方式,每一個節點都代表源代碼中的一部分。
解析階段主要做的就是讀取模板中的標籤、指令、插值等,並以抽象語法樹的形式表現出來。例如,對於模板
<div id="app">{{ message }}</div>
,解析後的抽象語法樹可能如下:{ type: 1, // 節點類型,1表示元素節點 tag: 'div', // 標籤名 attrsList: [{ name: 'id', value: 'app' }], // 屬性列表 attrsMap: { id: 'app' }, // 屬性映射 children: [ // 子節點列表 { type: 2, // 節點類型,2表示帶有插值的文本節點 expression: '_s(message)', // 插值表達式 text: '{{ message }}' // 文本內容 } ] }
-
生成(Generate) :這個階段會把抽象語法樹轉換成渲染函數。渲染函數是一個JavaScript函數,當執行這個函數時,會返回一個虛擬DOM。
生成階段主要做的就是遍歷抽象語法樹,把每一個節點轉換成虛擬DOM的創建代碼。例如,對於上面的抽象語法樹,生成後的渲染函數可能如下:
function render() { return _c('div', { attrs: { id: 'app' } }, [_v(_s(message))]); }
其中,
_c
是創建元素節點的函數,_v
是創建文本節點的函數,_s
是轉換爲字符串的函數。
這就是Vue.js的模板編譯原理的基本過程。通過這個過程,Vue.js可以把我們寫的模板轉換成JavaScript代碼,從而實現數據和視圖的綁定。
16、簡述vue.mixin的使用場景和原理?
Vue 的 mixin 是一種分發 Vue 組件中可複用功能的非常靈活的方式。簡單來說,mixin 對象可以包含任何組件選項,當組件使用 mixin 對象時,所有 mixin 對象的選項將被混入到該組件本身的選項中。
使用場景:
- 當我們有一些通用的功能,比如數據獲取、驗證函數、工具方法等,這些功能在多個組件中都需要使用時,就可以考慮使用 mixin 來進行代碼複用。
- 當我們需要對 Vue 的一些生命週期鉤子函數進行抽象時,也可以使用 mixin。例如,我們可以創建一個 mixin,它在
created
鉤子中獲取數據,在beforeDestroy
鉤子中清理資源。
代碼示例:
// 定義一個 mixin 對象
var myMixin = {
created: function () {
this.hello()
},
methods: {
hello: function () {
console.log('hello from mixin!')
}
}
}
// 定義一個使用了這個 mixin 的組件
var Component = Vue.extend({
mixins: [myMixin]
})
var component = new Component() // => "hello from mixin!"
原理:
Vue 的 mixin 實現原理主要是通過合併選項(merge options)來實現的。當我們創建一個 Vue 實例或組件時,Vue 會把這個實例或組件的選項和所有的 mixin 對象的選項進行合併。這個合併過程主要是通過 Vue.config.optionMergeStrategies
來實現的,它定義了各種選項的合併策略。
在合併過程中,大部分選項將進行合併,也就是說,如果組件和 mixin 對象都定義了這個選項,那麼最終的結果將是這兩個選項合併後的結果。例如,對於 data
選項,Vue 會把組件和 mixin 對象的數據對象進行合併,並返回一個新的數據對象。
但是有一些選項是不進行合併的,比如 el
和 data
。對於這些選項,如果組件和 mixin 對象都定義了這個選項,那麼最終的結果將是組件的選項覆蓋 mixin 對象的選項。
通過這種方式,Vue 的 mixin 實現了對組件選項的複用,使我們可以在多個組件中共享同樣的選項和邏輯。
由於內容太多,更多內容以鏈接形勢給大家,點擊進去就是答案了
25. 請簡述Vue 的性能優化可以從哪幾個方面去思考設計 ?
27. 請解釋Vue爲什麼要用虛擬Dom ,詳細解釋原理 ?
34. Vue中delete和Vue.delete刪除數組的區別 ?
36. 請說明Vue中$root、$refs、$parent的使用 ?
37. 簡述v-el 作用是什麼以及Vue的el屬性和$mount優先級?
38. 簡述vue-loader是什麼?使用它的用途有哪些?
39. 簡述Vue的普通Slot以及作用域Slot的區別 ?
41. Vue3.0 裏爲什麼要用 Proxy API替代 defineProperty API?
47. Vue 3.0 所採用的 Composition Api 與 Vue 2.x使用的Options Api 有什麼區別?
48. Vue.js中的v-bind指令有何作用?如何使用?
50. 簡述父組件給子組件props傳參,子組件接收的6種方法 ?
54. 簡述vue2.x 和 vuex3.x 渲染器的 diff 算法 ?
56. 請簡述構建 vue-cli 工程都用到了哪些技術?他們的作用分別是什麼?
58. 簡述Vue complier 的實現原理是什麼樣的?
61. Vue.extend 和 Vue.component 的區別是什麼?
62. 簡述接口請求一般放在哪個生命週期中?爲什麼要這樣做?
66. 闡述Vue 中 computed 和 methods 的區別 ?
67. 如何監聽 pushstate 和 replacestate 的變化呢?
70. Vue中子組件可以直接改變父組件的數據麼,說明原因 ?
78. 簡述vue深拷貝,數量加減dom不進行二次渲染,解決方法 ?
80. 簡述React 和 Vue 的 diff 時間複雜度從 O(n^3) 優化 到 O(n) ,那麼 O(n^3) 和 O(n) 是如何計算出來的 ?
81. 簡述Vue 的⽗組件和⼦組件⽣命週期鉤⼦執⾏順序是什麼 ?
82. 簡述Vue data 中某一個屬性的值發生改變後,視圖會立即同步執 行重新渲染嗎 ?
84. 簡述v-if 和 v-for 哪個優先級更高?如果同時出現,應如何優化 ? 在 Vue 中,`v-