Vue面試題以及實(shí)際項(xiàng)目中遇到的坑

之前有提到,在經(jīng)歷了前端轉(zhuǎn)型之后枷颊,一場技術(shù)變革的到來戳杀,小程序,h5移動(dòng)端偷卧,對(duì)性能優(yōu)化的要求越來越高,受面向?qū)ο笏枷刖幊谭绞降挠绊戇壕耄岸爽F(xiàn)在主流的技術(shù)框架就是Vue,React,Angular.他們的數(shù)據(jù)驅(qū)動(dòng)模式听诸,MVVM模式,很受歡迎蚕泽,這種spa單頁面應(yīng)用晌梨,組件思維對(duì)一個(gè)龐大的web應(yīng)用很有幫助提升加載速度,減少Dom操作须妻,隨之而來的也就是不斷地學(xué)習(xí)仔蝌,對(duì)技術(shù)員的技術(shù)要求也開始偏向于vue,小程序,公眾號(hào)荒吏,由于智能手機(jī)的普及敛惊,app端比網(wǎng)頁更受歡迎,所以就要不斷地學(xué)習(xí)新的知識(shí)绰更,否則會(huì)被淘汰瞧挤。


好了,不說廢話了儡湾,總結(jié)一下使用vue開發(fā)項(xiàng)目過程中遇到的坑以及面試經(jīng)驗(yàn)特恬。

step一,談?wù)勀銓?duì)MVVM 的理解徐钠?

  • MVVM 由 Model,View,ViewModel 三部分構(gòu)成癌刽,Model 層代表數(shù)據(jù)模型,也可以在Model中定義數(shù)據(jù)修改和操作的業(yè)務(wù)邏輯尝丐;View 代表UI 組件显拜,它負(fù)責(zé)將數(shù)據(jù)模型轉(zhuǎn)化成UI 展現(xiàn)出來,ViewModel 是一個(gè)同步View 和 Model的對(duì)象爹袁。
    在MVVM架構(gòu)下讼油,View 和 Model 之間并沒有直接的聯(lián)系,而是通過ViewModel進(jìn)行交互呢簸,Model 和 ViewModel 之間的交互是雙向的矮台, 因此View 數(shù)據(jù)的變化會(huì)同步到Model中乏屯,而Model 數(shù)據(jù)的變化也會(huì)立即反應(yīng)到View 上。
    ViewModel 通過雙向數(shù)據(jù)綁定把 View 層和 Model 層連接了起來瘦赫,而View 和 Model 之間的同步工作完全是自動(dòng)的辰晕,無需人為干涉,因此開發(fā)者只需關(guān)注業(yè)務(wù)邏輯确虱,不需要手動(dòng)操作DOM, 不需要關(guān)注數(shù)據(jù)狀態(tài)的同步問題含友,復(fù)雜的數(shù)據(jù)狀態(tài)維護(hù)完全由 MVVM 來統(tǒng)一管理。

step二校辩,vue路由傳參的方式

[圖片上傳失敗...(image-f2dfe1-1554273574051)]

step三窘问,vue組件之間的傳參

[圖片上傳失敗...(image-901dae-1554273574051)]

step四惠赫,vue-router有哪幾種導(dǎo)航鉤子?

