前端面試題整理-Vue篇


 1、對vue的理解,有什么特點,vue為什么不能兼容IE8及以下瀏覽器

  vue是一套用於構建用戶界面的漸進式框架,核心是一個響應的數據綁定系統

  vue是一款MVVM框架,基於雙向綁定數據,當數據發生變化時候,vue自身會進行一些運算

  特點:簡潔輕量、數據驅動、組件化、模塊友好

  vue.js使用了IE8無法模擬的 ECMAScript 5 特性,沒有替代方案

 

2、簡述Vue雙向數據綁定的原理

  主要是通過Object對象的defineProperty屬性,重寫data的set和get函數來實現的

  vue是通過數據劫持的方式來做數據綁定,最核心的方法就是通過Object.defineProperty()來實現對屬性的劫持

  在設置或者獲取的時候我們就可以在get或者set方法里加入其他的觸發函數,達到監聽數據變動的目的

 

3、什么是MVVM,和MVC的區別

  MVVM是Model-View-ViewModel的縮寫

  Model層代表數據模型

  View代表組件視圖,負責將數據模型轉化成UI展現出來

  ViewModel是一個同步 View 和 Model 的對象(雙向綁定)

  在MVVM中,View和Model之間並沒有直接的聯系,而是通過ViewModel進行交互,

  Model和ViewModel之間的交互是雙向的,因此 通過視圖操作數據,也能通過數據操作視圖

  MVC是Model-View- Controller的簡寫。即模型-視圖-控制器,使用MVC的目的是為了將M和V相分離

  MVVM與MVC最大的區別就是實現了View和Model的自動同步,也就是當Model的屬性改變時

  我們不用再手動操作Dom來改變View,而是改變后該屬性對應View層會自動改變

 

4、vue.js的兩個核心是什么

  數據驅動和組件化思想

 

5、vue與angular的區別

  vue的雙向邦定是基於ES5中getter/setter來實現的,而angular是由自己實現一套模版編譯規則,需要進行所謂的“臟值”檢查,vue則不需要

  vue需要提供一個el對象進行實例化,后續的所有作用范圍也是在el對象之下,而angular而是整個html頁面

 

6、說下vue的底層原理

  Vue的模式是m-v-vm模式,即(model-view-modelView),通過modelView作為中間層,進行雙向數據的綁定與變化

  1)通過建立虛擬dom樹document.createDocumentFragment(),方法創建虛擬dom樹

  2)一旦被監測的數據改變,會通過Object.defineProperty定義的數據攔截,截取到數據的變化

  3)截取到的數據變化,從而通過訂閱——發布者模式,觸發Watcher(觀察者),從而改變虛擬dom的中的具體數據

  4)最后通過更新虛擬dom的元素值,從而改變最后渲染dom樹的值,完成雙向綁定

 

7、簡述vue等單頁面應用及優缺點

  單頁面應用,用戶所有的操作都在一個頁面完成

  優點:無刷新,用戶體驗好,共享資源只需要請求一次即可,采用組件化的思想,代碼結構更加規范化,便於修改和調整

  缺點:對搜索引擎不友好、低版本不支持,第一次加載首頁耗時相對較長,不能使用瀏覽器導航按鈕,需要自行實現前進后退

 

8、React與Vue對比

  相同點:

  都支持服務器端渲染、數據驅動視圖,狀態管理

  都有虛擬DOM、組件化開發、通過props參數進行父子組件數據的傳遞

  不同點:

  React嚴格上只針對MVC的C層,Vue則是MVVM模式

  虛擬DOM方面

  vue會跟蹤每一個組件的依賴關系,不需要重新渲染整個組件樹,而React每當應用的狀態被改變時,全部組件都會重新渲染

  視圖渲染方面

  React采用JSX渲染到DOM,vue使用的是template模板

  數據綁定方面

  vue實現了數據的雙向綁定,react數據流動是單向的

  state對象方面

  react應用中不可變的,需要使用setState方法更新狀態

  vue中,state對象不是必須的,數據由data屬性在vue對象中管理

 

9、前端組件化有什么優勢

  1)提高開發效率

  2)方便重復使用

  3)便於協同開發

  4)更容易管理維護

 

