毫無疑問,前端開發将會是2020年技術領域最火熱的專業至一
在入門學習前端的過程中你遇到的任何技術,行業之間的問題,你都可以加入我的學習交流裙。
前面++++++545++++++
中間++++++667++++++
後面++++++817++++++
或者點選此處即可添加。
作為前端開發中現行最火的架構之一,
Vue
在面試中出現的頻率不斷增加。基于此,總結了一些
Vue
方面經常出現的面試題,留給自己檢視消化,也分享給有需要的小夥伴
感興趣的小夥伴也可以點選 這裡,檢視前端方面的其他面試題,歡迎
star
關注
如果文章中有出現纰漏、錯誤之處,還請看到的小夥伴留言指正,先行謝過
以下 ↓
1. 說一下Vue的雙向綁定資料的原理
實作資料雙向綁定主要是:采用資料劫持結合釋出者-訂閱者模式的方式,通過
vue
來劫持各個屬性的
Object.defineProperty()
,
setter
,在資料變動時釋出消息給訂閱者,觸發相應監聽回調
getter
2. 解釋單向資料流和雙向資料綁定
單向資料流: 顧名思義,資料流是單向的。資料流動方向可以跟蹤,流動單一,追查問題的時候可以更快捷。缺點就是寫起來不太友善。要使UI發生變更就必須建立各種來維護對應的
action
雙向資料綁定:資料之間是相通的,将資料變更的操作隐藏在架構内部。優點是在表單互動較多的場景下,會簡化大量與業務無關的代碼。缺點就是無法追蹤局部狀态的變化,增加了出錯時
state
的難度
debug
3. Vue 如何去除url中的 #
#
vue-router
預設使用
hash
模式,是以在路由加載的時候,項目中的
url
會自帶
#
。如果不想使用
#
, 可以使用
vue-router
的另一種模式
history
new
Router({ mode:
'history', routes: [ ] })
需要注意的是,當我們啟用模式的時候,由于我們的項目是一個單頁面應用,是以在路由跳轉的時候,就會出現通路不到靜态資源而出現
history
的情況,這時候就需要服務端增加一個覆寫所有情況的候選資源:如果
404
比對不到任何靜态資源,則應該傳回同一個
URL
頁面
index.html
4. 對 MVC、MVVM的了解
MVC
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZ5kDZ3Q2MkJWOyMGZwkDNlZmN3gDN0IDZ4YjNmdTZ58CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
特點:
-
傳送指令到View
Controller
-
完成業務邏輯後,要求Controller
改變狀态Model
-
将新的資料發送到Model
,使用者得到回報View
所有通信都是單向的
MVVM
特點:
- 各部分之間的通信,都是雙向的
- 采用雙向綁定:
的變動,自動反映在View
,反之亦然ViewModel
具體請移步 這裡
5. 介紹虛拟DOM
參考這裡
6. vue生命周期的了解
vue執行個體有一個完整的生命周期,生命周期也就是指一個執行個體從開始建立到銷毀的這個過程
-
在執行個體建立之間執行,資料未加載狀态beforeCreate()
-
在執行個體建立、資料加載後,能初始化資料,created()
渲染之前執行dom
-
虛拟beforeMount()
已建立完成,在資料渲染前最後一次更改資料dom
-
頁面、資料渲染完成,真實mounted()
挂載完成dom
-
重新渲染之前觸發beforeUpadate()
-
資料已經更改完成,updated()
也重新dom
完成,更改資料會陷入死循環render
-
和beforeDestory()
前者是銷毀前執行(執行個體仍然完全可用),後者則是銷毀後執行destoryed()
7. 元件通信
父元件向子元件通信
子元件通過
props
屬性,綁定父元件資料,實作雙方通信
子元件向父元件通信
将父元件的事件在子元件中通過
$emit
觸發
非父子元件、兄弟元件之間的資料傳遞
let
event =
new
Vue();event.$on('eventName', (val) => { //......do something});event.$emit('eventName',
'this is a message.')
Vuex 資料管理
8. vue-router 路由實作
路由就是用來跟後端伺服器進行互動的一種方式,通過不同的路徑,來請求不同的資源,請求不同的頁面是路由的其中一種功能
參考 這裡
9. v-if 和 v-show 差別
使用了的時候,如果值為
v-if
,那麼頁面将不會有這個
false
标簽生成。
html
則是不管值為
v-show
還是
true
,
false
元素都會存在,隻是
html
中的
CSS
顯示或隐藏
display
10. $route和$router的差別
為
$router
執行個體,想要導航到不同
VueRouter
,則使用
URL
方法
$router.push
為目前
$route
跳轉對象裡面可以擷取
router
、
name
、
path
、
query
等
params
11. NextTick 是做什麼的
是在下次
$nextTick
更新循環結束之後執行延遲回調,在修改資料之後使用
DOM
,則可以在回調中擷取更新後的
$nextTick
DOM
具體可參考官方文檔 深入響應式原理
12. Vue 元件 data 為什麼必須是函數
因為js本身的特性帶來的,如果是一個對象,那麼由于對象本身屬于引用類型,當我們修改其中的一個屬性時,會影響到所有Vue執行個體的資料。如果将
data
作為一個函數傳回一個對象,那麼每一個執行個體的
data
屬性都是獨立的,不會互相影響了
data
13. 計算屬性computed 和事件 methods 有什麼差別
我們可以将同一函數定義為一個
method
或者一個計算屬性。對于最終的結果,兩種方式是相同的
不同點:
computed: 計算屬性是基于它們的依賴進行緩存的,隻有在它的相關依賴發生改變時才會重新求值對于,隻要發生重新渲染,
method
調用總會執行該函數
method
14. 對比 jQuery ,Vue 有什麼不同
jQuery 專注視圖層,通過操作 DOM 去實作頁面的一些邏輯渲染; Vue 專注于資料層,通過資料的雙向綁定,最終表現在 DOM 層面,減少了 DOM 操作Vue 使用了元件化思想,使得項目子集職責清晰,提高了開發效率,友善重複利用,便于協同開發
15. Vue 中怎麼自定義指令
全局注冊
// 注冊一個全局自定義指令 `v-focus`Vue.directive('focus', { // 當被綁定的元素插入到 DOM 中時……
inserted:
function
(el)
{ // 聚焦元素
el.focus() } })
局部注冊
directives: { focus: { // 指令的定義
inserted:
function
(el)
{ el.focus() } } }
參考 官方文檔-自定義指令
16. Vue 中怎麼自定義過濾器
可以用全局方法注冊一個自定義過濾器,它接收兩個參數:過濾器
Vue.filter()
和過濾器函數。過濾器函數以值為參數,傳回轉換後的值
ID
Vue.filter('reverse',
function
(value)
{
return
value.split('').reverse().join('') })<!-- 'abc' => 'cba' --><span
v-text="message | reverse"></span>
過濾器也同樣接受全局注冊和局部注冊
17. 對 keep-alive 的了解
是
keep-alive
内置的一個元件,可以使被包含的元件保留狀态,或避免重新渲染
Vue
<keep-alive>
<component>
<!-- 該元件将被緩存! -->
</component></keep-alive>
可以使用API提供的props,實作元件的動态緩存
具體參考 官方API
18. Vue 中 key 的作用
的特殊屬性主要用在
key
的虛拟
Vue
算法,在新舊
DOM
對比時辨識
nodes
。如果不使用
VNodes
,
key
會使用一種最大限度減少動态元素并且盡可能的嘗試修複/再利用相同類型元素的算法。使用
Vue
,它會基于
key
的變化重新排列元素順序,并且會移除
key
不存在的元素。有相同父元素的子元素必須有獨特的
key
。重複的
key
會造成渲染錯誤
key
具體參考 官方API
19. Vue 的核心是什麼
資料驅動 元件系統
20. vue 等單頁面應用的優缺點
優點:
- 良好的互動體驗
- 良好的前後端工作分離模式
- 減輕伺服器壓力
缺點:
- SEO難度較高
- 前進、後退管理
- 初次加載耗時多
21. vue-router 使用params與query傳參有什麼差別
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
原文作者:遊蕩de蝌蚪
原文出處:segmentfault
原文連結: https:// segmentfault.com/a/1190 000018634744