面試題(2020)Vue面試題彙總
面試題(2020)Vue面試題彙總
部落格說明
文章所涉及的資料來自網際網路整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯絡本人刪除,謝謝!
1、對於MVVM的理解
MVVM 是 Model-View-ViewModel 的縮寫。
Model代表資料模型,也可以在Model中定義資料修改和操作的業務邏輯。
View 代表UI 元件,它負責將資料模型轉化成UI 展現出來。
ViewModel 監聽模型資料的改變和控制檢視行為、處理使用者互動,簡單理解就是一個同步View 和 Model的物件,連線Model和View。
在MVVM架構下,View 和 Model 之間並沒有直接的聯絡,而是通過ViewModel進行互動,Model 和 ViewModel 之間的互動是雙向的, 因此View 資料的變化會同步到Model中,而Model 資料的變化也會立即反應到View 上。
ViewModel
2、vue實現雙向資料繫結
vue實現資料雙向繫結主要是:採用資料劫持結合釋出者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在資料變動時釋出訊息給訂閱者,觸發相應監聽回撥。當把一個普通 Javascript 物件傳給 Vue 例項來作為它的 data 選項時,Vue 將遍歷它的屬性,用 Object.defineProperty 將它們轉為 getter/setter。使用者看不到 getter/setter,但是在內部它們讓 Vue 追蹤依賴,在屬性被訪問和修改時通知變化。
vue的資料雙向繫結 將MVVM作為資料繫結的入口,整合Observer,Compile和Watcher三者,通過Observer來監聽自己的model的資料變化,通過Compile來解析編譯模板指令(vue中是用來解析 {{}}),最終利用watcher搭起observer和Compile之間的通訊橋樑,達到資料變化 —>檢視更新;檢視互動變化(input)—>資料model變更雙向繫結效果。
3、Vue元件間的引數傳遞
1.父元件與子元件傳值
父元件傳給子元件:子元件通過props方法接受資料;
子元件傳給父元件:$emit方法傳遞引數
2.非父子元件間的資料傳遞,兄弟元件傳值
eventBus,就是建立一個事件中心,相當於中轉站,可以用它來傳遞事件和接收事件。專案比較小時,用這個比較合適。
4、v-show 與 v-if 區別
-
v-show和v-if的區別:
v-show是css切換,v-if是完整的銷燬和重新建立。
-
使用
頻繁切換時用v-show,執行時較少改變時用v-if
-
v-if=‘false’ v-if是條件渲染,當false的時候不會渲染
5、Vue的生命週期
beforeCreate(建立前) 在資料觀測和初始化事件還未開始
created(建立後) 完成資料觀測,屬性和方法的運算,初始化事件,$el屬性還沒有顯示出來
beforeMount(載入前) 在掛載開始之前被呼叫,相關的render函式首次被呼叫。例項已完成以下的配置:編譯模板,把data裡面的資料和模板生成html。注意此時還沒有掛載html到頁面上。
mounted(載入後) 在el 被新建立的 vm.$el 替換,並掛載到例項上去之後呼叫。例項已完成以下的配置:用上面編譯好的html內容替換el屬性指向的DOM物件。完成模板中的html渲染到html頁面中。此過程中進行ajax互動。
beforeUpdate(更新前) 在資料更新之前呼叫,發生在虛擬DOM重新渲染和打補丁之前。可以在該鉤子中進一步地更改狀態,不會觸發附加的重渲染過程。
updated(更新後) 在由於資料更改導致的虛擬DOM重新渲染和打補丁之後呼叫。呼叫時,元件DOM已經更新,所以可以執行依賴於DOM的操作。然而在大多數情況下,應該避免在此期間更改狀態,因為這可能會導致更新無限迴圈。該鉤子在伺服器端渲染期間不被呼叫。
beforeDestroy(銷燬前) 在例項銷燬之前呼叫。例項仍然完全可用。
destroyed(銷燬後) 在例項銷燬之後呼叫。呼叫後,所有的事件監聽器會被移除,所有的子例項也會被銷燬。該鉤子在伺服器端渲染期間不被呼叫。
1.什麼是vue生命週期?
答: Vue 例項從建立到銷燬的過程,就是生命週期。從開始建立、初始化資料、編譯模板、掛載Dom→渲染、更新→渲染、銷燬等一系列過程,稱之為 Vue 的生命週期。
2.vue生命週期的作用是什麼?
答:它的生命週期中有多個事件鉤子,讓我們在控制整個Vue例項的過程時更容易形成好的邏輯。
3.vue生命週期總共有幾個階段?
答:它可以總共分為8個階段:建立前/後, 載入前/後,更新前/後,銷燬前/銷燬後。
4.第一次頁面載入會觸發哪幾個鉤子?
答:會觸發 下面這幾個beforeCreate, created, beforeMount, mounted 。
5.DOM 渲染在 哪個週期中就已經完成?
答:DOM 渲染在 mounted 中就已經完成了。
5、繫結 class 的陣列用法
- 物件方法
v-bind:class="{'orange': isRipe, 'green': isNotRipe}"
- 陣列方法
v-bind:class="[class1, class2]"
- 行內
v-bind:style="{color: color, fontSize: fontSize+'px' }"
6、計算屬性computed和 監聽watch 的區別
計算屬性是自動監聽依賴值的變化,從而動態返回內容,監聽是一個過程,在監聽的值變化時,可以觸發一個回撥,並做一些事情。
所以區別來源於用法,只是需要動態值,那就用計算屬性;需要知道值的改變後執行業務邏輯,才用 watch,用反或混用雖然可行,但都是不正確的用法。
1、computed 是一個物件時,它有哪些選項?
有get和set兩個選項
2、computed 和 methods 有什麼區別?
methods是一個方法,它可以接受引數,而computed不能,computed是可以快取的,methods不會
3、computed 是否能依賴其它元件的資料?
computed可以依賴其他computed,甚至是其他元件的data
4、watch 是一個物件時,它有哪些選項?
handler
deep 是否深度
immeditate 是否立即執行
總結
當有一些資料需要隨著另外一些資料變化時,建議使用computed。
當有一個通用的響應資料變化的時候,要執行一些業務邏輯或非同步操作的時候建議使用watcher
7、Vue的路由實現:hash模式 和 history模式
hash模式:在瀏覽器中符號“#”,#以及#後面的字元稱之為hash,用window.location.hash讀取;
特點:hash雖然在URL中,但不被包括在HTTP請求中;用來指導瀏覽器動作,對服務端安全無用,hash不會重載入頁面。
hash 模式下,僅 hash 符號之前的內容會被包含在請求中,如 http://www.xxx.com,因此對於後端來說,即使沒有做到對路由的全覆蓋,也不會返回 404 錯誤。
history模式:history採用HTML5的新特性;且提供了兩個新方法:pushState(),replaceState()可以對瀏覽器歷史記錄棧進行修改,以及popState事件的監聽到狀態變更。
history 模式下,前端的 URL 必須和實際向後端發起請求的 URL 一致,如 http://www.xxx.com/items/id。後端如果缺少對 /items/id 的路由處理,將返回 404 錯誤。
8、Vue與Angular以及React的區別?
(版本在不斷更新,以下的區別有可能不是很正確。我工作中只用到vue,對angular和react不怎麼熟)
1.與AngularJS的區別
相同點:
都支援指令:內建指令和自定義指令;都支援過濾器:內建過濾器和自定義過濾器;都支援雙向資料繫結;都不支援低端瀏覽器。
不同點:
AngularJS的學習成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比較簡單、直觀;在效能上,AngularJS依賴對資料做髒檢查,所以Watcher越多越慢;Vue.js使用基於依賴追蹤的觀察並且使用非同步佇列更新,所有的資料都是獨立觸發的。
2.與React的區別
相同點:
React採用特殊的JSX語法,Vue.js在元件開發中也推崇編寫.vue特殊檔案格式,對檔案內容都有一些約定,兩者都需要編譯後使用;中心思想相同:一切都是元件,元件例項之間可以巢狀;都提供合理的鉤子函式,可以讓開發者定製化地去處理需求;都不內建列數AJAX,Route等功能到核心包,而是以外掛的方式載入;在元件開發中都支援mixins的特性。
不同點:
React採用的Virtual DOM會對渲染出來的結果做髒檢查;Vue.js在模板中提供了指令,過濾器等,可以非常方便,快捷地操作Virtual DOM。
9、事件修飾符
-
繫結一個原生的click事件: 加native,
-
其他事件修飾符:stop prevent self
-
組合鍵:click.ctrl.exact 只有ctrl被按下的時候才觸發
10、元件中 data 為什麼是函式
為什麼元件中的 data 必須是一個函式,然後 return 一個物件,而 new Vue 例項裡,data 可以直接是一個物件?
因為元件是用來複用的,JS 裡物件是引用關係,這樣作用域沒有隔離,而 new Vue 的例項,是不會被複用的,因此不存在引用物件的問題
對於Vue是一套漸進式框架的理解
11、漸進式代表的含義是:主張最少。
Vue可能有些方面是不如React,不如Angular,但它是漸進的,沒有強主張,你可以在原有大系統的上面,把一兩個元件改用它實現,當jQuery用;也可以整個用它全家桶開發,當Angular用;還可以用它的檢視,搭配你自己設計的整個下層用。你可以在底層資料邏輯的地方用OO和設計模式的那套理念,也可以函式式,都可以,它只是個輕量檢視而已,只做了自己該做的事,沒有做不該做的事,僅此而已。
漸進式的含義,我的理解是:沒有多做職責之外的事。
12、vue.js的兩個核心是什麼?
資料驅動和元件化
13、vue中 key
值的作用
使用key來給每個節點做一個唯一標識
key的作用主要是為了高效的更新虛擬DOM。另外vue中在使用相同標籤名元素的過渡切換時,也會使用到key屬性,其目的也是為了讓vue可以區分它們,否則vue只會替換其內部屬性而不會觸發過渡效果。
14、v-for 與 v-if 的優先順序
v-for的優先順序比v-if高
15、元件
1、vue中子元件呼叫父元件的方法
第一種方法是直接在子元件中通過this.$parent.event來呼叫父元件的方法。
第二種方法是在子元件裡用$emit
向父元件觸發一個事件,父元件監聽這個事件就行了。
第三種是父元件把方法傳入子元件中,在子元件裡直接呼叫這個方法。
2、vue中父元件呼叫子元件的方法
父元件利用ref屬性操作子元件方法。
父:
<child ref="childMethod"></child>
子:
method: {
test() {
alert(1)
}
}
在父元件裡呼叫test即 this.$refs.childMethod.test()
3、vue元件之間傳值
(1)父元件給子元件傳值:
1.父元件呼叫子元件的時候動態繫結屬性
<parent :dataList='dataList'></parent>
2.子元件定義props接收動態繫結的屬性props: ['dataList']
3.子元件使用資料
(2)子元件主動獲取父子間的屬性和方法:
在子元件中使用this.$parent.屬性/this.$parent.方法。
(3)子元件給父元件傳值:
一、使用ref屬性
1.父元件呼叫子元件時繫結屬性ref
<parent :ref='parent'></parent>
2.在父元件中使用this.$refs.parent.屬性/this.$refs.parent.方法
二、使用$emit方法
1.子元件呼叫this.$emit('方法名‘,傳值)
2.父元件通過子元件繫結的'方法名'獲取傳值。
(4)vue頁面級元件之間傳值
1.使用vue-router通過跳轉連結帶引數傳參。
2.使用本地快取localStorge。
3.使用vuex資料管理傳值。
(5)說說vue的動態元件。
多個元件通過同一個掛載點進行元件的切換,is的值是哪個元件的名稱,那麼頁面就會顯示哪個元件。
(6)keep-alive內建元件的作用
可以讓當前元件或者路由不經歷建立和銷燬,而是進行快取,凡是被keep-alive元件包裹的元件,除了第一次以外。不會經歷建立和銷燬階段的。第一次建立後就會快取到快取當
(7)遞迴元件的用法
元件是可以在它們自己的模板中呼叫自身的。不過它們只能通過 name 選項來做這件事。首先我們要知道,既然是遞迴元件,那麼一定要有一個結束的條件,否則就會使用元件迴圈引用,最終出現“max stack size exceeded”的錯誤,也就是棧溢位。那麼,我們可以使用v-if="false"作為遞迴元件的結束條件。當遇到v-if為false時,元件將不會再進行渲染。
16、怎麼定義vue-router的動態路由?怎麼獲取傳過來的值?
動態路由的建立,主要是使用path屬性過程中,使用動態路徑引數,以冒號開頭,如下:
{
path: '/details/:id'
name: 'Details'
components: Details
}
訪問details目錄下的所有檔案,如果details/a,details/b等,都會對映到Details元件上。
當匹配到/details下的路由時,引數值會被設定到this.$route.params下,所以通過這個屬性可以獲取動態引數
this.$route.params.id
17、vue-router有哪幾種路由守衛?
全域性守衛:beforeEach
後置守衛:afterEach
全域性解析守衛:beforeResolve
路由獨享守衛:beforeEnter
18、$route和 $router的區別是什麼?
-
$router為VueRouter的例項,是一個全域性路由物件,包含了路由跳轉的方法、鉤子函式等。
-
$route 是路由資訊物件||跳轉的路由物件,每一個路由都會有一個route物件,是一個區域性物件,包含path,params,hash,query,fullPath,matched,name等路由資訊引數。
19、vue-router響應路由引數的變化
-
(1)用watch 檢測
-
(2)元件內導航鉤子函式
20、 vue-router 傳參
(1)使用Params:
-
只能使用name,不能使用path
-
引數不會顯示在路徑上
-
瀏覽器強制重新整理引數會被清空
(2)使用Query:
-
引數會顯示在路徑上,重新整理不會被清空
-
name 可以使用path路徑
21、不用Vuex會帶來什麼問題?
1、可維護性會下降,你要想修改資料,你得維護三個地方
2、可讀性會下降,因為一個元件裡的資料,你根本就看不出來是從哪來的
3、增加耦合,大量的上傳派發,會讓耦合性大大的增加,本來Vue用Component就是為了減少耦合,現在這麼用,和元件化的初衷相背。
22、vuex有哪幾種屬性?
有五種,分別是 State、 Getter、Mutation 、Action、 Module。
23、、vuex的State特性是?
一、Vuex就是一個倉庫,倉庫裡面放了很多物件。其中state就是資料來源存放地,對應於與一般Vue物件裡面的data
二、state裡面存放的資料是響應式的,Vue元件從store中讀取資料,若是store中的資料發生改變,依賴這個資料的元件也會發生更新
三、它通過mapState把全域性的 state 和 getters 對映到當前元件的 computed 計算屬性中
24、vuex的Getter特性是?
一、getters 可以對State進行計算操作,它就是Store的計算屬性
二、 雖然在元件內也可以做計算屬性,但是getters 可以在多元件之間複用
三、 如果一個狀態只在一個元件內使用,是可以不用getters
25、vuex的Mutation特性是?
一、Action 類似於 mutation,不同在於:
二、Action 提交的是 mutation,而不是直接變更狀態。
三、Action 可以包含任意非同步操作
26、Vue.js中ajax請求程式碼應該寫在元件的methods中還是vuex的actions中?
一、如果請求來的資料是不是要被其他元件公用,僅僅在請求的元件內使用,就不需要放入vuex 的state裡。
二、如果被其他地方複用,這個很大機率上是需要的,如果需要,請將請求放入action裡,方便複用,幷包裝成promise返回,在呼叫處用async await處理返回的資料。如果不要複用這個請求,那麼直接寫在vue檔案裡很方便。
27、vue雙向資料繫結原理、vue2和vue3原理的不同點
因為vue2.0 object.defineProperty只能劫持物件屬性,無法監控陣列下標的變化,導致通過資料下標新增的元素不能實時響應的弊端。為了解決這個問題,經vue內部處理後,可以使用push()、pop() 、shift()、unshift()、splice()、sort()、reverse()進行hack處理,所以其他陣列屬性也是監測不到,具有一定的侷限性。
因為object.defineProperty只能劫持物件屬性,從而需要對每個物件的每個屬性進行遍歷。vue2.0裡是通過遞迴+遍歷data物件來實現對資料的監控的,如果屬性值是物件的話,還需要深度遍歷。
而Vue3.0中的proxy不僅可以代理物件,還可以代理陣列,也可以代理動態新增的屬性,有13種劫持操作:
get 獲取某個key值 (接收2個引數,目標值和目標值key值)
set 設定某個key值 (目標值、目標的key值、要改變的值、改變前的原始值)
apply 使用in 操作符判斷某個key是否存在
deleteProperty 刪除一個property
defineProperty 定義一個新的property
感謝
萬能的網路