Vue.js以業務為中心的常見面試題

2021-02-21 Vue中文社區

來源:前端熱點分析

前言

希望可以通過這篇文章,能夠給你得到幫助。(感謝一鍵三連)

1.h5底部輸入框被鍵盤遮擋問題

如果你遇到h5頁面這個問題,當輸入框在最底部,點擊軟鍵盤後輸入框會被遮擋,可以如下解決問題:

var getHeight = $(document).height();

$(window).resize(function(){
 if($(document).height() < getHeight) {
  $('#footer').css('position','static');
 }else {
  $('#footer').css('position','absolute');
 }
});

2.觸屏即播放
$('html').one('touchstart',function(){
 audio.play()
})

3.阻止旋轉屏幕時自動調整字體大小
html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 {-webkit-text-size-adjust:none;}

4.主流網站布局

頁面分為3個部分:頁面的頂部header,底部footer,中間部分(側欄side和主要部分main)。

下面代碼展示:

<body>
 // 頁面層容器
 <div id="container">
  // 頁面頭部
  <div id="header"></div>
  // 頁面主體
  <div id="main">>
   // 側邊欄
   <div id="side">
   </div>
  </div>
  // 頁面底部
  <div id="footer"></div>
 </div>
</body>

設計頁面樣式代碼如下:

<style type="text/css">
 body{
  font: 12px 微軟雅黑;
  margin: 0px;
  text-align: center;
  background: #fff;
 }
 
 // 頁面層容器
 #container {
  width: 100%;
 }
 #header {
  width: 800px;
  margin: 0 auto;
  height: 100px;
  background: #FFCC99;
 }
 #main {
  width: 800px;
  margin: 0 auto;
  height: 400px;
 }
 #side {
  float: left;
  width: 20em;
  background: red;
  padding: 15px 0;
 }
 #foot {
  width: 800px;
  margin: 0 auto;
  height: 50px;
  background: #00ffff;
 }
</style>

效果圖如下:

5.什麼是MVVM框架?

MVVM框架是一個Model-View-ViewModel框架,其中ViewModel連接模型Model和視圖View。

在vue.js中的MVVM模式:

vue.js是通過數據驅動的,vue.js實例化對象將dom和數據進行綁定,一旦綁定,dom和數據將保持同步,每當數據發生變化,dom也會隨著變化;ViewModel是Vue.js的核心,它是Vue.js的一個實例。Vue.js會針對某個HTML元素進行實例化,這個HTML元素可以是body,也可以是某個css選擇器所指代的元素。DOM Listeners和Data Bindings是實現雙向綁定的關鍵。DOM Listeners監聽頁面所有View層中的DOM元素,當發生變化時,Model層的數據隨之變化。Data Bindings會監聽Model層的數據,當數據發生變化時,View層的DOM元素也隨之變化。

6.active-class是哪個組件的屬性

它是vue-router模塊的router-link組件的屬性

7.如何定義vue-router的動態路由

在靜態路由名稱前面添加冒號,如設置id動態路由參數,為路由對象的path屬性設置/:id

8.如何獲取傳過來的動態參數

在組件中,使用$router對象的params.id,如$route.params.id

9.vue-router有哪幾種導航的鉤子

有三種,第一種是全局導航鉤子,router.beforeEach(to,from,next),作用是跳轉前進行判斷攔截;第二種是組件內的鉤子;第三種是單獨路由獨享組件。

導航鉤子又叫導航守衛,又分為全局鉤子,單個路由獨享鉤子和組件級鉤子。

全局鉤子有beforeEach,beforeResolve,afterEach,單個路由獨享鉤子有:beforeEnter

組件級鉤子有:beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave:它們有以下參數:

to表示即將要進入的目標路由對象;from表示當前導航正要離開的路由;next表示一定要用這個函數才能到達下一個路由,如果不用就會遭到攔截。

10.mint-ui是什麼

mint-ui它是基於Vue.js的前端組件庫,用npm安裝,然後通過import導入樣式和JavaScript代碼,vue.use(mintUi)用於實現全局引入,import {Toast} from 'mint-ui'用能於在單個組件局部引入

11.v-model是什麼

v-model是vue.js的一條指令,實現數據的雙向綁定

雙向數據綁定的原理:

vue.js使用es5提供的屬性特性功能,結合發布者-訂閱者模式,通過Object.defineProperty()為各個屬性定義get,set特性方法,在數據發送改變時給訂閱者發布消息,觸發相應的監聽回調。

過程:a,對需要觀察的數據對象進行遞歸遍歷,包含子屬性對象的屬性,設置set和get特性方法;當給這個對象的某個值賦值時,會觸發綁定的set特性方法,就能起到監聽數據的變化。b,用compile解析模板指令,將模板中的變量替換成數據,然後初始化渲染頁面視圖,並將每個指令對應的節點綁定更新函數,添加監聽數據的訂閱者,一旦數據有變動,就會收到通知,並更新視圖。c,Watcher訂閱者是Observer和Compile之間通信的橋梁:在自身實例化時向屬性訂閱器dep裡面添加自己;自身必須有一個update()方法;在dep.notice()發布通知時,能調用自身的update()方法,並觸發Compile中綁定的回調函數。d,MVVM是數據綁定的入口,整合了Observer,Compile和Wathcher三者,通過Observer來監聽自己的model數據變化,通過Compile來解析編譯模板指令,最終利用Watcher來搭起Observer和Compile之間的通信橋梁,達到數據變化通知視圖更新的效果,利用視圖交互,變化更新數據model變更的雙向綁定效果。

12.vue.js中標籤如何綁定事件

第一種方式,使用v-on;第二種方式,使用@語法糖

13.vuex是什麼

vuex是vue.js框架實現的狀態管理系統。使用vuex,要引入store,並注入vue.js組件中,在組件內部可以通過$store訪問store對象;使用場景,在單頁應用中,用於組件之間的通信,如音樂播放,登錄狀態管理,加入購物車等

vuex可以說是一種開發模式或框架,它是對vue.js框架數據層面的擴展,通過狀態集中管理驅動組件的變化,應用的狀態集中放在store中,改變狀態的方式是提交mutations,這是個同步的事務,異步的邏輯應該封裝在action中。

14.在vue中說說你知道的自定義指令

自定義指令兩種:一種全局自定義指令,vue.js對象提供了directive方法,可以用來自定義指令,directive方法接收兩個參數,一個是指令名稱,另一個是函數;第二種是局部自定義指令,通過組件的directives屬性定義。

15.vue.js中常用的4種指令

v-if判斷對象是否隱藏;v-for循環渲染;v-bind綁定一個屬性;v-model實現數據雙向綁定

在v-if循環中實現v-model數據的雙向綁定:

有時需要創建input,並用v-model實現數據的雙向綁定。此時可以為v-model綁定數組的一個成語selected[$index],這樣可以給不同的input綁定不同的v-model:

<div v-for="(item,index) in arrDa">
 <input type="text" v-model="arrData[index]">
 <h1>{{arrDa[index]}}</h1>
</div>

16.vue-router是什麼

vue-router是vue.js的路由插件,(常用router-link和router-view)

17.vue.js的生命周期

共分8個階段:

在實例初始化之後,數據觀測者data observer和event/watcher事件配置之前調用

在實例創建完成後立即調用,此時,實例已完成:觀測者,屬性和方法的運算,watch/event事件回調,掛載階段還沒開始,$el屬性目前不可見。

在掛載開始之前調用,相關的render函數首次調用。

el被新創建的vm.$el替換,並且在掛載到實例上之後再調用該鉤。如果root實例掛載了一個文檔內元素,當調用mounted時vm.$el也在文檔內。

在數據更新時調用,發生在虛擬dom重新渲染和打補丁之前。

由於數據更改導致的虛擬dom重新渲染和打補丁,在這之後會調用該鉤子。

在實例銷毀之前調用,在這一步,實例仍然完全可用。

在vue.js實例銷毀後調用,vue.js實例指示的所有東西都會解除綁定,所有的事件監聽會被移除,所有的子實例也會被銷毀。

如果使用組件的keep-alive功能時,增加兩個周期:

activated在keep-alive組件激活時調用;deactivated在keep-alive組件停用時調用。

<keep-alive>包裹動態組件時,會緩存不活動的組件實例,而不是銷毀它們。<keep-alive>是一個抽象組件,它自身不會渲染一個DOM元素,也不會出現在父組件鏈中。

當在<keep-alive>內切換組件時,它的activated和deactivated這兩個生命周期鉤子函數將會執行。

<keep-alive>
 <component :is="view"></component>
</keep-alive>

增加一個周期鉤子:ErrorCaptured表示當捕獲一個來自子孫組件的錯誤時調用。

18.描述封裝vue組件的作用過程

組件可以提升整個項目的開發效率,能夠把頁面抽象成多個相對獨立的模塊,解決了傳統項目開發中效率低,難維護,復用性等問題。

使用Vue.extend方法創建一個組件,使用Vue.component方法註冊組件,子組件需要數據,可以在props中接收數據,而子組件修改好數據後,想要把數據傳遞給父組件,可以使用emit方法。

使用自定義組件:

在components目錄中新建組件文件,腳本一定要導出暴露的接口;導入需要用到的頁面;將導入的組件注入vue.js的子組件的components屬性中;在template的視圖中使用自定義組件。

創建組件

<div id="app">
 <dada></dada>
</div>
<template id="demo">
 <div>
  <h1>{{msg}}</h1>
 </div>
</template>
<script type="text/javascript">
// 定義組件類
var dada = Vue.extend({
 template: '#demo',
 data:function() {
  return {
   msg: 'dadaqianduan.cn'
  }
 }
})
// 註冊組件
Vue.component('dada',dada);
// 定義Vue實例化對象
var app = new Vue({
 el: '#app',
 data: {}
})
</script>

19.vue-loader是什麼

vue-loader它是解析.vue文件的一個加載器,將template/js/style轉換成javascript模塊;通過這個vue-loader,javascript可以寫EMAScript6語法,style樣式可以應用scss或less,template可以添加jade語法。。。

20.在vue.cli項目中的src目錄說明21.對vue.js的template編譯的理解

首先轉化成AST抽象語法樹,Abstract Syntax Tree,就是將原始碼語法結構抽象成樹狀表現形式,然後通過render函數進行渲染,並返回VNode(Vue.js的虛擬dom節點)。

通過compile編譯器把template編譯成AST,compile是createCompiler的返回值,createCompiler用來創建編譯器,compile還負責合併option;AST會經過generate-將AST轉換成render function 字符串的過程-得到render函數,render的返回值是VNode,VNode是Vue.js的虛擬DOM節點,裡面有標籤名,子節點,文本等。

22.v-show指令和v-if指令的區別

它們都是條件渲染指令,不同的是,v-show的值無論是true或false元素都會存在於html頁面中,而v-if的值為true時,元素才會存在於html頁面中。

v-show指令是通過修改元素的style屬性值實現的。

23.讓css只在當前組件中起作用

只需要在style標籤中添加scoped屬性,<style scoped></style>

24.在vue.js中如何實現路由嵌套

路由嵌套會將其他組件渲染到該組件內,而不是使整個頁面跳轉到router-view定義組件渲染的位置,要進行頁面跳轉,要將頁面渲染到根組件內。首先實例化根組件,在根組件中定義組件渲染容器,然後,掛載路由,當切換路由時,將會切換整個頁面。

new Vue({
 el: '#dada',
 router: router,
 template: '<router-view></router-view>'
})

25.在vue.js中的ref屬性有什麼作用

可以直接訪問組件內部的一些元素,定義屬性可以在組件內部通過this.$refs屬性,,訪問設置ref屬性的元素,這是一個原生的DOM元素,要使用原生DOM API操作它們。

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

在config/index.js內對proxyTable項進行如下配置:

proxyTable: {
 '/api': {
   target: 'http://xxx.com',
   changeOrign: true,
   pathRewrite: {
    '^/api': ''
   }
  }
}

27.axios是什麼

axios是vue2.0中用來替換vue-resource.js插件的一個模塊,是一個請求後臺資源的模塊

使用npm install axios來安裝axios

import Vue from 'vue'
import axios from 'axios';
Vue.prototype.$http = axios;
new Vue({
 el: 'dada',
 data: {
  mag: ''
 },
 template: '<h1>{{msg}}</h1>',
 created: function() {
  this.$http.get('data.json').then(res=>{
   this.msg = res.data.data
  })
 }
})

當調用axios.post('api/user')時,表示發送post異步請求。

28.sass是什麼

sass是一種css預編譯語言,用npm安裝加載程序;在webpack.config.js中配置sass加載程序

module: {
 // 加載程序
 loaders: {
  // 加載scss
  {
   test: /\.scss$/,
   loader: 'vue-style-loader!css-loader!sass-loader'
  }
 }
}

29.什麼情況下會產生片段實例

模板包含多個頂級元素;模板只包含普通文本;模板只包含其他組件,模板只包含一個元素指令,如vue-router的<router-view>;模板根節點有一個流程 控制指令,如v-if或v-for

這些情況讓實例有未知數量的頂級元素,模板將把它的DOM內容當作片段。片段實例仍然會正確地渲染內容。不過,模板沒有一個根節點,它的$el指向一個錨節點,即一個空的文本節點。

在vue2.0中,組件的模板只允許有權只有一個根節點。

30.  實現多個根據不同條件顯示不同文字的方法
<div id="app">
 <input type="text" v-model="inputValue">
 <h1>{{showValue}}</h1>
</div>
var app = new Vue({
 el: '#app',
 data: {
  inputValue: ''
 },
 computed: {
  showValue: function() {
   return this.inputValue || '請輸入內容'
  }
 }
})

31.什麼是數據的丟失

如果在初始化時沒有定義數據,之後更新的數據是無法觸發頁面渲染更新的,這部分數據是丟失的數據,這種現象叫數據的丟失。

32.如何檢測數據的變化

為了解決該問題,Vue.js擴展了觀察數組,為它添加了一個$set()方法,用該方法修改的數組,能觸發視圖更新,檢測數據變化。

app.$set(app.arr, 5, 500);

由於javascript特性的限制,vue.js不能檢測到對象屬性的添加或刪除,因為Vue.js在初始化時將數組轉化為getter/setter,所以屬性必須在data對象中定義,才能在初始化時讓vue.js轉換它並讓它響應。

var data = {
 obj: {
  a: 1
 }
}
var app = new Vue({
 el: '#app',
 data: data
})
app.ojb.a = 10
app.obj.b = 20 // 不是響應的
data.obj.b = 20 // 不是響應的

如果需要在實例創建之後添加屬性並且讓它能夠響應,使用$set實例方法:

app.$set(app.obj, 'b', 200)

對於普通數據對象,可以全局方法Vue.set(object,key,value)

Vue.set(data.obj, 'b', 250)

33.vue.js文件中的樣式覆蓋不生效的問題

在style上加上scoped可以讓樣式私有化,只針對當前vue.js文件中的代碼有效,不會對別的文件中的代碼造成影響,有時,引入第三方UI,在vue.js文件中進行樣式覆蓋不生效,大概是因為style上的scoped導致的。

可以將需要覆蓋樣式的這部分代碼放到單獨的css文件中,在main.js文件導入即可。

34.如何解決數據層級結構太深

在開發中,常出現異步獲取數據的情況,有時數據層次太深,如:

<text v-text="a.b.c.d"></text>

可以使用vm.$set手動定義一層數據:vm.$set("dada", a.b.c.d)

35.vue.js頁面的閃爍

在vue.js有一個v-cloak指令,該指令一直保持在元素上,直到關聯實例結束編譯。當和css使用時,這個指令可以隱藏未編譯的標籤,直到實例編譯結束:<div>不會顯示,直到編譯結束。

[v-cloak] {
 display: none;
}
<div v-cloak>{{dada}}</div>

覺得不錯,請點個在看呀

相關焦點

  • 前端面試題——Vue
    前言前幾天整理了一些 html + css + JavaScript 常見的面試題(https://segmentfault.com/u/youdangde_5c8b208a23f95/articles),然後現在也是找了一些在 Vue 方面經常出現的面試題,留給自己查看消化,也分享給有需要的小夥伴。
  • 35道常見的前端vue面試題
    vue面試題。對於前端來說,儘管css、html、js是主要的基礎知識,但是隨著技術的不斷發展,出現了很多優秀的mv*框架以及小程序框架。因此,對於前端開發者而言,需要對一些前端框架進行熟練掌握。這篇文章我們一起來聊一聊VUE及全家桶的常見面試問題。1、請講述下VUE的MVVM的理解?
  • 20 道必看的 Vue 面試題 | 原力計劃
    Model 層代表數據模式,也可以在 Model 中定義數據修改和操作的業務邏輯;View 代表 UI 組件,它負責將數據模型轉化為 UI 展現出來,ViewModel 是一個同步 View 和 Model 的對象。2. 父組件向子組件傳值的方法?父組件傳遞的數據子組件用 props 方法接收。
  • Vue面試題(3)Vue-Router和Vuex
    本文收集和整理了有關Vue-Router和Vuex的面試題,希望對準備面試和深入學習的小夥伴有所幫助!
  • 【項目推薦】Vue.js
    作者是尤雨溪,寫下這篇文章時 vue.js版本為 1.0.7 。我推薦使用 sublime text 作為編輯器,關於這個編輯器可以看我這篇文章。new Vue({ el:'#app', data: { message:'hello vue.js.' }});在使用 Vue.js 之前,我們需要先像這樣實例化一個 Vue 對象:就像 HelloWorld 展示的那樣,app.html 是 view 層,app.js 是 model 層,通過 vue.js(使用 v-model
  • Vue面試中,經常會被問到的面試題/Vue知識點整理
    來源 | https://segmentfault.com/a/1190000016344599看看面試題,只是為了查漏補缺,看看自己那些方面還不懂
  • Vue.js布局
    動態Vue.js布局組件前言vue.js是漸進增強的視圖庫,可以作為.html頁面部分使用,也可以結合vue-router、vuex、axios用來構建單頁面或多頁面應用。
  • 七種需要避免的Vue.js常見錯誤
    同時,Vue生態系統所支持的庫在與單文件組件(SFC)等工具結合使用時,Vue也能夠為複雜的單頁應用提供相應的驅動與功能。 具體較強的靈活性 缺點: 社區規模較小 雖然優勢大於劣勢,但是由於大多數開發人員未能遵循Vue.js的優秀實踐(請參見-- https://levelup.gitconnected.com/best-practices-for-vue-js-b46760fe0096
  • 20 道必看的 Vue 面試題|原力計劃
    Model 層代表數據模式,也可以在 Model 中定義數據修改和操作的業務邏輯;View 代表 UI 組件,它負責將數據模型轉化為 UI 展現出來,ViewModel 是一個同步 View 和 Model 的對象。2. 父組件向子組件傳值的方法?
  • 【別笑】手撕吊打面試官系列面試題
    必備面試題js基礎1.用js列印一個乘法表這一題面試官考察的是你關於js的列印相關基礎api的熟悉程度,以及基本的數學常識,送分題console.log(`1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=94*1=4 4*2=8 4*3=12 4*4=16
  • 面試官:聊聊對Vue.js框架的理解
    本文為一次前端技術分享的演講稿,所以盡力不貼 Vue.js 的源碼,因為貼代碼在實際分享中,比較枯燥,效果不佳,而更多的是以圖片和文字的形式進行表達。為了保證數據流的可追溯性,直接修改組件內 prop 的 msg 欄位是不提倡的,且例子中為非引用類型 String,直接修改也修改不了,這個時候需要將修改 parentMsg 的事件傳遞給 child.vue,讓 child.vue 來觸發修改 parentMsg 的事件。如:<!
  • 「Vue.js開發連載一」Vue.js簡介
    另一方面,當與單文件組件和Vue生態系統支持的庫結合使用時,Vue也完全能夠為複雜的單頁應用程式提供驅動。Vue.js的目標是通過儘可能簡單的API實現響應的數據綁定和組合的視圖組件。Vue.js自身不是一個全能框架——它只聚焦於視圖層。
  • 2021全新 最火Vue面試題(一)(附源碼)
    這裡在回答時可以帶出一些相關知識點(比如多層對象是通過遞歸來實現劫持,順帶提出Vue3中是使用proxy來實現響應式數據)補充回答:內部依賴收集是怎樣做到的,每個屬性都擁有自己的dep屬性,存放他所依賴的watcher,當屬性變化後會通知自己對應的watcher去更新 (其實後面會講到每個對象類型自己本身也擁有一個dep屬性,這個在$set面試題中在進行講解)
  • 揭密vue.js的神秘之處,小程序跟vue有什麼關係
    MPvue是vue.js框架的一種開發思路,在MPvue在做美團小程序的項目中獲得實驗和驗證,並且在美團點評的小程序的項目中大範圍使用,美團為vue.js提供了一套開發組件供微信小程序的開發者使用,由餓了麼 UED (知乎專欄)設計的桌面端組件庫已經開源,滴滴也開放自己的
  • Vue.js 2.5 發布,而這個會玩的團隊已經自研出用 Vue 開發小程序的...
    注意:TypeScript 用戶還應將以下包更新為最新版本從而兼容類型聲明:vue-router,vuex,vuex-router-sync 和vue-class-component。更好地錯誤處理在2.4及更早版本中,我們通常使用全局 config.errorHandleroption 來處理應用程式中的意外錯誤。
  • Vue.js最佳實踐(五招讓你成為Vue.js大師)
    如果有人需要Vue.js入門系列的文章可以在評論區告訴我,有空就給你們寫。對大部分人來說,掌握Vue.js基本的幾個API後就已經能夠正常地開發前端網站。但如果你想更加高效地使用Vue來開發,成為Vue.js大師,那下面我要傳授的這五招你一定得認真學習一下了。
  • CKEditor 4 編輯器已與 Vue.js 集成
    近日,CKEditor 團隊發布了與 Vue.js 框架原生集成的 CKEditor 4。根據官方的介紹,CKEditor 4 只是一個 JavaScript 富文本編輯組件,與大家熟知的 JavaScript 框架都兼容,它沒有使用小眾技術或要求在不常見的環境中運行。
  • 10 個實用的 Vue.js 工具和庫
    這意味著社區可以構建和共享可復用的插件以滿足常見需求。Vue CLI 強大的 GUI(Vue UI,它隨 CLI 一起提供)則為其錦上添花。在其幫助下你可以輕鬆創建並直接配置和管理項目。其工作機制可總結為以下三個步驟:你負責提供 Markdown、JSON、YAML 或 CVS 數據格式的內容,或從 WordPress 或 Drupal 等 CMS 導入內容。內容會被轉換為 GraphQL 層,該層負責中心化數據管理。然後你基於這些數據用 Vue 構建應用程式。
  • Vue.js+Node.js 移動端小米商城全棧開發
    Vue.js靈活易學而且功能強大,是最流行的且性價比也最高的前端框架,國內絕大部分公司都在使用,它的生態環境仍在生長並且它已經擁有構建各種應用所需的一切Vue全家桶的文檔 ES2015常用語法 組件化 模塊化 基於Vue的UI庫 開發環境配置基礎環境開發工具瀏覽器模擬數據接口管理平臺項目目錄結構vue
  • 初步認識vue.js框架的使用
    vue.js框架是幹什麼的Vue.js 是一個JavaScriptMVVM庫,是一套構建用戶界面的漸進式框架。它是以數據驅動和組件化的思想構建的,採用自底向上增量開發的設計。相比於Angular.js,Vue.js提供了更加簡潔、更易於理解的API,使得我們能夠快速地上手並使用Vue.js。如何使用vue.js1.下載 vue.min.js 並用 <script> 標籤引入。