阿龙学堂-VUE面试总结
前言:一句話就能回答的VUE面試題
vue中$emit事件無法觸發(fā)?
emit里的事件名不要用大寫字母;
渲染的時(shí)候key給什么值,可以使用index嗎,用id好還是index好?
當(dāng)我們在使用v-for進(jìn)行渲染時(shí),盡可能使用渲染元素自身屬性的id給渲染的元素綁定一個(gè)key值,這樣在當(dāng)前渲染元素的DOM結(jié)構(gòu)發(fā)生變化時(shí),能夠單獨(dú)響應(yīng)該元素而不觸發(fā)所有元素的渲染。
1.css只在當(dāng)前組件起作用
答:在style標(biāo)簽中寫入scoped例如:<style scoped></style>
2.v-if 和 v-show 區(qū)別
答:v-if按照條件是否渲染,v-show是display的block或none;
3.$route和$router的區(qū)別
答:$route是“路由信息對象”,包括path,params,hash,query,fullPath,matched,name等路由信息參數(shù)。而$router是“路由實(shí)例”對象包括了路由的跳轉(zhuǎn)方法,鉤子函數(shù)等。
4.vue.js的兩個(gè)核心是什么?
答:數(shù)據(jù)驅(qū)動(dòng)、組件系統(tǒng)
5.vue幾種常用的指令
答:v-for 、 v-if 、v-bind、v-on、v-show、v-else
6.vue常用的修飾符?
答:.prevent: 提交事件不再重載頁面;.stop: 阻止單擊事件冒泡;.self: 當(dāng)事件發(fā)生在該元素本身而不是子元素的時(shí)候會(huì)觸發(fā);.capture: 事件偵聽,事件發(fā)生的時(shí)候會(huì)調(diào)用
7.v-on 可以綁定多個(gè)方法嗎?
答:可以
8.vue中 key 值的作用?
答:當(dāng) Vue.js 用 v-for 正在更新已渲染過的元素列表時(shí),它默認(rèn)用“就地復(fù)用”策略。如果數(shù)據(jù)項(xiàng)的順序被改變,Vue 將不會(huì)移動(dòng) DOM 元素來匹配數(shù)據(jù)項(xiàng)的順序, 而是簡單復(fù)用此處每個(gè)元素,并且確保它在特定索引下顯示已被渲染過的每個(gè)元素。key的作用主要是為了高效的更新虛擬DOM。
9.什么是vue的計(jì)算屬性?
答:在模板中放入太多的邏輯會(huì)讓模板過重且難以維護(hù),在需要對數(shù)據(jù)進(jìn)行復(fù)雜處理,且可能多次使用的情況下,盡量采取計(jì)算屬性的方式。
好處:①使得數(shù)據(jù)處理結(jié)構(gòu)清晰;②依賴于數(shù)據(jù),數(shù)據(jù)更新,處理結(jié)果自動(dòng)更新;③計(jì)算屬性內(nèi)部this指向vm實(shí)例;④在template調(diào)用時(shí),直接寫計(jì)算屬性名即可;⑤常用的是getter方法,獲取數(shù)據(jù),也可以使用set方法改變數(shù)據(jù);⑥相較于methods,不管依賴的數(shù)據(jù)變不變,methods都會(huì)重新計(jì)算,但是依賴數(shù)據(jù)不變的時(shí)候computed從緩存中獲取,不會(huì)重新計(jì)算。
10.vue等單頁面應(yīng)用及其優(yōu)缺點(diǎn)
答:優(yōu)點(diǎn):Vue 的目標(biāo)是通過盡可能簡單的 API 實(shí)現(xiàn)響應(yīng)的數(shù)據(jù)綁定和組合的視圖組件,核心是一個(gè)響應(yīng)的數(shù)據(jù)綁定系統(tǒng)。MVVM、數(shù)據(jù)驅(qū)動(dòng)、組件化、輕量、簡潔、高效、快速、模塊友好。
缺點(diǎn):不支持低版本的瀏覽器,最低只支持到IE9;不利于SEO的優(yōu)化(如果要支持SEO,建議通過服務(wù)端來進(jìn)行渲染組件);第一次加載首頁耗時(shí)相對長一些;不可以使用瀏覽器的導(dǎo)航按鈕需要自行實(shí)現(xiàn)前進(jìn)、后退。。
一:v-show和v-if有什么區(qū)別?
1:v-if通過添加或刪除dom元素,v-show是通過控制css樣式display來顯示和隱藏;
2:v-if在有一個(gè)局部的編譯/卸載的過程,切換過程中合適的銷毀和重構(gòu)內(nèi)部事件、組件‘;v-show只是簡單地css的切換;
3:v-if是惰性的;如果初始條件為假,什么也不做。只有條件第一次為真的時(shí)候才開始局部編譯;v-show在任何條件下可以編譯,然后被緩存,保留DOM元素;
4:v-if有更高的切換消耗;v-show有更高的初始渲染消耗;
5:v-if適合運(yùn)營條件不大可能改變;v-show適合頻繁切換;
?
二:vue中MVVM模式是怎么樣的?
1:model View Viewmodel 的縮寫;
model代表數(shù)據(jù)模型;
view 代表視圖;
Viewmodel代表:監(jiān)聽數(shù)據(jù)本模型的改變和視圖的變化,處理用戶交互,簡單的理解鏈接view 和model;
2:viewmodel通過雙向數(shù)據(jù)綁定把view和model聯(lián)系起來了;不需要手動(dòng)的操作dom;維護(hù)復(fù)雜的數(shù)據(jù)只需要mvvm就可以了;
?
三:什么是雙向數(shù)據(jù)綁定;
1:vue實(shí)現(xiàn)雙向數(shù)據(jù)綁定主要是通過:數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者的方式;通過defidended-property()方法來劫持每個(gè)屬性的setter、getter,數(shù)據(jù)變動(dòng)時(shí)發(fā)布給訂閱者,觸發(fā)相應(yīng)的回調(diào)。把一個(gè)普通的js對象傳給VUE實(shí)例來作為他的data選項(xiàng)時(shí)候,vue實(shí)例遍歷它的屬性用Object.definedproperty將他們轉(zhuǎn)換成setter、gettter;但是內(nèi)部VUE追蹤依賴,當(dāng)屬性訪問和修改時(shí)通知變化;
vue的雙向數(shù)據(jù)綁定將mvvm作為入口,整合Observer、complie,watcher,三者,通過Observerl監(jiān)聽model的改變,通過compile來編譯模板指令,最終利用watcher 搭起observer和compile之間的橋梁;達(dá)到數(shù)據(jù)變化,視圖更新;視圖變化,達(dá)到改變model變化;
?
四:vue生命周期;
從創(chuàng)建到銷毀的過程,稱為生命周期;
作用:生命周期中有很多鉤子,能夠利用鉤子事件控制整個(gè)vue實(shí)例過程中更容易形成好的邏輯;
第一次加載觸發(fā)哪幾個(gè)鉤子:
beforeCreate created beforeMounted Mounted
DOM渲染在mounted中渲染完成;
1>:創(chuàng)建前/后
2>:掛載前/后
3>:更新前/后
4>:銷毀錢/后
4.1:Vue 的父組件和子組件生命周期鉤子函數(shù)執(zhí)行順序?
Vue 的父組件和子組件生命周期鉤子函數(shù)執(zhí)行順序可以歸類為以下 4 部分:
- 加載渲染過程
父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted
- 子組件更新過程
父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated
- 父組件更新過程
父 beforeUpdate -> 父 updated
- 銷毀過程
父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed
五:VUE組件之間的傳值
1:父組件向子組件傳值:父組件中引入子組件,父組件定義要傳的值,子組件通過定義Prop來接收傳值,
2:子組件向父組件傳值:在父組件中定義一個(gè)方法接收子組件傳值,在子組件中定義一個(gè)觸發(fā)事件,通過$emit發(fā)射給子組件。
組件之間的傳值:當(dāng)項(xiàng)目比較小的時(shí)候,使用中心
3:兄弟組件之間的傳值
1>:兄弟組件之間的傳值需要借助事件車;
2>:穿件一個(gè)VUE實(shí)例,讓兄弟兩個(gè)公用一個(gè)事件機(jī)制;
3>:數(shù)據(jù)傳遞方:使用Bus.$emit(方法名,傳遞數(shù)據(jù))
數(shù)據(jù)接收方:通過mounted(){}觸發(fā)Bus.$on(方法名,Function(接收數(shù)據(jù)的參數(shù)){})
?
六:Vue路由鉤子函數(shù);
首頁可以控制導(dǎo)航跳轉(zhuǎn),beforeEach afterEach 等,一般用于修改頁面跳轉(zhuǎn)。
beforeEach(from ,to,next){}
to:route即將進(jìn)入的目標(biāo)路由;
from:route即將離開的路由;
next:function一定調(diào)用該方法,resolve這個(gè)鉤子,執(zhí)行效果依賴next的參數(shù),可以控制網(wǎng)頁跳轉(zhuǎn);
?
七:VUEX是什么,怎么使用,哪些場景可以使用;
1:vue單頁面組件的開發(fā)中的全局狀態(tài)管理。簡單的理解就是在store.js中定義一個(gè)數(shù)據(jù)之后,在全局任何一個(gè)組件中都可以獲取,修改,并且修改之后立刻能夠更新到全局。
?
1>:state:讀取狀態(tài)數(shù)據(jù)都保存在state中,是store中的唯一數(shù)據(jù)源;
?
// 定義 new Vuex.Store({ state: { allProducts: [] } //... }) // 組件中獲取 this.$store.state.allProducts
?
2>:moutation:改變state中數(shù)據(jù)的唯一途徑,不能處理異步數(shù)據(jù)。(重點(diǎn))
?
mutations: { setProducts (state, products) { state.allProducts = products } } // 組件中使用 this.$store.commit('setProducts', {//..options})
?
3>:getters:和vue中的computed 類似,屬于計(jì)算屬性,基于state第二次包裝,常用于多個(gè)數(shù)據(jù)的篩選和相關(guān)計(jì)算;
?
getters: { cartProducts(state, getters, rootState) => (getters.allProducts.filter(p => p.quantity)) } // 組件中獲取 this.$store.getters.cartProducts
?
4>:actions:類似moutation,用于提交matation中狀態(tài)的改變,但是他不能直接改變moutation中的值;可以包含異步操作;
?
// 定義(shop為api) actions: { getAllProducts ({ commit }, payload) { shop.getProducts((res) => { commit('setProducts', res) }) } } // 組件中使用 this.$store.dispatch('getAllProducts', {//..payload})
?
5>:modules:類似于命名空間,將各個(gè)組件之間的變量分開操作和定義,便于維護(hù)
// 定義 const moduleA = { state: { ... }, mutations: { ... }, actions: { ... }, getters: { ... } } const moduleB = { state: { ... }, mutations: { ... }, actions: { ... } } const store = new Vuex.Store({ modules: { a: moduleA, b: moduleB } }) // 組件中使用 store.state.a // -> moduleA 的狀態(tài) store.state.b // -> moduleB 的狀態(tài)
?
八:VUE-cli如何新增自定義指令;
1.創(chuàng)建局部指令
var app = New Vue({ el:'#app', data:{} //創(chuàng)建指令,可以多個(gè) directives() { inserted(el) { // 指令中第一個(gè)參數(shù)是當(dāng)前使用指令的DOM console.log(el); console.log(arguments); // 對DOM進(jìn)行操作 el.style.width = '200px'; el.style.height = '200px'; el.style.background = '#000'; } } })
?
2:全局指令
directive(dir2,{ innserted(el){ console.log(el); } })
?
3:指令的使用
<div id="app"> <div v-dir1></div> <div v-dir2></div> </div>
?
九:VU如何定義一個(gè)過濾器;
1:html代碼:
<div id="app"> <input type="text" v-model="msg" /> {{msg| capitalize }} </div>
?
2:JS代碼;
var vm=new Vue({ el:"#app", data:{ msg:'' }, filters: { capitalize: function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } })
?
3:定義全局過濾:
vue.filter('capitalize:': ,{function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } })
過濾器接收表達(dá)式的值 (msg) 作為第一個(gè)參數(shù)。capitalize 過濾器將會(huì)收到 msg的值作為第一個(gè)參數(shù)。
?
十:對VUEkeep-live 的理解?
keep-alive是 Vue 內(nèi)置的一個(gè)組件,可以使被包含的組件保留狀態(tài),或避免重新渲染。
在vue 2.1.0 版本之后,keep-alive新加入了兩個(gè)屬性: include(包含的組件緩存) 與 exclude(排除的組件不緩存,優(yōu)先級大于include)?
<keep-alive include='include_components' exclude='exclude_components'> <component> <!-- 該組件是否緩存取決于include和exclude屬性 --> </component> </keep-alive>
參數(shù)解釋
include - 字符串或正則表達(dá)式,只有名稱匹配的組件會(huì)被緩存
exclude - 字符串或正則表達(dá)式,任何名稱匹配的組件都不會(huì)被緩存
include 和 exclude 的屬性允許組件有條件地緩存。二者都可以用“,”分隔字符串、正則表達(dá)式、數(shù)組。當(dāng)使用正則或者是數(shù)組時(shí),要記得使用v-bind 。
<keep-alive include="a,b"> <component></component> </keep-alive> <!-- 正則表達(dá)式 (需要使用 v-bind,符合匹配規(guī)則的都會(huì)被緩存) --> <keep-alive :include="/a|b/"> <component></component> </keep-alive> <!-- Array (需要使用 v-bind,被包含的都會(huì)被緩存) --> <keep-alive :include="['a', 'b']"> <component></component> </keep-alive>
?
阿龍學(xué)堂整理發(fā)布:www.alongxuetang.com
總結(jié)
以上是生活随笔為你收集整理的阿龙学堂-VUE面试总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WIN10 设置或取消自动关机
- 下一篇: 计算机的应用与分类,办公自动化是计算机的