前端vue面試題分享(附答案)

本篇文章給大家分享一些常見的前端vue面試題,有一定的參考價值,希望對大家有所幫助。

vue面試題

  • vue.js的特點?
  • vue常用指令
  • vue的雙向數據綁定原理是什么?
  • vue-router有哪幾種導航鉤子?
  • active-class是哪個組件的屬性?嵌套路由怎么定義?
  • scss是什么?在 vue.cli中的安裝使用步驟是?有哪幾大特性?
  • sass是什么?如何在vue中安裝和使用?
  • 請說下封裝 vue組件的過程?
  • 請詳細說下你對vue生命周期的理解?
  • 父子組件的生命周期順序
  • watch和computed的區別
  • computed 和 methods 的區別
  • vue中如何解決頁面不重新渲染問題
  • v-if和v-for一起使用的弊端以及它的解決辦法?
  • v-show指令和v-if指令的區別是什么?
  • 虛擬DOM,diff算法?
  • 過濾器 (Filter)
  • 常見的事件修飾符及其作用
  • Vue 組件 data 為什么必須是函數 ?
  • axios是什么
  • 在 Vue. js開發環境下調用API接口,如何避免跨域
  • 組件傳值方式有哪些?
  • 如何讓CSS只在當前組件中起作用?
  • keep-alive是什么?
  • 如何在 Vue. js動態插入圖片
  • vuex的核心概念
  • vuex是什么?怎么使用?哪種功能場景使用它?
  • vue中key值的作用
  • 使用import時,webpack會對node_modules里的依賴做什么?

vue面試題解析

vue.js的特點?

  • 易用: 簡單,易學,上手快
  • 靈活: (漸進式)不斷繁榮的生態系統,可以在一個庫和一套完整框架之間自如伸縮。
  • 高效: 20kB min+gzip 運行大小;超快虛擬 DOM;最省心的優化
  • 雙向綁定:開發效率高
  • 基于組件的代碼共享
  • Web項目工程化,增加可讀性、可維護性

vue常用指令

v-model 多用于表單元素實現雙向數據綁定(同angular中的ng-model)
v-bind 動態綁定 作用: 及時對頁面的數據進行更改
v-on:click 給標簽綁定函數,可以縮寫為@,例如綁定一個點擊函數 函數必須寫在methods里面
v-for 格式: v-for="字段名 in(of) 數組json" 循環數組或json(同angular中的ng-repeat)
v-show 顯示內容 (同angular中的ng-show)
v-hide 隱藏內容(同angular中的ng-hide)
v-if 顯示與隱藏 (dom元素的刪除添加 同angular中的ng-if 默認值為false)
v-else-if 必須和v-if連用
v-else 必須和v-if連用 不能單獨使用 否則報錯 模板編譯錯誤
v-text 解析文本
v-html 解析html標簽
v-bind:class 三種綁定方法 1、對象型 '{red:isred}' 2、三元型 'isred?"red":"blue"' 3、數組型 '[{red:"isred"},{blue:"isblue"}]'
v-once 進入頁面時 只渲染一次 不在進行渲染
v-cloak 防止閃爍
v-pre 把標簽內部的元素原位輸出

Vue的雙向數據綁定原理是什么?

是采用數據劫持結合發布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變動時發布消息給訂閱者,觸發相應的監聽回調。從而實現數據的雙向綁定

vue-router有哪幾種導航鉤子?

一.全局守衛
1.router.beforeEach((to,from,next) => {})

  1. 回調函數中的參數,to:進入到哪個路由去,from:從哪個路由離開,next:函數,決定是否展示你要看到的路由頁面。
  2. 如下例:main.js中設置全局守衛

在main.js中,有一個路由實例化對象router。在main.js中設置守衛已是全局守衛。

如下,判斷to.path當前將要進入的路徑是否為登錄或注冊,如果是就執行next(),展示當前界面。如果不是,就彈出alert,然后移至登錄界面。
這樣就可實現,用戶在未登錄狀態下,展示的一直是登錄界面。