10、說一下vue的生命周期,當使用keep-alive屬性時,會增加哪兩個生命周期

  創建前/后beforeCreate/created: 

  在beforeCreated階段,vue實例的掛載元素el和數據對象data都為undefined,還未初始化。在created階段,vue實例的數據對象data有了,el還沒有

  載入前/后beforeMount/mounted:

  在beforeMount階段,vue實例的el和data都初始化了,但還是掛載之前為虛擬的dom節點,data尚未替換。在mounted階段,vue實例掛載完成,data成功渲染。

  更新前/后beforeUpdate/updated:

  當data變化時,會觸發beforeUpdate和updated方法。不常用

  銷毀前/后beforeDestory/destoryed:

  beforeDestory是在vue實例銷毀前觸發,一般在這里要通過removeEventListener解除手動綁定的事件

  執行destroy方法后,vue實例已經解除了事件監聽以及dom的綁定,但是dom結構依然存在

 

  在被keep-alive包含的組件/路由中,會多出兩個生命周期的鈎子:

  activated 與 deactivated

 

11、說說你對angular臟檢查理解 

  angular中無法判斷數據是否做了更改,所以設置了一些條件,當觸發這些條件之后就會執行一個檢測來遍歷所有的數據,對比剛才更改的地方執行變化

  這個檢查很不科學而且效率不高,有很多多余的地方

 

12、如何使css只在當前組件起作用

  如果想寫的css只對當前組件起作用,則在style中寫入scoped

 

13、vue中v-if和v-show的區別

  v-if和v-show都是用來控制元素的渲染

  v-if是根據后面數據的真假,來判斷DOM的添加刪除等操作

  v-show只是在修改元素的css樣式(display屬性值)

  v-if如果初始渲染條件為真,就渲染,反之就不渲染

  v-show不管初始條件是否為真,都會被渲染

  v-if有更高的切換消耗,不適合做頻繁的切換

   v-show有更高的初始渲染消耗,適合做頻繁的切換

 

 14、vue有哪些修飾符

  事件修飾符:stop、prevent、self、once

  鍵盤修飾符:enter、space、up、down

  表單修飾符修飾符:number、trim、lazy

 

15、列舉vue的幾種常用指令 

  v-if、v-show、v-for、v-on、v-bind、v-model、v-once

 

16、v-on可以綁定多個方法嗎?

  可以

<input v-on:keyup.enter="submit" v-on:focus="onFocus">

 

17、vue中$mount與el區別

  $mount和el兩者在使用中沒有什么區別,都是將實例化后的vue掛載到指定的DOM元素中
  如果在實例化vue時指定el,則該vue將會渲染在el對應的DOM中
  沒有指定el,則vue實例會處於一種“未掛載”的狀態,此時通過$mount來手動執行掛載


18、vue事件修飾符怎么使用,舉例說明

 

<!-- 阻止單擊事件繼續傳播 -->

 <a v-on:click.stop="doThis"></a>

 <!-- 提交事件不再重載頁面 -->

 <form v-on:submit.prevent="onSubmit"></form>

<!-- 修飾符可以串聯 -->

 <a v-on:click.stop.prevent="doThat"></a>

 <!-- 只有修飾符 -->

 <form v-on:submit.prevent></form>

 <!-- 點擊事件將只會觸發一次 -->

 <a v-on:click.once="doThis"></a>

 <!-- 只當在 event.target 是當前元素自身時觸發處理函數 -->

 <div v-on:click.self="doThat">...</div>  

 

19、vue中key值和is的作用

  使用key,vue會基於key的變化重新排列元素順序,並且移除key不存在的元素。可以做優化處理

  is可以擴展原生html元素,也可以綁定動態組件

 

20、組件中data為什么是函數

  因為組件是用來復用的,JS 里對象是引用關系,這樣作用域沒有隔離

  而 new Vue 的實例,是不會被復用的,因此不存在引用對象的問題

 

21、什么是單向數據流動

  這個概念出現在組件通信。數據從父級流向子級,數據本身還是父級的

  如果操作子級要改變父級的數據,只能通過子級告知父級要操作哪個數據

  然后讓父級去修改自己的數據,修改完畢再傳給子級

 

22、什么是vue的計算屬性,有幾種用法

  computed 計算屬性,能監聽vue中數據的變化,當數據發生變化時候會觸發

  1、函數形式

       computed:{
            listenArr(){          
            //使用data中數據,自動幫你監聽數據的變化
            //返回的結果就是通過改變數據 做的另一件事情         
            }
        }

  2、對象形式

復制代碼
        computed:{
            listenArr:{
                get(){
                    //獲取時候
                },
                set(newVal){
                    //修改時候
                }
            }
        }
        //當使用get set時候,computed中定義的屬性為一個對象
        //不使用get set時候,computed中定義的屬性可以是一個函數
      
復制代碼

 