答案

  • 第一種是全局導(dǎo)航鉤子(全局守衛(wèi)):router.beforeEach(to,from,next)故黑,作用:跳轉(zhuǎn)前進(jìn)行判斷攔截儿咱。
  • 第 二種:全局解析守衛(wèi)router.beforeResolve,在導(dǎo)航被確認(rèn)前,所有組件內(nèi)守衛(wèi)和異步路由組件被解析之后场晶,解析守衛(wèi)就被調(diào)用混埠。(2.5.0新增)。
  • 第三種:單獨(dú)路由獨(dú)享的守衛(wèi)beforeEnter,在路由配置時(shí)定義诗轻,與全局守衛(wèi)的方法是一樣的钳宪。
  • 第四種:組件內(nèi)的守衛(wèi)。直接在路由組件內(nèi)定義守衛(wèi)扳炬,
    以下為官網(wǎng)文檔的介紹:
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用
    // 不使套!能!獲取組件實(shí)例 `this`
    // 因?yàn)楫?dāng)守衛(wèi)執(zhí)行前鞠柄,組件實(shí)例還沒被創(chuàng)建
  },
  beforeRouteUpdate (to, from, next) {
    // 在當(dāng)前路由改變侦高,但是該組件被復(fù)用時(shí)調(diào)用
    // 舉例來說,對(duì)于一個(gè)帶有動(dòng)態(tài)參數(shù)的路徑 /foo/:id厌杜,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時(shí)候奉呛,
    // 由于會(huì)渲染同樣的 Foo 組件,因此組件實(shí)例會(huì)被復(fù)用夯尽。而這個(gè)鉤子就會(huì)在這個(gè)情況下被調(diào)用瞧壮。
    // 可以訪問組件實(shí)例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 導(dǎo)航離開該組件的對(duì)應(yīng)路由時(shí)調(diào)用
    // 可以訪問組件實(shí)例 `this`
  }

step五,請(qǐng)寫出幾種常用的vue指令

v-class匙握、v-for咆槽、v-if、v-show圈纺、v-on,v-model

step六秦忿,請(qǐng)?jiān)敿?xì)解釋一下vue(2.0)的生命周期麦射?

答案:

生命周期 階段 描述
beforeCreated 創(chuàng)建前 vue實(shí)例的掛載元素$el和數(shù)據(jù)對(duì)象data都為undefined,還未初始化灯谣。
created 創(chuàng)建后 vue實(shí)例的數(shù)據(jù)對(duì)象data有了潜秋,$el還沒有。
beforeMount 模板載入前 vue實(shí)例的$el和data都初始化了胎许,但還是掛載之前為虛擬的dom節(jié)點(diǎn)峻呛,data.message還未替換
mounted 模板載入后 vue實(shí)例掛載完成,data.message成功渲染辜窑。
beforeUpdate 組件更新前 組件更新之前調(diào)用
updated 組件更新后 組件更新之后調(diào)用
beforeDestroy 組件銷毀前 調(diào)用$destroy方法后钩述,立即執(zhí)行beforeDestroy
pdestroyed 組件銷毀后 組件銷毀后調(diào)用,此時(shí)只剩下dom空殼

step七穆碎,slot是什么牙勘?并說一下詳細(xì)的用法?

答案:
vue官網(wǎng)解釋:slot 插槽惨远,-------(Vue 實(shí)現(xiàn)了一套內(nèi)容分發(fā)的 API谜悟,這套 API 基于當(dāng)前的 Web Components 規(guī)范草案话肖,將 <slot> 元素作為承載分發(fā)內(nèi)容的出口北秽。
)是不是看完稀里糊涂的,反正我是稀里糊涂的最筒,再來說說我自己的理解:
slot就是為了實(shí)現(xiàn)真正的靈活的單頁組件贺氓,在組件外部靈活控制組件內(nèi)部的內(nèi)容一種形式或者是入口,就是將組件內(nèi)所需要的內(nèi)容以插槽(slot)的形式插入到公共組件中床蜘,以達(dá)到靈活控制辙培。
當(dāng)組件渲染的時(shí)候,這個(gè) <slot> 元素將會(huì)被替換為“Your Profile”邢锯。插槽內(nèi)可以包含任何模板代碼扬蕊,包括 HTML:詳情請(qǐng)看vue 帶動(dòng)畫效果的NavBar這里邊有詳細(xì)介紹到<slot>的使用方法。

step八丹擎,談?wù)勀銓?duì)vue響應(yīng)式原理的理解?