router.beforeEach((to,from,next) => {
  if(to.path == '/login' || to.path == '/home' || to.path == '/event'){
    next();
  }else {
    alert('您還沒有登錄')
    next('/login')
  }
})
image.jpeg
  1. 全局后置鉤子router.afterEach((to,from)=>{})
    只有兩個參數,to:進入到哪個路由去,from:從哪個路由離。
    如下,每次切換路由時,都會彈出alert,點擊確定后,展示當前頁面。
router.afterEach((to,from)=>{
  alert("每次跳轉頁面都會彈出");
})
image.jpeg

二.組件內的守衛

  1. 到達這個組件時,beforeRouteEnter:(to,from,next)=>{}
    在Admin.vue文件中,點擊轉到admin路由時,執行beforeRouteEnter函數
    to,from參數與上面使用方法一致。next回調函數略有不同。
    如下例,data 組件內守衛有特殊情況,如果我們直接以
    beforeRouteEnter:(to,from,next)=>{ alert("hello" + this.name);}進行訪問admin頁面,會發現alert輸出hello undefined。這是因為,現在訪問不到我們的data屬性,執行順序是不一致,這與的聲明周期有關。在執行完之前,data數據還未渲染。所以這里,next()會給一個對應的回調,幫助完成。
data(){
        return{
            name:"通過審核!"
        }
    },
    beforeRouteEnter:(to,from,next)=>{
        next(vm=>{
            alert("恭喜你" + vm.name);
        })
    },
image.jpeg
  1. 離開這個組件時,beforeRouteLeave:(to,from,next)=>{}
    點擊其他組件時,判斷是否確認離開。確認執行next();取消執行next(false),留在當前頁面。
beforeRouteLeave:(to,from,next)=>{
        if(confirm("確定離開此頁面嗎?") == true){
            next();
        }else{
            next(false);
        }
    },
image.png

三.路由獨享的守衛
beforeEnter:(to,from,next)=>{},用法與全局守衛一致。只是,將其寫進其中一個路由對象中,只在這個路由下起作用。

{
      path: '/demo',
      name: 'Demo',
      component: Demo,beforeEnter:(to,from,next)=>{
        alert("非登錄狀態,不能訪問頁面");
        next('/login');
    },
    },
image.png

active-class是哪個組件的屬性?嵌套路由怎么定義?

active-class是vue-router模塊的router-link組件中的屬性,一般是用來做選中樣式的切換
一級路由里面使用children配置子路由,就是嵌套路由

scss是什么?在 vue.cli中的安裝使用步驟是?有哪幾大特性?

scsss是css預編譯;
使用步驟:
第一步:用npm下三個loader(sass-loader、css-loader、node-sass);
第二步:在build目錄找到webpack.base.config.js,在那個extends屬性中加一個拓展.scss;
第三步:還是在同一個文件,配置一個module屬性;
第四步:然后在組件的style標簽加上lang屬性,例如:lang="scss";
有哪幾大特性:
1、可以用變量,例如($變量名稱=值);
2、可以用混合器;
3、可以嵌套;

sass是什么?如何在vue中安裝和使用?

sass是一種CSS預編譯語言安裝和使用步驟如下。

  • 用npm安裝加載程序( sass-loader、 css-loader等加載程序)。
  • 在 webpack.config.js中配置sass加載程序。

請說下封裝 vue組件的過程?

在components文件夾下建一個vue文件封裝組件
根據業務邏輯、需求寫寫UI 靜態樣式等 定義好props的屬性數據 子組件修改好數據之后,想把數據傳遞給父組件,可以使用emit()方法 定義插槽增加組件的可拓展性

  • 全局組件的話就在main.js中引入、注冊 然后再單頁面使用即可
  • 局部組件的話就在單頁面引入、注冊 在使用即可

請詳細說下你對vue生命周期的理解?

