11個vuejs常見面試題,你都會嗎?來自vue面試題專欄
一、對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 透過雙向資料綁定把View 層和Model 層連接了起來,而View 和Model 之間的同步工作完全是自動的,無需人為干涉,因此開發者只需關注業務邏輯,不需要手動操作DOM, 不需要關注資料狀態的同步問題,複雜的資料狀態維護完全由MVVM 來統一管理。
二、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 中就已經完成了。
三、Vue實作資料雙向綁定的原則:Object.defineProperty()
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>
四、Vue元件間的參數傳遞
1.父元件與子元件傳值
父元件傳給子元件:子元件透過props方法接受資料;
子元件傳給父元件:$emit方法傳遞參數
2.非父子元件間的資料傳遞,兄弟元件傳值
eventBus,就是建立一個事件中心,相當於中轉站,可以用它來傳遞事件和接收事件。項目比較小時,用這個比較適合。 (雖然也有不少人推薦直接用VUEX,具體來說看需求咯。技術只是手段,目的達到才是王道。)
五、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 錯誤。 Vue-Router 官網裡如此描述:「不過這種模式要玩好,還需要後台配置支援…所以呢,你要在服務端增加一個覆蓋所有情況的候選資源:如果URL 匹配不到任何靜態資源,則應該回傳同一個index.html 頁面,這個頁面就是你app 依賴的頁面。」
六、vue路由的鉤子函數
只用來讀取的狀態集中放在store中;改變狀態的方式是提交mutations,這是個同步的事物; 非同步邏輯應該封裝在action中。
在main.js引入store,注入。新建了一個目錄store,….. export 。
場景有:單頁應用程式中,元件之間的狀態、音樂播放、登入狀態、加入購物車
state
Vuex 使用單一狀態樹,即每個應用程式將僅包含一個store 實例,但單一狀態樹和模組化並不衝突。存放的資料狀態,不可以直接修改裡面的資料。
mutations
mutations定義的方法動態修改Vuex 的 store 中的狀態或資料。
getters
類似vue的計算屬性,主要用來過濾一些資料。
action
actions可以理解為透過將mutations裡面處裡資料的方法變成可非同步的處理資料的方法,簡單的說就是非同步操作資料。 view 層透過 store.dispath 來分發 action。
modules
專案特別複雜的時候,可以讓每個模組擁有自己的state、mutation、action、getters,使得結構非常清晰,方便管理。
//store实例 const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { increment (context) { context.commit('increment') } } })
七、vue-cli如何新增自訂指令?
1.建立局部指令
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'; } } } })
2.全域指令
Vue.directive('dir2', { inserted(el) { console.log(el); } })
3.指令的使用
<p> </p><p></p> <p></p>
八、vue如何自訂一個篩選器?
html程式碼:
<p> <input> {{msg| capitalize }} </p>
JS程式碼:
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) })
9、一句話就能回答的面試題
1.css只在目前元件起作用
答:在style標籤中寫入scoped即可例如:
#2.v -if 和v-show 區別
答案:v-if是否依照條件渲染,v-show是display的block或none;
3.route和router的差異
答案:router是「路由實例」物件包含了路由的跳轉方法,鉤子函數等。
4.vue.js的兩個核心是什麼?
答案:資料驅動、元件系統
5.vue幾種常用的指令
#答案:v-for 、 v-if 、v-bind、v-on 、v-show、v-else
6.vue常用的修飾符?
答案:.prevent: 提交事件不再重載頁面;.stop: 阻止點擊事件冒泡;.self: 當事件發生在該元素本身而不是子元素的時候會觸發;.capture : 事件偵聽,事件發生的時候會呼叫
7.v-on 可以綁定多個方法嗎?
答案:可以
8.vue中 key 值的作用?
答案:當 Vue.js 用 v-for 正在更新已渲染過的元素清單時,它預設用「就地重複使用」策略。如果資料項目的順序被改變,Vue 將不會移動 DOM 元素來匹配資料項目的順序, 而是簡單地複用此處每個元素,並且確保它在特定索引下顯示已被渲染過的每個元素。 key的作用主要是為了高效率的更新虛擬DOM。
9.什麼是vue的計算屬性?
答:在模板中放入太多的邏輯會讓模板過重且難以維護,在需要對資料進行複雜處理,且可能多次使用的情況下,盡量採取計算屬性的方式。好處:①使得資料處理結構清晰;②依賴數據,資料更新,處理結果自動更新;③計算屬性內部this指向vm實例;④在template呼叫時,直接寫計算屬性名即可;⑤常用的是getter方法,取得數據,也可以使用set方法改變數據;⑥相較於methods,不管依賴的數據變不變,methods都會重新計算,但是依賴數據不變的時候computed從緩存中獲取,不會重新計算。
10.vue等單一頁面應用程式及其優缺點
#答案:優點:Vue 的目標是透過盡可能簡單的API 實現回應的資料綁定和組合的視圖元件,核心是一個回應的資料綁定係統。 MVVM、資料驅動、元件化、輕量、簡潔、有效率、快速、模組友善。
缺點:不支援低版本的瀏覽器,最低只支援到IE9;不利於SEO的最佳化(如果要支援SEO,建議透過服務端來進行渲染元件);第一次載入首頁耗時相對長一些;不可以使用瀏覽器的導航按鈕需要自行實現前進、後退。
11.怎麼定義vue-router 的動態路由? 怎麼取得傳過來的值
答案:在router 目錄下的index.js 檔案中,對path 屬性加上/:id ,使用router 物件的params.id 取得。
以上是九大vuejs常見面試題,你都會嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。