答案:
先看看官網(wǎng)的解釋:
當(dāng)你把一個(gè)普通的 JavaScript 對(duì)象傳給 Vue 實(shí)例的 data 選項(xiàng)尾抑,Vue 將遍歷此對(duì)象所有的屬性,并使用 Object.defineProperty 把這些屬性全部轉(zhuǎn)為 getter/setter蒂培。Object.defineProperty 是 ES5 中一個(gè)無法 shim 的特性再愈,這也就是為什么 Vue 不支持 IE8 以及更低版本瀏覽器的原因。

這些 getter/setter 對(duì)用戶來說是不可見的护戳,但是在內(nèi)部它們讓 Vue 追蹤依賴翎冲,在屬性被訪問和修改時(shí)通知變化。這里需要注意的問題是瀏覽器控制臺(tái)在打印數(shù)據(jù)對(duì)象時(shí) getter/setter 的格式化并不同媳荒,所以你可能需要安裝 vue-devtools 來獲取更加友好的檢查接口抗悍。

每個(gè)組件實(shí)例都有相應(yīng)的 watcher 實(shí)例對(duì)象驹饺,它會(huì)在組件渲染的過程中把屬性記錄為依賴,之后當(dāng)依賴項(xiàng)的 setter 被調(diào)用時(shí)檐春,會(huì)通知 watcher 重新計(jì)算逻淌,從而致使它關(guān)聯(lián)的組件得以更新。

step九疟暖,直接對(duì)對(duì)象屬性進(jìn)行添加和刪除會(huì)不會(huì)直接響應(yīng)到視圖中卡儒?也就是說數(shù)組的更新方法?并說明原因俐巴?

答案:
直接對(duì)對(duì)象屬性進(jìn)行添加和刪除是不會(huì)響應(yīng)到視圖中的骨望,需要用到this.$set()方法
舉個(gè)例子

var vm = new Vue({
  data:{
      myjson:{
    name:"張三"     
}
  }
})
vm.myjson.age= "12";    //這樣直接對(duì)對(duì)象屬性進(jìn)行增加是不會(huì)直接響應(yīng)到視圖中的。
需要這么寫:
this.$set(this.myjson,'age',12);//才會(huì)生效

原因
受現(xiàn)代 JavaScript 的限制 (以及廢棄 Object.observe)欣舵,Vue 不能檢測到對(duì)象屬性的添加或刪除擎鸠。由于 Vue 會(huì)在初始化實(shí)例時(shí)對(duì)屬性執(zhí)行 getter/setter 轉(zhuǎn)化過程,所以屬性必須在 data 對(duì)象上存在才能讓 Vue 轉(zhuǎn)換它缘圈,這樣才能讓它是響應(yīng)的劣光。

step十,如何創(chuàng)建一個(gè)公共的全局組件糟把,并在每個(gè)頁面中調(diào)用以及如何創(chuàng)建并調(diào)用公共的方法绢涡?

答案:
[圖片上傳失敗...(image-a84d49-1554273574050)]

將創(chuàng)建好的組件或者js方法導(dǎo)出并掛載到vue實(shí)例上。
詳情請(qǐng)參考關(guān)于vue全局引用公共的js和公共的組件的折騰

step十一遣疯,請(qǐng)說明v-ifv-show的異同雄可?

同:兩者都是達(dá)到顯示隱藏的功能
異:

  • v-if指令是直接銷毀和重建DOM達(dá)到讓元素顯示和隱藏的效果
  • v-show指令通過修改元素的display屬性讓其顯示或者隱藏

step十二,<keep-alive></keep-alive>的作用是什么?

