vue常見面試問題總結

1.談談你對MVVM的理解

定義:MVVM分爲Model、View、ViewModel 。

Model:代表數據模型,數據和業務邏輯都在Model層中定義,俗稱的data

View:代表UI視圖,負責數據的展示,俗稱的html部分,也叫模板部分

ViewModel:負責監聽Model中數據的改變並且控制視圖的更新,處理用戶交互操作,在這裏是作爲一個橋樑來連接Model和View

Model和View並無直接關聯,而是通過ViewModel來進行聯繫的,Model和ViewModel之間有着雙向數據綁定的聯繫。(ps:雙向數據綁定的原理什麼是雙向數據綁定看下文第3個問題),因此當Model中的數據改變時會觸發View層的刷新,View中由於用戶交互操作而改變的數據也會在Model中同步。

也就是以下兩個方向的轉化:

  • 將 Model 轉化成 View ,即將數據轉化成所看到的頁面。實現的方式是:數據綁定。例如:將後臺請求回來的數據展現在前端
  • 將 View 轉化成 Model ,即將所看到的頁面轉化成後端的數據。實現的方式是:DOM 事件監聽。例如:提交表單的數據

那麼mvvm與MVC的區別和聯繫?什麼是mvc?

2.談談你對MVC的理解,以及現有的新的MVVM與MVC的區別和聯繫

(1)MVC是Model-View- Controller的簡寫。即模型-視圖-控制器。M和V指的意思和MVVM中的M和V意思一樣。

Model:代表數據模型,數據和業務邏輯都在Model層中定義,俗稱的data

View:代表UI視圖,負責數據的展示,俗稱的html部分,也叫模板部分

Controller:即Controller指的是頁面業務邏輯。

使用MVC的目的就是將M和V的代碼分離。‘MVC是單向通信。也就是View跟Model,必須通過Controller來承上啓下。

(2)MVC和MVVM的區別並不是VM完全取代了C,ViewModel存在目的在於抽離Controller中展示的業務邏輯,而不是替代Controller,其它視圖操作業務等還是應該放在Controller中實現。也就是說ViewModel只是抽離了Controller中關於數據怎麼展示什麼時候展示如何展示的邏輯部分,沒有抽離關於系統的業務邏輯部分(ps寫代碼的人都曉得什麼是數據展示邏輯什麼是業務,業務邏輯)

(3)MVC和MVVM的聯繫在於本身是沒有mvvm的說法的,他本質上還是MVC,只不過是一直MVC的衍生模式

3.vue裏面什麼是雙向數據綁定?雙向數據綁定的原理是什麼

(1)定義:雙向數據綁定就是通俗的來說用戶在界面上輸入數據自動存入data裏面,data數據改變自動渲染在視圖上,不需要手動的去操作dom來獲取或者改變dom上的value,簡而言之就是:數據變化更新視圖,視圖變化更新數據

(2)雙向數據綁定的原理:

簡單來說就是通過監聽,當數據改變的時候去更新視圖,具體實現先看下圖:(ps,圖爲盜用的,想自己畫一個的,但是有現成的就拿來用了,一個意思,如有侵權請聯繫)

首先先介紹以下三個概念:

(1) Compile指令解析器,對每個dom元素節點的指令進行解析,替換模板數據,並綁定對應的更新函數,初始化相應的訂閱Watcher 。

(2) Watcher 訂閱者,連接 Observer 和 Compile 的橋樑,能夠訂閱並收到每個屬性變動的通知,執行指令綁定的相應回調函數,調用自身的update方法更新視圖。Watcher會訂閱信息自動添加到 消息訂閱器dep中

(3) Dep 消息訂閱器,內部維護了一個數組,用來收集訂閱者(Watcher),數據變動觸發notify 函數,再調用訂閱者的 update 方法。

完整的實現過程:

當一個vue組件實例化的時候也就是執行當執行 new Vue() 時會同時執行兩個操作:

1.vue會遍歷data中的屬性,並且用Object.defineProperty給他們加上getter/setter方法,使數據具有可觀測性,實現數據的監聽的功能,也就是監聽者Observer做的事情

(ps:Object.defineProperty方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。不懂參照:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

2.vue的指令編譯器Compile 會對元素節點進行指令解析,初始化視圖並且訂閱Watcher 來更新視圖, 此時Wather 會將自己添加到消息訂閱器中(Dep)。

這樣就完成了視圖的初始化

當數據發生變化的時候,監聽者Observer 中的 setter 方法被觸發,setter 會立即調用Dep.notify(),Dep 開始遍歷所有的訂閱者Watcher,遍歷到對於變化數據的Watcher就調用對應 訂閱者Watcher的 update 方法,訂閱者收到通知後對視圖進行相應的更新。

也就是由於雙向數據綁定採用了Object.defineProperty這個方法是es5的寫法,所以vue不支持 IE8 以及更低版本瀏覽器

4.請你說一下Vue的生命週期,以及每個生命週期可以進行哪些操作(關於Vue生命週期的其他提問)

答案請見另一篇博客總結:https://blog.csdn.net/qq_34645412/article/details/88063837

5.v-if和v-show的區別

兩者都是控制元素的顯示和不顯示的

區別:

(1)v-show 只是簡單的控制元素的 display 屬性,當條件爲false的時候dom是存在的相當於display=none,而 v-if 是條件渲染(條件爲真,元素將會被渲染,條件爲假,元素會被銷燬),當條件爲false的時候dom是不存的

(2) v-if 有更高的切換開銷,v-show 切換開銷小;由於(1)導致,因爲v-if切換的時候涉及dom重新渲染所以切換開銷會比較大,而v-show切換的時候只涉及display屬性的切換,不涉及dom的重新渲染

(3) v-show 有更高的首次渲染開銷,因爲v-show首次渲染的時候不僅要渲染dom,而 v-if 的首次渲染開銷要小的多;因爲只需要渲染dom,不需要渲染元素對應的屬性

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章