11個vuejs常見面試題,你都會嗎?來自vue面試題專欄
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 透過雙向資料綁定把View 層和Model 層連接了起來,而View 和Model 之間的同步工作完全是自動的,無需人為干涉,因此開發者只需關注業務邏輯,不需要手動操作DOM, 不需要關注資料狀態的同步問題,複雜的資料狀態維護完全由MVVM 來統一管理。
在資料觀測與初始化事件尚未開始
完成資料觀測,屬性和方法的運算,初始化事件,el屬性還沒有顯示出來
在掛載開始之前被調用,相關的render函數首次被呼叫。實例已完成以下的設定:編譯模板,把data裡面的資料和模板產生html。注意此時還沒有掛載html到頁面上。
在el 被新建立的 vm.$el 取代,並掛載到實例上去之後呼叫。實例已完成以下的配置:用上面編譯好的html內容取代el屬性指向的DOM物件。完成模板中的html渲染到html頁面。此過程中進行ajax互動。
在資料更新之前調用,發生在虛擬DOM重新渲染和打補丁之前。可以在該鉤子中進一步更改狀態,不會觸發附加的重渲染過程。
在由於資料變更導致的虛擬DOM重新渲染和打補丁之後呼叫。呼叫時,元件DOM已經更新,所以可以執行依賴DOM的操作。然而在大多數情況下,應避免在此期間更改狀態,因為這可能會導致更新無限循環。該鉤子在伺服器端渲染期間不被調用。
在實例銷毀之前呼叫。實例仍然完全可用。
在實例銷毀之後呼叫。呼叫後,所有的事件監聽器會被移除,所有的子實例也會被銷毀。該鉤子在伺服器端渲染期間不被調用。
答案: Vue 實例從創建到銷毀的過程,就是生命週期。從開始建立、初始化資料、編譯模板、掛載Dom→渲染、更新→渲染、銷毀等一系列過程,稱為 Vue 的生命週期。
答案:它的生命週期中有多個事件鉤子,讓我們在控制整個Vue實例的過程時更容易形成好的邏輯。
答案:它可以總共分為8個階段:建立前/後, 載入前/後,更新前/後,銷毀前/銷毀後。
答:會觸發 下面這幾個beforeCreate, created, beforeMount, mounted 。
答:DOM 渲染在 mounted 中就已經完成了。
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變更雙向綁定效果。
<p> <input> </p><p></p> <script> var obj = {} Object.defineProperty(obj, 'txt', { get: function () { return obj }, set: function (newValue) { document.getElementById('txt').value = newValue document.getElementById('show').innerHTML = newValue } }) document.addEventListener('keyup', function (e) { obj.txt = e.target.value }) </script>
1.父元件與子元件傳值
父元件傳給子元件:子元件透過props方法接受資料;
子元件傳給父元件:$emit方法傳遞參數
2.非父子元件間的資料傳遞,兄弟元件傳值
eventBus,就是建立一個事件中心,相當於中轉站,可以用它來傳遞事件和接收事件。項目比較小時,用這個比較適合。 (雖然也有不少人推薦直接用VUEX,具體來說看需求咯。技術只是手段,目的達到才是王道。)
在瀏覽器中符號“#”,#以及#後面的字元稱之為hash,用window.location.hash讀取;
特點:hash雖然在URL中,但不被包括在HTTP請求中;用來指導瀏覽器動作,對服務端安全無用,hash不會重載入頁面。
hash 模式下,僅hash 符號之前的內容會被包含在請求中,如http://www.xxx.com,因此對於後端來說,即使沒有做到對路由的全覆蓋,也不會回傳404 錯誤。
history採用HTML5的新特性;且提供了兩個新方法:pushState(),replaceState()可以對瀏覽器歷史記錄堆疊進行修改,以及popState事件的監聽到狀態變更。
history 模式下,前端的 URL 必須和實際向後端發起請求的 URL 一致,如 http://www.xxx.com/items/id。後端如果缺少 /items/id 的路由處理,將傳回 404 錯誤。 Vue-Router 官網裡如此描述:「不過這種模式要玩好,還需要後台配置支援…所以呢,你要在服務端增加一個覆蓋所有情況的候選資源:如果URL 匹配不到任何靜態資源,則應該回傳同一個index.html 頁面,這個頁面就是你app 依賴的頁面。」
只用來讀取的狀態集中放在store中;改變狀態的方式是提交mutations,這是個同步的事物; 非同步邏輯應該封裝在action中。
在main.js引入store,注入。新建了一個目錄store,….. export 。
場景有:單頁應用程式中,元件之間的狀態、音樂播放、登入狀態、加入購物車
Vuex 使用單一狀態樹,即每個應用程式將僅包含一個store 實例,但單一狀態樹和模組化並不衝突。存放的資料狀態,不可以直接修改裡面的資料。
mutations定義的方法動態修改Vuex 的 store 中的狀態或資料。
類似vue的計算屬性,主要用來過濾一些資料。
actions可以理解為透過將mutations裡面處裡資料的方法變成可非同步的處理資料的方法,簡單的說就是非同步操作資料。 view 層透過 store.dispath 來分發 action。
專案特別複雜的時候,可以讓每個模組擁有自己的state、mutation、action、getters,使得結構非常清晰,方便管理。
//store实例 const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { increment (context) { context.commit('increment') } } })
var app = new Vue({ el: '#app', data: { }, // 创建指令(可以多个) directives: { // 指令名称 dir1: { inserted(el) { // 指令中第一个参数是当前使用指令的DOM console.log(el); // 对DOM进行操作 el.style.width = '200px'; el.style.height = '200px'; el.style.background = '#000'; } } } })
Vue.directive('dir2', { inserted(el) { console.log(el); } })
<p> </p><p></p> <p></p>
<p> <input> {{msg| capitalize }} </p>
var vm=new Vue({ el:"#app", data:{ msg:'' }, filters: { capitalize: function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } })
Vue.filter('capitalize', function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) })
答:在style標籤中寫入scoped即可例如:
答案:v-if是否依照條件渲染,v-show是display的block或none;
答案:router是「路由實例」物件包含了路由的跳轉方法,鉤子函數等。
答案:資料驅動、元件系統
#答案:v-for 、 v-if 、v-bind、v-on 、v-show、v-else
答案:.prevent: 提交事件不再重載頁面;.stop: 阻止點擊事件冒泡;.self: 當事件發生在該元素本身而不是子元素的時候會觸發;.capture : 事件偵聽,事件發生的時候會呼叫
答案:可以
答案:當 Vue.js 用 v-for 正在更新已渲染過的元素清單時,它預設用「就地重複使用」策略。如果資料項目的順序被改變,Vue 將不會移動 DOM 元素來匹配資料項目的順序, 而是簡單地複用此處每個元素,並且確保它在特定索引下顯示已被渲染過的每個元素。 key的作用主要是為了高效率的更新虛擬DOM。
答:在模板中放入太多的邏輯會讓模板過重且難以維護,在需要對資料進行複雜處理,且可能多次使用的情況下,盡量採取計算屬性的方式。好處:①使得資料處理結構清晰;②依賴數據,資料更新,處理結果自動更新;③計算屬性內部this指向vm實例;④在template呼叫時,直接寫計算屬性名即可;⑤常用的是getter方法,取得數據,也可以使用set方法改變數據;⑥相較於methods,不管依賴的數據變不變,methods都會重新計算,但是依賴數據不變的時候computed從緩存中獲取,不會重新計算。
#答案:優點:Vue 的目標是透過盡可能簡單的API 實現回應的資料綁定和組合的視圖元件,核心是一個回應的資料綁定係統。 MVVM、資料驅動、元件化、輕量、簡潔、有效率、快速、模組友善。
缺點:不支援低版本的瀏覽器,最低只支援到IE9;不利於SEO的最佳化(如果要支援SEO,建議透過服務端來進行渲染元件);第一次載入首頁耗時相對長一些;不可以使用瀏覽器的導航按鈕需要自行實現前進、後退。
答案:在router 目錄下的index.js 檔案中,對path 屬性加上/:id ,使用router 物件的params.id 取得。
以上是九大vuejs常見面試題,你都會嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!