做爲前端開發中現行最火的框架之一,Vue
在面試中出現的頻率不斷增長。基於此,總結了一些 Vue
方面常常出現的面試題,留給本身查看消化,也分享給有須要的小夥伴html
感興趣的小夥伴也能夠點擊 這裏,查看前端方面的其餘面試題,歡迎 star
關注前端
若是文章中有出現紕漏、錯誤之處,還請看到的小夥伴留言指正,先行謝過vue
如下 ↓node
vue
實現數據雙向綁定主要是:採用數據劫持結合發佈者-訂閱者模式的方式,經過Object.defineProperty()
來劫持各個屬性的setter
,getter
,在數據變更時發佈消息給訂閱者,觸發相應監聽回調
單向數據流: 顧名思義,數據流是單向的。數據流動方向能夠跟蹤,流動單一,追查問題的時候能夠更快捷。缺點就是寫起來不太方便。要使UI發生變動就必須建立各類action
來維護對應的state
雙向數據綁定:數據之間是相通的,將數據變動的操做隱藏在框架內部。優勢是在表單交互較多的場景下,會簡化大量與業務無關的代碼。缺點就是沒法追蹤局部狀態的變化,增長了出錯時
debug
的難度react
#
vue-router
默認使用 hash
模式,因此在路由加載的時候,項目中的 url
會自帶 #
。若是不想使用 #
, 可使用 vue-router
的另外一種模式 history
git
new Router({ mode: 'history', routes: [ ] })
須要注意的是,當咱們啓用history
模式的時候,因爲咱們的項目是一個單頁面應用,因此在路由跳轉的時候,就會出現訪問不到靜態資源而出現404
的狀況,這時候就須要服務端增長一個覆蓋全部狀況的候選資源:若是URL
匹配不到任何靜態資源,則應該返回同一個index.html
頁面
MVC
特色:github
View
傳送指令到 Controller
Controller
完成業務邏輯後,要求 Model
改變狀態Model
將新的數據發送到 View
,用戶獲得反饋全部通訊都是單向的web
MVVM
特色:面試
View
的變更,自動反映在 ViewModel
,反之亦然具體請移步 這裏算法
vue實例有一個完整的生命週期,生命週期也就是指一個實例從開始建立到銷燬的這個過程
beforeCreate()
在實例建立之間執行,數據未加載狀態created()
在實例建立、數據加載後,能初始化數據,dom
渲染以前執行beforeMount()
虛擬dom
已建立完成,在數據渲染前最後一次更改數據mounted()
頁面、數據渲染完成,真實dom
掛載完成beforeUpadate()
從新渲染以前觸發updated()
數據已經更改完成,dom
也從新 render
完成,更改數據會陷入死循環beforeDestory()
和 destoryed()
前者是銷燬前執行(實例仍然徹底可用),後者則是銷燬後執行父組件向子組件通訊
子組件經過 props
屬性,綁定父組件數據,實現雙方通訊
子組件向父組件通訊
將父組件的事件在子組件中經過 $emit
觸發
非父子組件、兄弟組件之間的數據傳遞
/*新建一個Vue實例做爲中央事件總嫌*/ let event = new Vue(); /*監聽事件*/ event.$on('eventName', (val) => { //......do something }); /*觸發事件*/ event.$emit('eventName', 'this is a message.')
Vuex 數據管理
路由就是用來跟後端服務器進行交互的一種方式,經過不一樣的路徑,來請求不一樣的資源,請求不一樣的頁面是路由的其中一種功能
參考 這裏
使用了v-if
的時候,若是值爲false
,那麼頁面將不會有這個html
標籤生成。
v-show
則是無論值爲true
仍是false
,html
元素都會存在,只是CSS
中的display
顯示或隱藏
$router
爲VueRouter
實例,想要導航到不一樣URL
,則使用$router.push
方法
$route
爲當前router
跳轉對象裏面能夠獲取name
、path
、query
、params
等
$nextTick
是在下次DOM
更新循環結束以後執行延遲迴調,在修改數據以後使用$nextTick
,則能夠在回調中獲取更新後的DOM
具體可參考官方文檔 深刻響應式原理
由於js自己的特性帶來的,若是data
是一個對象,那麼因爲對象自己屬於引用類型,當咱們修改其中的一個屬性時,會影響到全部Vue實例的數據。若是將data
做爲一個函數返回一個對象,那麼每個實例的data
屬性都是獨立的,不會相互影響了
咱們能夠將同一函數定義爲一個 method
或者一個計算屬性。對於最終的結果,兩種方式是相同的
不一樣點:
computed: 計算屬性是基於它們的依賴進行緩存的,只有在它的相關依賴發生改變時纔會從新求值對於
method
,只要發生從新渲染,method
調用總會執行該函數
jQuery 專一視圖層,經過操做 DOM 去實現頁面的一些邏輯渲染; Vue 專一於數據層,經過數據的雙向綁定,最終表如今 DOM 層面,減小了 DOM 操做Vue 使用了組件化思想,使得項目子集職責清晰,提升了開發效率,方便重複利用,便於協同開發
全局註冊
// 註冊一個全局自定義指令 `v-focus` Vue.directive('focus', { // 當被綁定的元素插入到 DOM 中時…… inserted: function (el) { // 聚焦元素 el.focus() } })
局部註冊
directives: { focus: { // 指令的定義 inserted: function (el) { el.focus() } } }
參考 官方文檔-自定義指令
能夠用全局方法Vue.filter()
註冊一個自定義過濾器,它接收兩個參數:過濾器ID
和過濾器函數。過濾器函數以值爲參數,返回轉換後的值
Vue.filter('reverse', function (value) { return value.split('').reverse().join('') })
<!-- 'abc' => 'cba' --> <span v-text="message | reverse"></span>
過濾器也一樣接受全局註冊和局部註冊
keep-alive
是Vue
內置的一個組件,可使被包含的組件保留狀態,或避免從新渲染
<keep-alive> <component> <!-- 該組件將被緩存! --> </component> </keep-alive>
可使用API提供的props,實現組件的動態緩存
具體參考 官方API
key
的特殊屬性主要用在Vue
的虛擬DOM
算法,在新舊nodes
對比時辨識VNodes
。若是不使用key
,Vue
會使用一種最大限度減小動態元素而且儘量的嘗試修復/再利用相同類型元素的算法。使用key
,它會基於key
的變化從新排列元素順序,而且會移除key
不存在的元素。有相同父元素的子元素必須有獨特的
key
。重複的key
會形成渲染錯誤
具體參考 官方API
數據驅動 組件系統
優勢:
缺點:
vue-router
能夠經過 params
與 query
進行傳參
// 傳遞 this.$router.push({path: './xxx', params: {xx:xxx}}) this.$router.push({path: './xxx', query: {xx:xxx}}) // 接收 this.$route.params this.$route.query
params
是路由的一部分,必需要有。query
是拼接在 url
後面的參數,沒有也不要緊params
不設置的時候,刷新頁面或者返回參數會丟,query
則不會有這個問題整理的過程也是從新梳理知識點的過程,途中會發現不少本身理解不是很到位的東西,也算是一種收穫吧
後面會一直不按期更新一些其餘方面的面試題或者遇到的有趣的東西,感興趣的小夥伴能夠關注哦
完整版面試題 GitHub地址
碰見更優秀的本身,從如今開始!
以上