這篇文章將為大家詳細(xì)講解有關(guān)Vue常見面試題有哪些,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出廣豐免費(fèi)做網(wǎng)站回饋大家。
MVVM 是 Model-View-ViewModel 的縮寫。
Model代表數(shù)據(jù)模型,也可以在Model中定義數(shù)據(jù)修改和操作的業(yè)務(wù)邏輯。
View代表UI 組件,它負(fù)責(zé)將數(shù)據(jù)模型轉(zhuǎn)化成UI 展現(xiàn)出來。
ViewModel監(jiān)聽模型數(shù)據(jù)的改變和控制視圖行為、處理用戶交互,簡單理解就是一個同步View 和 Model的對象,連接Model和View。
在MVVM架構(gòu)下,View 和 Model 之間并沒有直接的聯(lián)系,而是通過ViewModel進(jìn)行交互,Model 和 ViewModel 之間的交互是雙向的, 因此View 數(shù)據(jù)的變化會同步到Model中,而Model 數(shù)據(jù)的變化也會立即反應(yīng)到View 上。
ViewModel通過雙向數(shù)據(jù)綁定把 View 層和 Model 層連接了起來,而View 和 Model 之間的同步工作完全是自動的,無需人為干涉,因此開發(fā)者只需關(guān)注業(yè)務(wù)邏輯,不需要手動操作DOM, 不需要關(guān)注數(shù)據(jù)狀態(tài)的同步問題,復(fù)雜的數(shù)據(jù)狀態(tài)維護(hù)完全由 MVVM 來統(tǒng)一管理。
vue實(shí)現(xiàn)數(shù)據(jù)雙向綁定主要是:采用數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數(shù)據(jù)變動時(shí)發(fā)布消息給訂閱者,觸發(fā)相應(yīng)監(jiān)聽回調(diào)。當(dāng)把一個普通 Javascript 對象傳給 Vue 實(shí)例來作為它的 data 選項(xiàng)時(shí),Vue 將遍歷它的屬性,用 Object.defineProperty 將它們轉(zhuǎn)為 getter/setter。用戶看不到 getter/setter,但是在內(nèi)部它們讓 Vue 追蹤依賴,在屬性被訪問和修改時(shí)通知變化。
vue的數(shù)據(jù)雙向綁定 將MVVM作為數(shù)據(jù)綁定的入口,整合Observer,Compile和Watcher三者,通過Observer來監(jiān)聽自己的model的數(shù)據(jù)變化,通過Compile來解析編譯模板指令(vue中是用來解析 {{}}),最終利用watcher搭起observer和Compile之間的通信橋梁,達(dá)到數(shù)據(jù)變化 —>視圖更新;視圖交互變化(input)—>數(shù)據(jù)model變更雙向綁定效果。
父組件傳給子組件:子組件通過props方法接受數(shù)據(jù); 子組件傳給父組件:$emit方法傳遞參數(shù)
eventBus,就是創(chuàng)建一個事件中心,相當(dāng)于中轉(zhuǎn)站,可以用它來傳遞事件和接收事件。項(xiàng)目比較小時(shí),用這個比較合適。
v-show是css切換,v-if是完整的銷毀和重新創(chuàng)建。
頻繁切換時(shí)用v-show,運(yùn)行時(shí)較少改變時(shí)用v-if
v-if=‘false’ v-if是條件渲染,當(dāng)false的時(shí)候不會渲染
beforeCreate(創(chuàng)建前) 在數(shù)據(jù)觀測和初始化事件還未開始
created(創(chuàng)建后) 完成數(shù)據(jù)觀測,屬性和方法的運(yùn)算,初始化事件,$el屬性還沒有顯示出來
beforeMount(載入前) 在掛載開始之前被調(diào)用,相關(guān)的render函數(shù)首次被調(diào)用。實(shí)例已完成以下的配置:編譯模板,把data里面的數(shù)據(jù)和模板生成html。注意此時(shí)還沒有掛載html到頁面上。
mounted(載入后) 在el 被新創(chuàng)建的 vm.$el 替換,并掛載到實(shí)例上去之后調(diào)用。實(shí)例已完成以下的配置:用上面編譯好的html內(nèi)容替換el屬性指向的DOM對象。完成模板中的html渲染到html頁面中。此過程中進(jìn)行ajax交互。
beforeUpdate(更新前) 在數(shù)據(jù)更新之前調(diào)用,發(fā)生在虛擬DOM重新渲染和打補(bǔ)丁之前??梢栽谠撱^子中進(jìn)一步地更改狀態(tài),不會觸發(fā)附加的重渲染過程。
updated(更新后) 在由于數(shù)據(jù)更改導(dǎo)致的虛擬DOM重新渲染和打補(bǔ)丁之后調(diào)用。調(diào)用時(shí),組件DOM已經(jīng)更新,所以可以執(zhí)行依賴于DOM的操作。然而在大多數(shù)情況下,應(yīng)該避免在此期間更改狀態(tài),因?yàn)檫@可能會導(dǎo)致更新無限循環(huán)。該鉤子在服務(wù)器端渲染期間不被調(diào)用。
beforeDestroy(銷毀前) 在實(shí)例銷毀之前調(diào)用。實(shí)例仍然完全可用。
destroyed(銷毀后) 在實(shí)例銷毀之后調(diào)用。調(diào)用后,所有的事件監(jiān)聽器會被移除,所有的子實(shí)例也會被銷毀。該鉤子在服務(wù)器端渲染期間不被調(diào)用。
答: Vue 實(shí)例從創(chuàng)建到銷毀的過程,就是生命周期。從開始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載Dom→渲染、更新→渲染、銷毀等一系列過程,稱之為 Vue 的生命周期。
答:它的生命周期中有多個事件鉤子,讓我們在控制整個Vue實(shí)例的過程時(shí)更容易形成好的邏輯。
答:它可以總共分為8個階段:創(chuàng)建前/后, 載入前/后,更新前/后,銷毀前/銷毀后。
答:會觸發(fā) 下面這幾個beforeCreate, created, beforeMount, mounted 。
答:DOM 渲染在 mounted 中就已經(jīng)完成了。
對象方法 v-bind:class="{'orange': isRipe, 'green': isNotRipe}"
數(shù)組方法v-bind:class="[class1, class2]"
行內(nèi) v-bind:style="{color: color, fontSize: fontSize+'px' }"
計(jì)算屬性是自動監(jiān)聽依賴值的變化,從而動態(tài)返回內(nèi)容,監(jiān)聽是一個過程,在監(jiān)聽的值變化時(shí),可以觸發(fā)一個回調(diào),并做一些事情。 所以區(qū)別來源于用法,只是需要動態(tài)值,那就用計(jì)算屬性;需要知道值的改變后執(zhí)行業(yè)務(wù)邏輯,才用 watch,用反或混用雖然可行,但都是不正確的用法。
有g(shù)et和set兩個選項(xiàng)
methods是一個方法,它可以接受參數(shù),而computed不能,computed是可以緩存的,methods不會
computed可以依賴其他computed,甚至是其他組件的data
handler deep 是否深度 immeditate 是否立即執(zhí)行
總結(jié)
當(dāng)有一些數(shù)據(jù)需要隨著另外一些數(shù)據(jù)變化時(shí),建議使用computed。 當(dāng)有一個通用的響應(yīng)數(shù)據(jù)變化的時(shí)候,要執(zhí)行一些業(yè)務(wù)邏輯或異步操作的時(shí)候建議使用watcher
hash模式:在瀏覽器中符號“#”,#以及#后面的字符稱之為hash,用window.location.hash讀取; 特點(diǎn):hash雖然在URL中,但不被包括在HTTP請求中;用來指導(dǎo)瀏覽器動作,對服務(wù)端安全無用,hash不會重加載頁面。 hash 模式下,僅 hash 符號之前的內(nèi)容會被包含在請求中,如 http://www.xxx.com,因此對于后端來說,即使沒有做到對路由的全覆蓋,也不會返回 404 錯誤。
history模式:history采用HTML5的新特性;且提供了兩個新方法:pushState(),replaceState()可以對瀏覽器歷史記錄棧進(jìn)行修改,以及popState事件的監(jiān)聽到狀態(tài)變更。 history 模式下,前端的 URL 必須和實(shí)際向后端發(fā)起請求的 URL 一致,如 http://www.xxx.com/items/id。后端如果缺少對 /items/id 的路由處理,將返回 404 錯誤。
(版本在不斷更新,以下的區(qū)別有可能不是很正確。我工作中只用到vue,對angular和react不怎么熟)
1.與AngularJS的區(qū)別
相同點(diǎn):
都支持指令:內(nèi)置指令和自定義指令;都支持過濾器:內(nèi)置過濾器和自定義過濾器;都支持雙向數(shù)據(jù)綁定;都不支持低端瀏覽器。
不同點(diǎn):
AngularJS的學(xué)習(xí)成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比較簡單、直觀;在性能上,AngularJS依賴對數(shù)據(jù)做臟檢查,所以Watcher越多越慢;Vue.js使用基于依賴追蹤的觀察并且使用異步隊(duì)列更新,所有的數(shù)據(jù)都是獨(dú)立觸發(fā)的。
2.與React的區(qū)別
相同點(diǎn):
React采用特殊的JSX語法,Vue.js在組件開發(fā)中也推崇編寫.vue特殊文件格式,對文件內(nèi)容都有一些約定,兩者都需要編譯后使用;中心思想相同:一切都是組件,組件實(shí)例之間可以嵌套;都提供合理的鉤子函數(shù),可以讓開發(fā)者定制化地去處理需求;都不內(nèi)置列數(shù)AJAX,Route等功能到核心包,而是以插件的方式加載;在組件開發(fā)中都支持mixins的特性。
不同點(diǎn):
React采用的Virtual DOM會對渲染出來的結(jié)果做臟檢查;Vue.js在模板中提供了指令,過濾器等,可以非常方便,快捷地操作Virtual DOM。
綁定一個原生的click事件: 加native,
其他事件修飾符:stop prevent self
組合鍵:click.ctrl.exact 只有ctrl被按下的時(shí)候才觸發(fā)
為什么組件中的 data 必須是一個函數(shù),然后 return 一個對象,而 new Vue 實(shí)例里,data 可以直接是一個對象?
因?yàn)榻M件是用來復(fù)用的,JS 里對象是引用關(guān)系,這樣作用域沒有隔離,而 new Vue 的實(shí)例,是不會被復(fù)用的,因此不存在引用對象的問題
對于Vue是一套漸進(jìn)式框架的理解
Vue可能有些方面是不如React,不如Angular,但它是漸進(jìn)的,沒有強(qiáng)主張,你可以在原有大系統(tǒng)的上面,把一兩個組件改用它實(shí)現(xiàn),當(dāng)jQuery用;也可以整個用它全家桶開發(fā),當(dāng)Angular用;還可以用它的視圖,搭配你自己設(shè)計(jì)的整個下層用。你可以在底層數(shù)據(jù)邏輯的地方用OO和設(shè)計(jì)模式的那套理念,也可以函數(shù)式,都可以,它只是個輕量視圖而已,只做了自己該做的事,沒有做不該做的事,僅此而已。 漸進(jìn)式的含義,我的理解是:沒有多做職責(zé)之外的事。
數(shù)據(jù)驅(qū)動和組件化
key
值的作用使用key來給每個節(jié)點(diǎn)做一個唯一標(biāo)識
key的作用主要是為了高效的更新虛擬DOM。另外vue中在使用相同標(biāo)簽名元素的過渡切換時(shí),也會使用到key屬性,其目的也是為了讓vue可以區(qū)分它們,否則vue只會替換其內(nèi)部屬性而不會觸發(fā)過渡效果。
v-for的優(yōu)先級比v-if高
1、vue中子組件調(diào)用父組件的方法
第一種方法是直接在子組件中通過this.$parent.event來調(diào)用父組件的方法。
第二種方法是在子組件里用$emit
向父組件觸發(fā)一個事件,父組件監(jiān)聽這個事件就行了。
第三種是父組件把方法傳入子組件中,在子組件里直接調(diào)用這個方法。
2、vue中父組件調(diào)用子組件的方法
父組件利用ref屬性操作子組件方法。
父:子: method: { test() { alert(1) } } 在父組件里調(diào)用test即 this.$refs.childMethod.test()
3、vue組件之間傳值
(1)父組件給子組件傳值:
父組件調(diào)用子組件的時(shí)候動態(tài)綁定屬性
子組件定義props接收動態(tài)綁定的屬性props: ['dataList']
子組件使用數(shù)據(jù)
(2)子組件主動獲取父子間的屬性和方法:
在子組件中使用this.$parent.屬性/this.$parent.方法。
(3)子組件給父組件傳值:
一、使用ref屬性
1.父組件調(diào)用子組件時(shí)綁定屬性ref
2.在父組件中使用this.$refs.parent.屬性/this.$refs.parent.方法
二、使用$emit方法
1.子組件調(diào)用this.$emit('方法名‘,傳值)
2.父組件通過子組件綁定的'方法名'獲取傳值。
(4)vue頁面級組件之間傳值
使用vue-router通過跳轉(zhuǎn)鏈接帶參數(shù)傳參。
使用本地緩存localStorge。
使用vuex數(shù)據(jù)管理傳值。
(5)說說vue的動態(tài)組件。
多個組件通過同一個掛載點(diǎn)進(jìn)行組件的切換,is的值是哪個組件的名稱,那么頁面就會顯示哪個組件。
(6)keep-alive內(nèi)置組件的作用
可以讓當(dāng)前組件或者路由不經(jīng)歷創(chuàng)建和銷毀,而是進(jìn)行緩存,凡是被keep-alive組件包裹的組件,除了第一次以外。不會經(jīng)歷創(chuàng)建和銷毀階段的。第一次創(chuàng)建后就會緩存到緩存當(dāng)
(7)遞歸組件的用法
組件是可以在它們自己的模板中調(diào)用自身的。不過它們只能通過 name 選項(xiàng)來做這件事。首先我們要知道,既然是遞歸組件,那么一定要有一個結(jié)束的條件,否則就會使用組件循環(huán)引用,最終出現(xiàn)“max stack size exceeded”的錯誤,也就是棧溢出。那么,我們可以使用v-if="false"作為遞歸組件的結(jié)束條件。當(dāng)遇到v-if為false時(shí),組件將不會再進(jìn)行渲染。
動態(tài)路由的創(chuàng)建,主要是使用path屬性過程中,使用動態(tài)路徑參數(shù),以冒號開頭,如下:
{ path: '/details/:id' name: 'Details' components: Details }
訪問details目錄下的所有文件,如果details/a,details/b等,都會映射到Details組件上。
當(dāng)匹配到/details下的路由時(shí),參數(shù)值會被設(shè)置到this.$route.params下,所以通過這個屬性可以獲取動態(tài)參數(shù)
this.$route.params.id
全局守衛(wèi):beforeEach
后置守衛(wèi):afterEach
全局解析守衛(wèi):beforeResolve
路由獨(dú)享守衛(wèi):beforeEnter
$router為VueRouter的實(shí)例,是一個全局路由對象,包含了路由跳轉(zhuǎn)的方法、鉤子函數(shù)等。
$route 是路由信息對象||跳轉(zhuǎn)的路由對象,每一個路由都會有一個route對象,是一個局部對象,包含path,params,hash,query,fullPath,matched,name等路由信息參數(shù)。
(1)用watch 檢測
(2)組件內(nèi)導(dǎo)航鉤子函數(shù)
只能使用name,不能使用path
參數(shù)不會顯示在路徑上
瀏覽器強(qiáng)制刷新參數(shù)會被清空
參數(shù)會顯示在路徑上,刷新不會被清空
name 可以使用path路徑
1、可維護(hù)性會下降,你要想修改數(shù)據(jù),你得維護(hù)三個地方
2、可讀性會下降,因?yàn)橐粋€組件里的數(shù)據(jù),你根本就看不出來是從哪來的
3、增加耦合,大量的上傳派發(fā),會讓耦合性大大的增加,本來Vue用Component就是為了減少耦合,現(xiàn)在這么用,和組件化的初衷相背。
有五種,分別是 State、 Getter、Mutation 、Action、 Module。
1、Vuex就是一個倉庫,倉庫里面放了很多對象。其中state就是數(shù)據(jù)源存放地,對應(yīng)于與一般Vue對象里面的data
2、state里面存放的數(shù)據(jù)是響應(yīng)式的,Vue組件從store中讀取數(shù)據(jù),若是store中的數(shù)據(jù)發(fā)生改變,依賴這個數(shù)據(jù)的組件也會發(fā)生更新
3、它通過mapState把全局的 state 和 getters 映射到當(dāng)前組件的 computed 計(jì)算屬性中
1、getters 可以對State進(jìn)行計(jì)算操作,它就是Store的計(jì)算屬性
2、 雖然在組件內(nèi)也可以做計(jì)算屬性,但是getters 可以在多組件之間復(fù)用
3、 如果一個狀態(tài)只在一個組件內(nèi)使用,是可以不用getters
1、Action 類似于 mutation,不同在于:
2、Action 提交的是 mutation,而不是直接變更狀態(tài)。
3、Action 可以包含任意異步操作
1、如果請求來的數(shù)據(jù)是不是要被其他組件公用,僅僅在請求的組件內(nèi)使用,就不需要放入vuex 的state里。
2、如果被其他地方復(fù)用,這個很大幾率上是需要的,如果需要,請將請求放入action里,方便復(fù)用,并包裝成promise返回,在調(diào)用處用async await處理返回的數(shù)據(jù)。如果不要復(fù)用這個請求,那么直接寫在vue文件里很方便。
因?yàn)関ue2.0 object.defineProperty只能劫持對象屬性,無法監(jiān)控?cái)?shù)組下標(biāo)的變化,導(dǎo)致通過數(shù)據(jù)下標(biāo)添加的元素不能實(shí)時(shí)響應(yīng)的弊端。為了解決這個問題,經(jīng)vue內(nèi)部處理后,可以使用push()、pop() 、shift()、unshift()、splice()、sort()、reverse()進(jìn)行hack處理,所以其他數(shù)組屬性也是監(jiān)測不到,具有一定的局限性。
因?yàn)閛bject.defineProperty只能劫持對象屬性,從而需要對每個對象的每個屬性進(jìn)行遍歷。vue2.0里是通過遞歸+遍歷data對象來實(shí)現(xiàn)對數(shù)據(jù)的監(jiān)控的,如果屬性值是對象的話,還需要深度遍歷。
而Vue3.0中的proxy不僅可以代理對象,還可以代理數(shù)組,也可以代理動態(tài)添加的屬性,有13種劫持操作: get 獲取某個key值 (接收2個參數(shù),目標(biāo)值和目標(biāo)值key值) set 設(shè)置某個key值 (目標(biāo)值、目標(biāo)的key值、要改變的值、改變前的原始值) apply 使用in 操作符判斷某個key是否存在 deleteProperty 刪除一個property defineProperty 定義一個新的property
關(guān)于“Vue常見面試題有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。