答案:
<keep-alive></keep-alive> 包裹動(dòng)態(tài)組件時(shí)缠犀,會(huì)緩存不活動(dòng)的組件實(shí)例,主要用于保留組件狀態(tài)或避免重新渲染数苫。
用自己的理解說
比如有一個(gè)列表和一個(gè)詳情,那么用戶就會(huì)經(jīng)常執(zhí)行打開詳情=>返回列表=>打開詳情…這樣的話列表和詳情都是一個(gè)頻率很高的頁面辨液,那么就可以對(duì)列表組件使用<keep-alive></keep-alive>進(jìn)行緩存虐急,這樣用戶每次返回列表的時(shí)候,都能從緩存中快速渲染滔迈,而不是重新渲染止吁,這樣就會(huì)減輕服務(wù)器壓力,提高性能亡鼠。

step十三赏殃,<router-link>屬性以及方法?

答案:

  • :to 相當(dāng)于a標(biāo)簽中的"herf"屬性间涵,后面跟跳轉(zhuǎn)鏈接所用 仁热,會(huì)渲染成a標(biāo)簽--<a href="url">
<router-link :to="/home">Home</router-link>
<!-- 渲染結(jié)果 -->
<a href="/home">Home</a>

  • replace屬性,加上該屬性頁面切換不會(huì)留下歷史紀(jì)錄。
<router-link :to="/home" replace></router-link>

  • tag屬性抗蠢,具有tag屬性的router-link會(huì)被渲染成相應(yīng)的標(biāo)簽
<router-link :to="/home" tag="li">Home</router-link>
<!-- 渲染結(jié)果 -->
<li>Home</li>
此時(shí)頁面的li同樣會(huì)起到a鏈接跳轉(zhuǎn)的結(jié)果举哟,vue會(huì)自動(dòng)為其綁定點(diǎn)擊事件,并跳轉(zhuǎn)頁面

  • active-class屬性:設(shè)置鏈接激活時(shí)的class屬性:默認(rèn)值為router-link-active,所以如果沒有設(shè)置迅矛,就會(huì)被渲染為這個(gè)class妨猩,我們可以在router.js里邊配置這個(gè)屬性
const router = new VueRouter({
  mode: 'hash',
  linkActiveClass: 'u-link--Active', // 這是鏈接激活時(shí)的class
})
<router-link :to="/home" active-class="u-link--Active">Home</router-link>

  • exact屬性:嚴(yán)格模式
// 這個(gè)鏈接只會(huì)在地址為 / 的時(shí)候被激活 
<router-link to="/" exact>Home</router-link>

<router-link to="/user">USER</router-link>

<router-link to="/user/userinfo">USER-info</router-link>

// 如果不設(shè)置exact,則當(dāng)路由到了/user/userinfo 頁面時(shí)秽褒,USER也是被設(shè)置了router-link-active樣式的壶硅!

  • 方法:
 router-link默認(rèn)是觸發(fā)router.push(location),如果設(shè)置的replace 則觸發(fā)router.replace(location)销斟,這有啥區(qū)別呢?
  router.push() :導(dǎo)航跑到不同的URL,這個(gè)方法會(huì)向history棧添加一個(gè)新的記錄庐椒,所以,當(dāng)用戶點(diǎn)擊瀏覽器后退按鈕時(shí)蚂踊,則回到之前的url.
  router.replace(): 跟router.push作用是一樣的约谈,但是,它不會(huì)向history添加新記錄犁钟,而是跟它的方法名一樣替換掉當(dāng)前的history記錄.
  router.go(n): 這個(gè)方法的參數(shù)是一個(gè)整數(shù)棱诱,意思是在history記錄中向前或者后退多少步,類似window.history.go(n)

step十四涝动,v-once的作用和用法迈勋?

只渲染元素和組件一次,隨后的渲染捧存,使用了此指令的元素/組件及其所有的子節(jié)點(diǎn)粪躬,都會(huì)當(dāng)作靜態(tài)內(nèi)容并跳過担败,這可以用于優(yōu)化更新性能昔穴。
舉個(gè)例子:一看便知

<template>
  <div>
    <div>{{count}}</div>
    <button v-on:click="addCount">改變count的值</button>
  </div>