23、說一下vue組件之間的傳遞

  父級傳遞子級:

  首先在子組件上加一個v-bind:自定義屬性,等於父級的數據,子組件通過props方法接收數據

  子級傳遞父級:

  在子組件上綁定一個自定義事件,並且傳入父級的“事件”處理函數

  在子組件內部使用$emit監聽這個自定義事件,this.$emit('自定義事件名',參數)

 

24、vue中computed和watch的區別

  computed能夠監聽vue數據上的變化,頁面上來就執行一次,每改變一次數據就又觸發,在操作數據的時候,會派生出另一個事情

  watch當指定數據發生變化時候觸發。一開始不會觸發,只有指定的數據發生變化就又觸發一次

  watch可以deep深度添加,computed不可以

 

25、對vue中nextTick的理解

  vue中nextTick可以拿到更新后的DOM元素

  如果在mounted下不能准確拿到DOM元素,可以使用nextTick

  在Vue生命周期的created()鈎子函數進行的DOM操作一定要放在Vue.nextTick()的回調函數中

 

26、自定義指令(v-check,v-focus) 方法有哪些? 它有哪些鈎子函數? 有哪些鈎子函數參數

  全局定義指令:在vue對象的directive方法里面有兩個參數,分別為指令名稱、函數組件內定義指令:directives

  鈎子函數: bind(綁定事件出發)、inserted(節點插入時候觸發)、update(組件內相關更新)

  鈎子函數參數: el、binding

 

27、如何優化SPA應用的首屏加載速度慢的問題

  1)將公用的JS庫通過script標簽外部引入,讓瀏覽器並行下載資源文件,提高下載速度

  2)在配置 路由時,頁面和組件使用懶加載方式引入,在調用組件時再加載對應的js文件

  3)加一個首屏 loading 圖,提升用戶體驗

 

28、請分別說出vue修飾符trim、number、lazy的作用

  trim:用來過濾前后的空格

  number:將用戶輸入的數據綁定為number類型

  lazy:使用了這個修飾符將會從“input事件”變成change事件進行同步

 

29、vue-router 有哪幾種導航鈎子,它們有哪些參數

  全局導航鈎子:to、from、next

  組件內的鈎子:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave

  單個路由獨享的鈎子:beforeEnter

 

30、路由之間如何進行跳轉

  聲明式(標簽跳轉) <router-link :to="xxx">

  編程式( js 跳轉) router.push('index')

 

31、說一下懶加載(按需加載路由)

  webpack 中提供了 require.ensure()來實現按需加載。以前引入路由是通過 import 這樣的方式引入,改為 const 定義的方式進行引入

  不進行頁面按需加載引入方式

import  home   from '../common/home.vue'

  進行頁面按需加載的引入方式:

const home = r => require.ensure( [], () => r (require('../common/home.vue')))

 

 32、vue中$router和$route區別

  router是VueRouter的一個對象,通過Vue.use(VueRouter),和VueRouter構造函數得到一個router的實例對象

  route是一個跳轉的路由對象,每一個路由都會有一個route對象

  是一個局部的對象,可以獲取對應的name,path,params,query等

 

33、vue-loader是什么?使用它的用途有哪些

  vue文件的一個加載器,跟template/js/style轉換成js模塊

  用途:js可以寫es6、style樣式可以scss或less、template可以加jade等

 

34、vue-router中query與params區別

   query和params兩者都是在Vue路由中傳參

  query用path來引入,params只能用name來傳遞,不能使用path 

  query更像get請求(地址欄會顯示參數),而params更像post(不會在地址欄顯示參數)

 

35、怎么定義vue-router的動態路由?怎么獲取傳過來的動態參數

  在router目錄下的index.js文件中,對path屬性加上/:id

  使用router對象的params.id

 

36、嵌套路由怎么定義

  在 VueRouter 的參數中使用 children 配置,這樣就可以很好的實現路由嵌套

  children 里面是子路由,當然子路由里面還可以繼續嵌套子路由

 

37、active-class是哪個組件的屬性?

  vue-router模塊的router-link組件

 

38、舉例vue常用的路由對象,以及作用

  $route.name 當前路由的名稱

  $route.path 當前路由對象的路徑

  $route.meta 在路由里面埋一個字段,當切換路由時候把信息傳過去

  $route.query 查詢信息包含路由中查詢參數的鍵值對

  $route.hash 當前路徑的哈希值,帶#

  $route.params 預設的變量,切換時候通過parmas帶過去某個id的值

 

39、請說出vue.cli項目中src目錄每個文件夾和文件的用法

  main.js是入口文件

  app.vue是一個主組件

  view放視圖頁面

  components放組件

  router是定義路由相關的配置

  assets文件夾是放靜態資源

 

40、vue.cli中怎樣使用自定義的組件

  第一步:在components目錄新建你的組件文件

  第二步:在需要用的頁面(組件)中導入

  第三步:注入到vue的子組件的components屬性上面

  第四步:在template視圖view中使用

 

41、什么是vue生命周期,作用是什么,第一次頁面加載會觸發哪幾個鈎子

  vue實例從創建到銷毀的過程

  也就是從開始創建、初始化數據、編譯模板、掛載Dom→渲染、更新→渲染、卸載等一系列過程,我們稱這是 Vue 的生命周期

  作用:生命周期中有多個事件鈎子,讓我們在控制Vue實例的過程時更容易形成好的邏輯

  第一次頁面加載時會觸發 beforeCreate, created, beforeMount, mounted 這幾個鈎子

 

42、簡單描述每個周期具體適合哪些場景

  beforecreate : 可以在這加個loading事件,在加載實例時觸發

  created : 初始化完成時的操作,比如結束loading事件,也可以操作異步請求

  mounted : 掛載元素,獲取到DOM節點,推薦使用nextTick

  updated : 如果對數據統一處理,在這里寫上相應函數

  beforeDestroy : 可以做一個確認停止事件的確認框,關掉定時器

  destroyed:當前組件已被刪除,清空相關內容

 

43、說一下vue中slot插槽

  插槽就是vue實現的一套內容分發的API,將插槽元素作為承載分發內容的出口。

  在組件模板中默認占一個位置,當使用組件標簽時候,組件標簽的內容會自動替換掉內容

  slot中可以設置一些默認的內容,如果傳遞了內容則會替換掉,如果沒有名字的標簽會默認放到default中

 

44、computed、watch各是一個對象時,它們有哪些選項? computed 和 methods 有什么區別? computed 是否能依賴其它組件的數據?

  computed有get set兩個選項

  watch有handler deep 是否深度,immeditate 是否立即執行

  methods是一個對象,可以在對象中定義一個個方法,能接受參數,而computed不能

  computed是可以緩存的,methods不會

  computed可以依賴其他computed,甚至是其他組件的data

 

45、如何理解Vue中的Render渲染函數

  Vue一般使用template來創建HTML,然后有的時候,我們需要使用javascript來創建html,這時候我們需要使用render函數

  render函數return一個createElement組件中的子元素存儲在組件實列中

  createElement返回的是包含的信息會告訴VUE頁面上需要渲染什么樣的節點。我們稱這樣的節點為虛擬DOM

 

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

  vuex是vue框架中的狀態管理器

  在main.js引入store,注入,新建了一個目錄store,export導出

  適用場景:單頁應用中,組件之間的狀態。音樂播放、登錄狀態、加入購物車

 

47、在Vue生命周期的created()鈎子函數進行的DOM操作一定要放在Vue.nextTick() 回調函數中。原因是什么呢

  在 created() 鈎子函數執行的時候DOM其實並未進行任何渲染,而此時進行 DOM 操作無異於徒勞,

  所以在數據變化后要執行的某個操作,而這個操作需要使用隨數據改變而改變的DOM結構的時候,這個操作都應該放進Vue.nextTick() 的回調函數中

 

48、vuex中store的特性是什么

  vuex 就是一個倉庫,倉庫里放了很多對象。

  其中 state 就是數據源存放地,對應於一般 vue 對象里面的 data

  state 里面存放的數據是響應式的,vue 組件從 store 讀取數據,若是 store 中的數據發生改變,依賴這相數據的組件也會發生改變

  它通過 mapState 把全局的 state 和 getters 映射到當前組件的 computed 計算屬性

 

49、vue中ajax請求代碼應該寫在組件的 methods 中還是vuex的action中?

  如果請求來的數據不是要被其他組件公用,僅僅在請求的組件內使用,就不需要放入 vuex 的 state 里

  如果被其他地方復用,請將請求放入 action 里,方便復用,並包裝成 promise 返回

 

50、說一下vuex的思想

  Vuex 的思想是 當我們在頁面上點擊一個按鈕,它會觸發(dispatch)一個action, action 隨后會執行(commit)一個mutation, mutation 立即會改變state,

   state 改變以后,我們的頁面會state 獲取數據,頁面發生了變化。 Store 對象,包含了我們談到的所有內容,action, state, mutation

 

以上內容摘自   紫諾花開  復制過來以便復習  如有閱讀需要 可跳轉 https://www.cnblogs.com/theblogs/category/1406469.html 查看

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM