vue面試題匯總
1.vuex的作用?
vuex是一個專門為vue.js應用程序開發的狀態管理模式
vuex可以幫助我們管理共享狀態,也就是管理全局變量
vuex的幾個核心概念:
vuex使用一個store對象管理應用的狀態,一個store包括:state,getter,mutation,action四個屬性
state:state意為'狀態',是vuex狀態管理的數據源
getter:getter的作用與filters有一些相似,可以將state進行過濾后輸出
mutation:mutation是vuex中改變state的唯一途徑,並且只能同步操作
action:一些對state的異步操作可以放在action中,並通過在action提交mutaion變更狀態
module:當store對象過於龐大時,可以根據具體的業務需求分為多個module
我們可以在組件中觸發 Action,Action 則會提交 Mutation,Mutaion 會對 State 進行修改,組件再根據 State 、Getter 渲染頁面
2.vue中的路由攔截器的作用?
路由攔截,權限設置
例如:當用戶沒有登錄權限的時候就會跳轉到登錄頁面,用到的字段requireAuth:true
3.axios的作用?
vue中的ajax,用於向后台發起請求
特點:
從瀏覽器中創建XMLHttpRequests
從node.js創建http請求
支持Promise API
攔截請求和響應
轉換請求數據和響應數據
取消請求
自動轉換json數據
客戶端支持防御XSRF
promise:
一個對象用來傳遞異步操作的信息
promise的出現主要是解決地獄回調的問題,無需多次嵌套
本質:分離異步數據獲取和業務
攔截器分為請求攔截器和響應攔截器
#請求攔截器
axios.interceptors.request.use(function(config){
return config;
},function(error){
return Promise.reject(error);
});
#響應攔截器
axios.interceptors.response.use(function(response){
return response;
},function(error){
return Promise.reject(error);
});
4.列舉vue的常見指令。
1.文本插值:{{}} Mustache
<div id='app'>
{{message}}
</div>
2.DOM屬性綁定:v-bind
<div id='app-2'>
<span v-bind:title='message'>
鼠標懸停幾秒鍾查看此處動態綁定的提示信息
</span>
</div>
3.指令綁定一個事件監聽器:v-on
<div id='app-5'>
<p>{{message}}</p>
<button v-on:click='reverseMessage'>逆轉消息</button>
</div>
4.實現表單輸入和應用狀態之間的雙向綁定:v-model
<div id='app-6'>
<p>{{message}}</p>
<input v-model='message'>
</div>
5.控制切換一個元素的顯示:v-if和v-else
<div id='app-3'>
<p v-if='seen'>現在你看到我了</p>
</div>
6.列表渲染:v-for
<div id='app-4'>
<ol>
<li v-for='todo in todos'>
{{todo.text}}
</li>
</ol>
5.列舉Http請求中常見的請求方式?
get
向特定的路徑資源發出請求,數據暴露在url中
post
向指定路徑資源提交數據進行處理請求,數據包含在請求體中
options
返回服務器針對特定資源所支持的http請求方法,允許客戶端查看,測試服務器性能
head
向服務器與get請求相一致的響應,響應體不會返回,可以不必傳輸整個響應內容
put
從客戶端向服務器端傳送的數據取代指定的文檔的內容
delete
請求服務器刪除指定的頁面
trace
回顯服務器收到的請求,主要用於測試或者診斷
connect
http/1.1協議中預留給能夠將連接改為管道方式的代理服務
6.對於MVVM的理解
MVVM 是 Model-View-ViewModel 的縮寫。
Model代表數據模型,也可以在Model中定義數據修改和操作的業務邏輯。
View 代表UI 組件,它負責將數據模型轉化成UI 展現出來。
ViewModel 監聽模型數據的改變和控制視圖行為、處理用戶交互,簡單理解就是一個同步View 和 Model的對象,連接Model和View。
viewmodel和model實現雙向數據綁定
7.Vue的生命周期
1.什么是vue生命周期?
答: Vue 實例從創建到銷毀的過程,就是生命周期。從開始創建、初始化數據、編譯模板、掛載Dom→渲染、更新→渲染、銷毀等一系列過程,稱之為 Vue 的生命周期。
2.vue生命周期的作用是什么?
答:它的生命周期中有多個事件鈎子,讓我們在控制整個Vue實例的過程時更容易形成好的邏輯。
3.vue生命周期總共有幾個階段?
答:它可以總共分為8個階段:創建前/后, 載入前/后,更新前/后,銷毀前/銷毀后。
4.第一次頁面加載會觸發哪幾個鈎子?
答:會觸發 下面這幾個beforeCreate, created, beforeMount, mounted 。
5.DOM 渲染在 哪個周期中就已經完成?
答:DOM 渲染在 mounted 中就已經完成了。
8.Vue實現數據雙向綁定的原理:Object.defineProperty()
采用數據劫持結合發布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變動時發布消息給訂閱者,觸發相應監聽回調。
9.Vue組件間的參數傳遞
1.父組件與子組件傳值
父組件傳給子組件:子組件通過props方法接受數據;
子組件傳給父組件:$emit方法傳遞參數
2.非父子組件間的數據傳遞,兄弟組件傳值
eventBus,就是創建一個事件中心,相當於中轉站,可以用它來傳遞事件和接收事件。項目比較小時,用這個比較合適。(雖然也有不少人推薦直接用VUEX,具體來說看需求咯。技術只是手段,目的達到才是王道。)
10.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 依賴的頁面。”
11.vue路由的鈎子函數
首頁可以控制導航跳轉,beforeEach,afterEach等,一般用於頁面title的修改。一些需要登錄才能調整頁面的重定向功能。
beforeEach主要有3個參數to,from,next:
to:route即將進入的目標路由對象,
from:route當前導航正要離開的路由
next:function一定要調用該方法resolve這個鈎子。執行效果依賴next方法的調用參數。可以控制網頁的跳轉。
12.vue-cli如何新增自定義指令?
1.創建局部指令 var app = new Vue({ el: '#app', data: { }, // 創建指令(可以多個) directives: { // 指令名稱 dir1: { inserted(el) { // 指令中第一個參數是當前使用指令的DOM console.log(el); console.log(arguments); // 對DOM進行操作 el.style.width = '200px'; el.style.height = '200px'; el.style.background = '#000'; } } } }) 2.全局指令 Vue.directive('dir2', { inserted(el) { console.log(el); } }) 3.指令的使用 <div id="app"> <div v-dir1></div> <div v-dir2></div> </div>
13.vue如何自定義一個過濾器?
html代碼: <div id="app"> <input type="text" v-model="msg" /> {{msg| capitalize }} </div> 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) }) 過濾器接收表達式的值 (msg) 作為第一個參數。capitalize 過濾器將會收到 msg的值作為第一個參數。
14.對keep-alive 的了解?
keep-alive是 Vue 內置的一個組件,可以使被包含的組件保留狀態,或避免重新渲染。 在vue 2.1.0 版本之后,keep-alive新加入了兩個屬性: include(包含的組件緩存) 與 exclude(排除的組件不緩存,優先級大於include) 。 使用方法 <keep-alive include='include_components' exclude='exclude_components'> <component> <!-- 該組件是否緩存取決於include和exclude屬性 --> </component> </keep-alive> 參數解釋 include - 字符串或正則表達式,只有名稱匹配的組件會被緩存 exclude - 字符串或正則表達式,任何名稱匹配的組件都不會被緩存 include 和 exclude 的屬性允許組件有條件地緩存。二者都可以用“,”分隔字符串、正則表達式、數組。當使用正則或者是數組時,要記得使用v-bind 。 使用示例 <!-- 逗號分隔字符串,只有組件a與b被緩存。 --> <keep-alive include="a,b"> <component></component> </keep-alive> <!-- 正則表達式 (需要使用 v-bind,符合匹配規則的都會被緩存) --> <keep-alive :include="/a|b/"> <component></component> </keep-alive> <!-- Array (需要使用 v-bind,被包含的都會被緩存) --> <keep-alive :include="['a', 'b']"> <component></component> </keep-alive>
15.v-if 和 v-show 區別
答:v-if按照條件是否渲染,v-show是display的block或none;
16.vue幾種常用的指令
答:v-for 、 v-if 、v-bind、v-on、v-show、v-else
17.怎么定義 vue-router 的動態路由? 怎么獲取傳過來的值
答:在 router 目錄下的 index.js 文件中,對 path 屬性加上 /:id,使用 router 對象的 params.id 獲取。
18.vue常用的修飾符?
答:.prevent: 提交事件不再重載頁面;.stop: 阻止單擊事件冒泡;.self: 當事件發生在該元素本身而不是子元素的時候會觸發;.capture: 事件偵聽,事件發生的時候會調用
19.vue.js的兩個核心是什么?
答:數據驅動、組件系統
20.vue中 key 值的作用?
答:當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用“就地復用”策略。如果數據項的順序被改變,Vue 將不會移動 DOM 元素來匹配數據項的順序, 而是簡單復用此處每個元素,並且確保它在特定索引下顯示已被渲染過的每個元素。key的作用主要是為了高效的更新虛擬DOM。