</template>
<script>
  export default {
    name: "VueOnce",
    data() {
      return {
        count: "我是不可改變的"
      }
    },
    methods: {
      addCount: function () {
        this.count = "我就要改變你";
       此時(shí)這個(gè)操作dom里邊的count是不會(huì)變化的
      }
    }
  }
</script>
<style scoped>
</style>

step十五,如何解決在加載頁面時(shí)出現(xiàn)的閃爍問題提前。

v-cloak詳情請(qǐng)移步v-cloak詳解

step十六吗货,vue如何兼容ie的問題。

答案:
回答關(guān)鍵字 - babel-polyfill插件
詳情請(qǐng)移步vue-cli 解決ie兼容性問題

step十七狈网,vue-cli如何解決跨域宙搬?

答案:常見的后臺(tái)加請(qǐng)求頭以及jsonp就不詳細(xì)解釋了,若要看詳細(xì)教程請(qǐng)移步前端面試題總結(jié)拓哺。
這里主要介紹的是 npm模塊之http-proxy-middleware的解決跨域的辦法勇垛。詳情移步vue-cli如何解決跨域

作者:愿醒靜臥忘塵谷
鏈接:http://www.reibang.com/p/42a4be57287f
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處士鸥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闲孤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烤礁,更是在濱河造成了極大的恐慌讼积,老刑警劉巖肥照,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勤众,居然都是意外死亡舆绎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門们颜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吕朵,“玉大人,你說我怎么就攤上這事窥突”咚” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵波岛,是天一觀的道長茅坛。 經(jīng)常有香客問我,道長则拷,這世上最難降的妖魔是什么贡蓖? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮煌茬,結(jié)果婚禮上斥铺,老公的妹妹穿的比我還像新娘。我一直安慰自己坛善,他們只是感情好晾蜘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眠屎,像睡著了一般剔交。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上改衩,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天岖常,我揣著相機(jī)與錄音,去河邊找鬼葫督。 笑死竭鞍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的橄镜。 我是一名探鬼主播偎快,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼洽胶!你這毒婦竟也來了晒夹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惋戏,沒想到半個(gè)月后领追,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡响逢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年绒窑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舔亭。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡些膨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钦铺,到底是詐尸還是另有隱情订雾,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布矛洞,位于F島的核電站洼哎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沼本。R本人自食惡果不足惜噩峦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抽兆。 院中可真熱鬧识补,春花似錦、人聲如沸辫红。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贴妻。三九已至切油,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揍瑟,已是汗流浹背白翻。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工乍炉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绢片,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓岛琼,卻偏偏與公主長得像底循,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子槐瑞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 寫在前面 之前有提到熙涤,在經(jīng)歷了前端轉(zhuǎn)型之后,一場技術(shù)變革的到來,小程序祠挫,h5移動(dòng)端那槽,對(duì)性能優(yōu)化的要求越來越高,受面...
    郝艷峰Vip閱讀 30,741評(píng)論 4 48
  • VUE Vue :數(shù)據(jù)驅(qū)動(dòng)的M V Vm框架 m :model(后臺(tái)提供數(shù)據(jù))等舔,v :view(頁面)骚灸,vM(模板...
    wudongyu閱讀 5,397評(píng)論 0 11
  • 一:什么是閉包?閉包的用處慌植? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)甚牲。在本質(zhì)上,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 9,596評(píng)論 1 52
  • Vue八個(gè)生命周期 beforeCreate【創(chuàng)建前】created【創(chuàng)建后】 beforeMount【載入前】 ...
    艾薩克菊花閱讀 1,314評(píng)論 0 12
  • 1蝶柿、V-if和V-show的區(qū)別 答案:區(qū)別就是dom元素是否掛載了丈钙,v-show是dom樹上有內(nèi)容,不顯示交汤,di...
    cj_jax閱讀 20,126評(píng)論 2 22