首頁  >  文章  >  web前端  >  九大vuejs常見面試題,你都會嗎?

九大vuejs常見面試題,你都會嗎?

PHPz
PHPz原創
2020-07-31 13:55:238366瀏覽

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, &#39;txt&#39;, {
        get: function () {
            return obj
        },
        set: function (newValue) {
            document.getElementById(&#39;txt&#39;).value = newValue
            document.getElementById(&#39;show&#39;).innerHTML = newValue
        }
    })
    document.addEventListener(&#39;keyup&#39;, 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的差異

答案:九大vuejs常見面試題,你都會嗎?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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn