2018最新web前端VUE面試題

vue是什么?

vue是構建數據驅動的web界面的漸進式框架。Vue.js 的目標是通過盡可能簡單的 API 實現響應的數據綁定和組合的視圖組件。

vue是一種mvc和mvvm模式的開發框架,他的v-model可以實現數據的雙向綁定。

不用操作dom節點并可以用v-for進行數據渲染。


vue的優點是什么?

a.低耦合。視圖(View)可以獨立于Model變化和修改,一個ViewModel可以綁定到不同的"View"上,當View變化的時候Model可以不變,當Model變化的時候View也可以不變。

b.可重用性。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯。

c.獨立開發。開發人員可以專注于業務邏輯和數據的開發(ViewModel),設計人員可以專注于頁面設計。

d.可測試。界面素來是比較難于測試的,而現在測試可以針對ViewModel來寫。


vue當中的指令和它的用法?

v-if、v-show:判斷是否隱藏;v-for:數據循環出來;v-on:監聽事件、@change、@click;v-bind:class:綁定一個屬性;v-model:實現雙向綁定。


v-if和v-show指令的共同點和不同點?

v-show指令是通過修改元素的displayCSS屬性讓其顯示或者隱藏。

v-if指令是直接銷毀和重建DOM達到讓元素顯示和隱藏的效果。


v-model是什么?怎么使用? vue中標簽怎么綁定事件?

可以實現雙向綁定。

vue的model層的data屬性。綁定事件:v-bind


vue的雙向綁定的原理?

vue.js 是采用數據劫持結合發布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變動時發布消息給訂閱者,觸發相應的監聽回調。那么vue是如果進行數據劫持的,我們可以先來看一下通過控制臺輸出一個定義在vue初始化數據上的對象是個什么東西。

代碼:

var vm = new Vue({

? ? data: {

? ? ? ? obj: {

? ? ? ? ? ? a: 1

? ? ? ? }

? ? },

? ? created: function () {

? ? ? ? console.log(this.obj);

? ? }

});

我們可以看到屬性a有兩個相對應的get和set方法,為什么會多出這兩個方法呢?因為vue是通過Object.defineProperty()來實現數據劫持的。

Object.defineProperty( )是用來做什么的?它可以來控制一個對象屬性的一些特有操作,比如讀寫權、是否可以枚舉,這里我們主要先來研究下它對應的兩個描述屬性get和set,如果還不熟悉其用法

在平常,我們很容易就可以打印出一個對象的屬性數據:

var Book = {

? name: 'vue權威指南'

};

console.log(Book.name);? // vue權威指南

如果想要在執行console.log(book.name)的同時,直接給書名加個書名號,那要怎么處理呢?或者說要通過什么監聽對象 Book 的屬性值。這時候Object.defineProperty( )就派上用場了,代碼如下:

var Book = {}

var name = '';

Object.defineProperty(Book, 'name', {

? set: function (value) {

? ? name = value;

? ? console.log('你取了一個書名叫做' + value);

? },

? get: function () {

? ? return '《' + name + '》'

? }

})

Book.name = 'vue權威指南';? // 你取了一個書名叫做vue權威指南

console.log(Book.name);? // 《vue權威指南》

我們通過Object.defineProperty( )設置了對象Book的name屬性,對其get和set進行重寫操作,顧名思義,get就是在讀取name屬性這個值觸發的函數,set就是在設置name屬性這個值觸發的函數,所以當執行?Book.name = 'vue權威指南' 這個語句時,控制臺會打印出 "你取了一個書名叫做vue權威指南",緊接著,當讀取這個屬性時,就會輸出 "《vue權威指南》"。

實現過程

因此接下去我們執行以下3個步驟,實現數據的雙向綁定:

1.實現一個監聽器Observer,用來劫持并監聽所有屬性,如果有變動的,就通知訂閱者。

2.實現一個訂閱者Watcher,可以收到屬性的變化通知并執行相應的函數,從而更新視圖。

3.實現一個解析器Compile,可以掃描和解析每個節點的相關指令,并根據初始化模板數據以及初始化相應的訂閱器。


vue路由怎么使用?

1.下載安裝(用webpack新建vue項目時,默認選擇安裝vue-router),

2.創建路由文件,

3.在router文件夾里的index.js里配置路由,

4.在main.js中引入router文件夾下的router.js文件

5.在app.vue里設置錨點 (router-link 和 router-view ,routerlink鏈接到的路由會展示在router-view里,如果沒有router-view標簽且index.js設置路由的name屬性則頁面會直接跳轉)


vue路由怎么實現傳值的?

當你使用params方法傳參的時候,要在路由后面加參數名,并且傳參的時候,參數名要跟路由后面設置的參數名對應。使用query方法,就沒有這種限制,直接在跳轉里面用就可以。


組件之間的傳值通信?

1.子組件在props中創建一個屬性,用來接收父組件傳過來的值;

2.在父組件中注冊子組件;

3.在子組件標簽中添加子組件props中創建的屬性;

4.把需要傳給子組件的值賦給該屬性。

子組件向父組件傳值:

1.子組件中需要以某種方式(如點擊事件)的方法來觸發一個自定義的事件;

2.將需要傳的值作為$emit的第二個參數,該值將作為實參傳給響應事件的方法;

3.在父組件中注冊子組件并在子組件標簽上綁定自定義事件的監聽。


vue-router的鉤子函數

總體來講vue里面提供了三大類鉤子

1、全局鉤子

2、某個路由獨享的鉤子

3、組件內鉤子

全局鉤子

顧名思義,全局鉤子全局用,使用如下

const router =new VueRouter({

? ? mode: 'history',

? ? base: __dirname,

? ? routes: routerConfig

})

router.beforeEach((to, from, next) => {

? ? document.title = to.meta.title || 'demo'if(!to.query.url && from.query.url) {

? ? ? ? to.query.url = from.query.url

? ? }

? ? next()

})

router.afterEach(route => {

})

某個路由獨享鉤子

就像說的一樣,給某個路由單獨使用的,本質上和后面的組件內鉤子是一樣的。都是特指的某個路由。不同的是,這里的一般定義在router當中,而不是在組件內。如下

const router =new VueRouter({

? routes: [

? ? {

? ? ? path: '/foo',

? ? ? component: Foo,

? ? ? beforeEnter: (to, from, next) => {

? ? ? ? // ...? ? ? },

? ? ? beforeLeave: (to, from, next) => {

? ? ? ? // ...? ? ? }

? ? }

? ]

})

組件內鉤子

首先看一下官方定義:

你可以在路由組件內直接定義以下路由導航鉤子

beforeRouteEnter

beforeRouteUpdate (2.2 新增)

beforeRouteLeave

路由組件!路由組件!路由組件!重要的事情說三遍,大家一定要注意這里說的是“路由組件”,而路由組件!== 組件,之前一直沒注意這點,然后在子組件里面傻乎乎的調鉤子函數發現一直沒用。。。

我們先來看一下什么是路由組件?

路由組件:直接定義在router中component處的組件

也就是說router中定義的入口vue文件之外的組件,是沒有鉤子函數的,也就不用說使用了。但是如果你使用了并不會報錯,只是沒反應。(本想畫個圖的,太懶了。。。自己理解理解吧,很好理解的)

這里再回頭看下這個路由內鉤子是怎么用的,很簡單和data、method平級的方法

beforeRouteLeave(to, from, next) {

? ? // ....? ? next()

},

beforeRouteEnter(to, from, next) {

? ? // ....? ? next()

},

beforeRouteUpdate(to, from, next) {

? ? // ....? ? next()

},

computed: {},

method: {}

三種路由鉤子中都涉及到了三個參數,這里直接上官方介紹吧

to: Route: 即將要進入的目標 路由對象

from: Route: 當前導航正要離開的路由

next: Function: 一定要調用該方法來 resolve 這個鉤子。執行效果依賴 next 方法的調用參數。

next(): 進行管道中的下一個鉤子。如果全部鉤子執行完了,則導航的狀態就是 confirmed (確認的)。

next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了(可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到 from 路由對應的地址。

next(‘/’) 或者 next({ path: ‘/’ }): 跳轉到一個不同的地址。當前的導航被中斷,然后進行一個新的導航。


axios是什么?怎么使用?

axios 是一個基于 Promise 的,為瀏覽器和 Node.js 設計的 HTTP 客戶端。它盡可能簡化封裝了 HTTP 相關的各種操作,在 Web App 中使用非常方便。

Vue 2 官方建議在由 Vue 構建的 SPA 中使用 axios 進行 HTTP 操作。

axios 用于請求后臺資源的模塊。npm install axios -S裝好,

然后發送的是跨域,需在配置文件中config/index.js進行設置。

后臺如果是Tp5則定義一個資源路由。js中使用import進來,

然后.get或.post。返回在.then函數中如果成功,

失敗則是在.catch函數中。


vuex

vuex是一個專門為vue.js設計的集中式狀態管理架構。我把它理解為在data中的屬性需要共享給其他vue組件使用的部分,就叫做狀態。簡單的說就是data中需要共用的屬性。如果沒有vuex 請求到的數據在頁面刷新后就必須再請求一次,但是有了vuex就可以把這些數據當做狀態保存到vuex中,在中大型項目中有很多共用的數據,就可以用vuex。比如單頁應用中,組件之間的狀態。音樂播放、登錄狀態、加入購物車就可以使用。


vuex有哪幾種屬性?

有五種,分別是 state(訪問狀態對象)、getter(計算過濾操作)、mutation(修改狀態)、action(異步修改狀態)、 module(模塊組)


vuejs與angularjs的區別?

相同點:

都支持指令:內置指令和自定義指令。

都支持過濾器:內置過濾器和自定義過濾器。

都支持雙向數據綁定。

都不支持低端瀏覽器。

不同點:

1.AngularJS的學習成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比較簡單、直觀。

2.在性能上,AngularJS依賴對數據做臟檢查,所以Watcher越多越慢。

Vue.js使用基于依賴追蹤的觀察并且使用異步隊列更新。所有的數據都是獨立觸發的。

對于龐大的應用來說,這個優化差異還是比較明顯的。


vue不操作DOM節點查找元素

一般來講,獲取DOM元素,需document.querySelector(".input1")獲取這個dom節點,然后在獲取input1的值。

但是用ref綁定之后,我們就不需要在獲取dom節點了,直接在上面的input上綁定input1,然后$refs里面調用就行。

然后在javascript里面這樣調用:this.$refs.input1? 這樣就可以減少獲取dom節點的消耗了


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

vue-router模塊的router-link組件


嵌套路由怎么定義?

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

import Vue from 'vue'

import VueRouter from 'vue-router'?

Vue.use(VueRouter)?

//引入兩個組件

import home from "./home.vue"?

import game from "./game.vue"?

//定義路由?

const routes = [?

? ? { path: "/", redirect: "/home" },//重定向,指向了home組件?

? ? {?

? ? ? ? path: "/home", component: home,?

? ? ? ? children: [?

? ? ? ? ? ? { path: "/home/game", component: game }?

? ? ? ? ]?

? ? }?

]?

//創建路由實例?

const router = new VueRouter({routes})?

new Vue({?

? ? el: '#app',?

? ? data: {?

? ? },?

? ? methods: {?

? ? },?

? ? router?

})


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

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

使用router對象的params.id。


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

css的預編譯。

使用步驟:

第一步:用npm 下三個loader(sass-loader、css-loader、node-sass)

第二步:在build目錄找到webpack.base.config.js,在那個extends屬性中加一個拓展.scss

第三步:還是在同一個文件,配置一個module屬性

第四步:然后在組件的style標簽加上lang屬性 ,例如:lang=”scss”

有哪幾大特性:

1、可以用變量,例如($變量名稱=值);

2、可以用混合器,例如()

3、可以嵌套


mint-ui是什么?怎么使用?說出至少三個組件使用方法?

基于vue的前端組件庫。npm安裝,然后import樣式和js,vue.use(mintUi)全局引入。在單個組件局部引入:import {Toast} from ‘mint-ui’。

組件一:Toast(‘登錄成功’);

組件二:mint-header;

組件三:mint-swiper


mvvm框架是什么?它和其它框架(jquery)的區別是什么?哪些場景適合?

一個model+view+viewModel框架,數據模型model,viewModel連接兩個

區別:vue數據驅動,通過數據來顯示視圖層而不是節點操作。

場景:數據操作比較多的場景,更加便捷


自定義指令(v-check、v-focus)的方法有哪些?它有哪些鉤子函數?還有哪些鉤子函數參數?

全局定義指令:在vue對象的directive方法里面有兩個參數,一個是指令名稱,另外一個是函數。組件內定義指令:directives

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

鉤子函數參數:el、binding


你是怎么認識vuex的?

vuex可以理解為一種開發模式或框架。比如PHP有thinkphp,java有spring等。

通過狀態(數據源)集中管理驅動組件的變化(好比spring的IOC容器對bean進行集中管理)。

應用級的狀態集中放在store中; 改變狀態的方式是提交mutations,這是個同步的事物; 異步邏輯應該封裝在action中。


vue.cli中怎樣使用自定義的組件?有遇到過哪些問題嗎?

第一步:在components目錄新建你的組件文件(swithButton.vue),script一定要export default {

第二步:在需要用的頁面(組件)中導入:import swithButtonfrom ‘../components/swithButton.vue’

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

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

問題有:swithButton命名,使用的時候則swith-button。


聊聊你對Vue.js的template編譯的理解?

簡而言之,就是先轉化成AST樹,再得到的render函數返回VNode(Vue的虛擬DOM節點)

詳情步驟:

首先,通過compile編譯器把template編譯成AST語法樹,compile是createCompiler的返回值,createCompiler是用以創建編譯器的。另外compile還負責合并option。

然后,AST會經過generate(將AST語法樹轉化成render funtion字符串的過程)得到render函數,render的返回值是VNode,VNode是Vue的虛擬DOM節點,里面有(標簽名、子節點、文本等等)


vuejs與angularjs以及react的區別?

1.與AngularJS的區別

相同點:

都支持指令:內置指令和自定義指令。

都支持過濾器:內置過濾器和自定義過濾器。

都支持雙向數據綁定。

都不支持低端瀏覽器。

不同點:

1.AngularJS的學習成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比較簡單、直觀。

2.在性能上,AngularJS依賴對數據做臟檢查,所以Watcher越多越慢。

Vue.js使用基于依賴追蹤的觀察并且使用異步隊列更新。所有的數據都是獨立觸發的。

對于龐大的應用來說,這個優化差異還是比較明顯的。

2.與React的區別

相同點:

React采用特殊的JSX語法,Vue.js在組件開發中也推崇編寫.vue特殊文件格式,對文件內容都有一些約定,兩者都需要編譯后使用。

中心思想相同:一切都是組件,組件實例之間可以嵌套。

都提供合理的鉤子函數,可以讓開發者定制化地去處理需求。

都不內置列數AJAX,Route等功能到核心包,而是以插件的方式加載。

在組件開發中都支持mixins的特性。

不同點:

React依賴Virtual DOM,而Vue.js使用的是DOM模板。React采用的Virtual DOM會對渲染出來的結果做臟檢查。

Vue.js在模板中提供了指令,過濾器等,可以非常方便,快捷地操作DOM。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。