每個vue實例都有一個生命周期 一共分為八個階段
創建前后: beforeCreate/created 渲染前后: beforeMount/mounted
更新前后: beforeUpdate/updated 銷毀前后: beforeDestroy/destroyed

  • 在created周期的時候 就可以訪問到this了 也可以調用異步的方法去獲取后臺的數據
  • 在mounted周期的時候 就能夠訪問到DOM結構 對dom結構進行一些增刪改查的操作 因為在這個時候 dom結構已經渲染完成并掛載在vue實例上面了
  • 當data變化時,會觸發beforeUpdate和updated方法
  • 在執行destroy方法后,對data的改變不會再觸發周期函數,說明此時vue實例已經解除了事件監聽以及和dom的綁定,但是dom結構依然存在

父子組件的生命周期順序

  • 加載渲染過程:
    父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
  • 子組件更新過程:父beforeUpdate->子beforeUpdate->子updated->父updated
  • 父組件更新過程:父beforeUpdate->父updated
  • 銷毀過程:父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

watch和computed的區別

watch顧名思義,用于監聽數據變化,其中可以監聽的數據來源有三部分:props、data、computed內的數據;watch提供兩個參數(newValue,oldValue),第一個參數是新值,第二個參數保存舊值;
computed用于處理復雜的邏輯運算,主要和methods儲存方法來進行區分;methods儲存方法,,computed儲存需要處理的數據值;methods每次都會調用,computed有緩存機制,只有改變時才執行,性能更佳;

總的來說:
watch擅長處理的場景:一個數據影響多個數據
computed擅長處理的場景:一個數據受多個數據影響

computed 和 methods 的區別

computed: 計算屬性是基于它們的依賴進行緩存的,只有在它的相關依賴發生改變時才會重新求值對于 method
method: 只要發生重新渲染,調用總會執行該函數

vue中如何解決頁面不重新渲染問題

使用vue,會遇到這樣一個問題,修改了對象的屬性后,頁面不會渲染

  • 修改對象屬性后頁面未重新渲染可以使用 this.$set(對象名稱, '屬性名', '屬性值')
  • 使用this.$forceUpdate()方法可重新渲染頁面

v-if和v-for一起使用的弊端以及它的解決辦法?

  • 由于v-for的優先級比v-if高,所以導致每循環一次就會去v-if一次
  • 而v-if是通過創建和銷毀dom元素來控制元素的顯示與隱藏
  • 所以就會不停的去創建和銷毀元素,造成頁面卡頓,性能下降。
    解決辦法:在v-for的外層或內層包裹一個元素來使用v-if

v-show指令和v-if指令的區別是什么?

v-show 可以根據表達式的值來顯示或者隱藏HTML元素。當v-show賦值為false時,元素被隱藏,此時查看代碼時,該元素上會多一個內聯樣式style=“display:none”;而v-if會控制這個 DOM 節點的存在與否。當我們需要經常切換某個元素的顯示/隱藏時,使用v-show會更加節省性能上的開銷;當只需要一次顯示或隱藏時,使用v-if更加合理。

虛擬DOM,diff算法?

  • 讓我們不用直接操作DOM元素,只操作數據便可以重新渲染頁面
  • 虛擬dom是為了解決瀏覽器性能問題而被設計出來的
    當操作數據時,將改變的dom元素緩存起來,都計算完后再通過比較映射到真實的dom樹上
  • diff算法比較新舊虛擬dom。如果節點類型相同,則比較數據,修改數據;如果節點不同,直接干掉節點及所有子節點,插入新的節點;如果給每個節點都設置了唯一的key,就可以準確的找到需要改變的內容,否則就會出現修改一個地方導致其他地方都改變的情況。比如A-B-C-D, 我要插入新節點A-B-M-C-D,實際上改變的了C和D。但是設置了key,就可以準確的找到B C并插入

過濾器 (Filter)

在Vue中使用filters來過濾(格式化)數據,filters不會修改數據,而是過濾(格式化)數據,改變用戶看到的輸出(計算屬性 computed ,方法 methods 都是通過修改數據來處理數據格式的輸出顯示。
使用場景: 比如需要處理時間、數字等的的顯示格式;

常見的事件修飾符及其作用

  • .stop:等同于 JavaScript 中的 event.stopPropagation() ,防止事件冒泡;
  • .prevent :等同于 JavaScript 中的 event.preventDefault() ,防止執行預設的行為(如果事件可取消,則取消該事件,而不停止事件的進一步傳播);
  • .capture :當元素發生冒泡時,先觸發帶有該修飾符的元素。若有多個該修飾符,則由外而內觸發。如 div1中嵌套div2中嵌套div3.capture中嵌套div4,那么執行順序為:div3=》div4=》div2=》div1
  • .self :只會觸發自己范圍內的事件,不包含子元素;
  • .once :只會觸發一次。

Vue 組件 data 為什么必須是函數 ?

因為組件是可以復用的,JS 里對象是引用關系,如果組件 data 是一個對象,那么子組件中的 data 屬性值會互相污染。
所以一個組件的 data 選項必須是一個函數,因此每個實例可以維護一份被返回對象的獨立的拷貝。

axios是什么?

易用、簡潔且高效的http庫, 支持node端和瀏覽器端,支持Promise,支持攔截器等高級配置。

在 Vue. js開發環境下調用API接口,如何避免跨域

config/ index.js內對 proxyTable項配置代理。

組件傳值的方式有哪些?

  • 父傳子:子組件通過props['xx'] 來接收父組件傳遞的屬性 xx 的值
  • 子傳父:子組件通過 this.$emit('fnName',value) 來傳遞,父組件通過接收 fnName 事件方法來接收回調
  • 其他方式:通過創建一個bus,進行傳值
  • 使用Vuex

如何讓CSS只在當前組件中起作用?

在每一個Vue.js組件中都可以定義各自的CSS、 JavaScript代碼。如果希望組件內寫的CSS只對當前組件起作用,只需要在Style標簽添加Scoped屬性,即。

keep-alive是什么?

如果需要在組件切換的時候,保存一些組件的狀態防止多次渲染,就可以使用 keep-alive 組件包裹需要保存的組件。
兩個重要屬性,include 緩存組件名稱,exclude 不需要緩存的組件名稱。

如何在 Vue. js動態插入圖片

對“src”屬性插值將導致404請求錯誤。應使用 v-bind:src (簡寫:src)格式代替。

vuex的核心概念

  • state => 基本數據
  • getters => 從基本數據派生的數據
  • mutations => 修改數據,同步
  • actions => 修改數據,異步 (Action 提交的是 mutation,而不是直接變更狀態)
  • modules => 模塊化Vuex

vuex是什么?怎么使用?哪種功能場景使用它?

  • Vuex 是一個專為 Vue.js 應用程序開發的狀態管理器,采用集中式存儲管理應用的所有組件的狀態,主要是為了多頁面、多組件之間的通信。
  • Vuex有5個重要的屬性,分別是 State、Getter、Mutation、Action、Module,由 view 層發起一個 Action 給 Mutation,在 Mutation 中修改狀態,返回新的狀態,通過 Getter暴露給 view層的組件或者頁面,頁面監測到狀態改變于是更新頁面。如果你的項目很簡單,最好不要使用 Vuex,對于大型項目,Vuex 能夠更好的幫助我們管理組件外部的狀態.
  • 一般可以運用在購物車、登錄狀態、播放等場景中。

vue中key值的作用

  • key值:用于 管理可復用的元素,標識數據的唯一性。因為Vue 會盡可能高效地渲染元素,通常會復用已有元素而不是從頭開始渲染
  • key的作用主要是為了高效的更新虛擬DOM
  • 當我們修改了某個數據,如果直接渲染到真實dom上會引起整個dom樹的重繪和重排,因此采用diff算法來解決上述問題,通過改變局部dom來更新視圖。(渲染真實的dom的開銷比較大)
image.png

使用import時,webpack會對node_modules里的依賴做什么?

  • 配置相關路徑

持續更新中......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容