1.怎么給vue定義全局的方法辙纬?
1、通過(guò)prototype叭喜,這個(gè)非常方便贺拣。Vue.prototype[method]=method;
2、通過(guò)插件Vue.use(plugin);
3譬涡、通過(guò)mixin闪幽,Vue.mixin(mixins);
4、
// 創(chuàng)建全局方法
this.$root.$on('test', function(){
console.log('test');
})
// 銷毀全局方法
this.$root.$off('test');
// 調(diào)用全局方法
this.$root.$emit('test');
2.怎么解決vue打包后靜態(tài)資源圖片失效的問(wèn)題涡匀?
找到config/index.js 配置文件盯腌,找build打包對(duì)象里的assetsPublicPath屬性
默認(rèn)值為/,更改為./就好了
最新的vue-cli 需要在根目錄下建一個(gè)vue.config.js 在里面配置publicPath即可
3.怎么解決vue動(dòng)態(tài)設(shè)置img的src不生效的問(wèn)題陨瘩?
因?yàn)閯?dòng)態(tài)添加src被當(dāng)做靜態(tài)資源處理了腕够,沒(méi)有進(jìn)行編譯,所以要加上require拾酝。
<img :src="require('@/assets/images/xxx.png')" />
4.跟keep-alive有關(guān)的生命周期是哪些燕少?描述下這些生命周期
keep-alive的生命周期
1.activated: 頁(yè)面第一次進(jìn)入的時(shí)候,鉤子觸發(fā)的順序是created->mounted->activated
2.deactivated: 頁(yè)面退出的時(shí)候會(huì)觸發(fā)deactivated蒿囤,當(dāng)再次前進(jìn)或者后退的時(shí)候只觸發(fā)activated
5.你知道vue2.0兼容IE哪個(gè)版本以上嗎客们?
不兼容ie8及以下,是因?yàn)関ue的響應(yīng)式原理是基于es5的Object.defineProperty的,而這個(gè)方法不支持ie8及以下材诽。
部分兼容ie9 底挫,完全兼容10以上
6.你是從vue哪個(gè)版本開(kāi)始用的?你知道1.x和2.x有什么區(qū)別嗎脸侥?
2016年發(fā)布的vue2.0版本建邓,區(qū)別:
1、 2.0生命生命周期變化感覺(jué)變得更加語(yǔ)義化一點(diǎn)(有規(guī)律可尋睁枕,更好記了)官边,而且增加了beforeUpdate、updated外遇、activated注簿、deactivated,刪除了attached诡渴、detached。
2菲语、2.0將1.0所有自帶的過(guò)濾器都刪除了妄辩,也就是說(shuō),在2.0中山上,要使用過(guò)濾器眼耀,則需要我們自己編寫(xiě)
3、vue1.0的數(shù)據(jù)綁定完全依賴于數(shù)據(jù)偵測(cè)佩憾,使用Object.defineProperty方法使數(shù)據(jù)去通知相應(yīng)watch哮伟,改變dom結(jié)構(gòu)潭辈。vue2.0引入了虛擬dom,只通知到組件澈吨,提升了顆粒度。
7.你知道vue中key的原理嗎寄摆?說(shuō)說(shuō)你對(duì)它的理解
需要使用key來(lái)給每個(gè)節(jié)點(diǎn)做一個(gè)唯一標(biāo)識(shí)谅辣,Diff算法就可以正確的識(shí)別此節(jié)點(diǎn),找到正確的位置區(qū)插入新的節(jié)點(diǎn)婶恼。
作用:便于diff算法的更新桑阶,key的唯一性,能讓算法更快的找到需要更新的dom(高效的更新虛擬DOM)
8.如何在子組件中訪問(wèn)父組件的實(shí)例勾邦?
父組件想調(diào)用子組件的方法蚣录,可以在子組件中加上ref,然后通過(guò)this.$refs.ref.method調(diào)用
https://www.cnblogs.com/jin-zhe/p/9523029.html
Vue中子組件調(diào)用父組件的方法眷篇,這里有三種方法提供參考:
1:直接在子組件中通過(guò)this.$parent.event來(lái)調(diào)用父組件的方法
2:在子組件里用$emit向父組件觸發(fā)一個(gè)事件萎河,父組件監(jiān)聽(tīng)這個(gè)事件
3:父組件把方法傳入子組件中,在子組件里直接調(diào)用這個(gè)方法
https://www.cnblogs.com/jin-zhe/p/9523782.html
9.vue渲染模板時(shí)怎么保留模板中的HTML注釋呢蕉饼?
設(shè)置comments屬性虐杯,官網(wǎng)默認(rèn)為舍棄注釋
<template comments> ... </template>
10.在.vue文件中style是必須的嗎?那script是必須的嗎昧港?為什么擎椰?
在 .vue 文件中,template是必須的创肥,而script與style都不是必須的达舒。都沒(méi)有的話那就是一個(gè)靜態(tài)網(wǎng)頁(yè)
11.說(shuō)說(shuō)你對(duì)vue的錯(cuò)誤處理的了解?
分為errorCaptured與errorHandler叹侄。
errorCaptured是組件內(nèi)部鉤子巩搏,可捕捉本組件與子孫組件拋出的錯(cuò)誤,接收error圈膏、vm塔猾、info三個(gè)參數(shù),return false后可以阻止錯(cuò)誤繼續(xù)向上拋出稽坤。
errorHandler為全局鉤子丈甸,使用Vue.config.errorHandler配置,接收參數(shù)與errorCaptured一致尿褪,2.6后可捕捉v-on與promise鏈的錯(cuò)誤睦擂,可用于統(tǒng)一錯(cuò)誤處理與錯(cuò)誤兜底。
https://blog.fundebug.com/2019/06/17/handling-errors-in-vuejs/
12.vue怎么實(shí)現(xiàn)強(qiáng)制刷新組件杖玲?
強(qiáng)制重新渲染
1.this.$forceUpdate()
2.v-if
強(qiáng)制重新刷新某組件
//模版上綁定key
<SomeComponent :key="theKey"/>
//選項(xiàng)里綁定data
data(){
return{
theKey:0
}
}
//刷新key達(dá)到刷新組件的目的
theKey++;
13.你了解vue的diff算法嗎顿仇?
如一個(gè)list中某一個(gè)數(shù)據(jù)發(fā)生變更時(shí),
vue中會(huì)對(duì)整個(gè)list進(jìn)行遍歷, 判斷使用到的某些屬性是否發(fā)生變更, 從而更新發(fā)生變更的item
所以key屬性才會(huì)顯得很重要, 它會(huì)告訴你, 我那個(gè)item發(fā)生變更, 而不是去檢測(cè)整個(gè)list
14.ajax、fetch、axios這三都有什么區(qū)別臼闻?
ajax是最早出現(xiàn)發(fā)送后端請(qǐng)求的技術(shù)鸿吆,屬于原生js范疇,核心是使用XMLHttpRequest對(duì)象,使用較多并有先后順序的話,容易產(chǎn)生回調(diào)地獄述呐。
fetch號(hào)稱可以代替ajax的技術(shù)惩淳,是基于es6中的Promise對(duì)象設(shè)計(jì)的,參數(shù)和jQuery中的ajax類似乓搬,它并不是對(duì)ajax進(jìn)一步封裝思犁,它屬于原生js范疇。沒(méi)有使用XMLHttpRequest對(duì)象进肯。
axios不是原生js,使用時(shí)需要對(duì)其進(jìn)行安裝激蹲,客戶端和服務(wù)器端都可以使用,可以在請(qǐng)求和相應(yīng)階段進(jìn)行攔截江掩,基于promise對(duì)象学辱。
15.對(duì)于即將到來(lái)的vue3.0特性你有什么了解的嗎?
支持TypeScript
兼容IE11
雙向數(shù)據(jù)綁定原理:
Vue2.x:其雙向數(shù)據(jù)綁定原理是通過(guò)es5的Object.defineProperty频敛,中的set方法來(lái)實(shí)現(xiàn)數(shù)據(jù)劫持的项郊,但是有一個(gè)弊端就是無(wú)法兼聽(tīng)到數(shù)組內(nèi)部的數(shù)據(jù)變化(當(dāng)然我們可以通過(guò)arr = arr.concat([])),來(lái)實(shí)現(xiàn)內(nèi)部數(shù)據(jù)變化的檢測(cè)斟赚。相比Vue3有一定的性能問(wèn)題着降。
Vue3.x:是用ES6的語(yǔ)法 Proxy(Proxy 怎么用大家可自行百度,網(wǎng)上教程大把拗军,我就不在這贅述了)對(duì)象來(lái)實(shí)現(xiàn)的任洞,這個(gè)玩意兒也可以實(shí)現(xiàn)數(shù)據(jù)的劫持发侵,相比Object.defineProperty的優(yōu)勢(shì)是:可以檢測(cè)到數(shù)組內(nèi)部數(shù)據(jù)的變化
(IE系列都不兼容Proxy,所以可能還是用Object.defineProperty)
16.為什么我們寫(xiě)組件的時(shí)候可以寫(xiě)在.vue里呢刃鳄?可以是別的文件名后綴嗎盅弛?
以什么后綴跟VUE沒(méi)有任何關(guān)系叔锐,vue只是個(gè)特殊的text文件而已,就算你用 .abc 都行愉烙。
這一切都該歸功于webpack,在webpack 的loaders配置中步责,能讓你給指定文件一個(gè)返顺,或多個(gè)加載器。你也可以把這些加載器理解為預(yù)編譯工具遂鹊。
module: {
rules: [{
test: /\.vue$/, // 這里指定 .vue 文件通過(guò) vue-loader 解析振乏,你可以指定任何類型的文件。
loader: 'vue-loader',
options: vueLoaderConfig
}]
}
17.v-if和v-for的優(yōu)先級(jí)是什么秉扑?如果這兩個(gè)同時(shí)出現(xiàn)時(shí)昆码,那應(yīng)該怎么優(yōu)化才能得到更好的性能?
v-for 的優(yōu)先級(jí)更高
避免出現(xiàn)這種情況邻储,如果實(shí)在需要,則在外嵌套template旧噪,在這一層進(jìn)行v-if判斷吨娜,然后在內(nèi)部進(jìn)行v-for循環(huán),避免每次只有v-if只渲染很少一部分元素淘钟,也需要遍歷同級(jí)的所有元素
18.watch和computed有什么區(qū)別宦赠?
watch不支持緩存,只要從新渲染就會(huì)執(zhí)行米母,支持異步勾扭。
computed支持緩存,只有當(dāng)緩存改變時(shí)才執(zhí)行铁瞒,不支持異步妙色。
19.watch如何創(chuàng)建時(shí)就立即執(zhí)行
要使用 handler 和 immediate
//immediate設(shè)為true 監(jiān)聽(tīng)方法會(huì)在創(chuàng)建的時(shí)候 執(zhí)行handler里的方法
watch: {
value:{
handler:function(o,n){},
immediate: true
}
}
20.vue組件之間的通信都有哪些?
父子Coms: 1/2/3 ..
兄弟Coms: 4/5
跨級(jí)Coms: 4/5/6/7
props
$emit/$on
( $parents/$children ) / $refs
Vuex
Bus
( provide/inject )
( $attrs/$listeners )
21.說(shuō)說(shuō)vue的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.數(shù)據(jù)驅(qū)動(dòng)
2.模塊化
3.輕量級(jí)
4.SPA
5.版本3.0的界面化管理工具比較好使
6.vue易入門
7.中文社區(qū)強(qiáng)大慧耍,入門簡(jiǎn)單身辨,提升也有很多的參考資料。
缺點(diǎn):
1.吃內(nèi)存(每個(gè)組件都會(huì)實(shí)例化一個(gè)Vue實(shí)例芍碧,實(shí)例的屬性和方法很多)
2.定義在data里面的對(duì)象煌珊,實(shí)例化時(shí),都會(huì)遞歸的遍歷轉(zhuǎn)成響應(yīng)式數(shù)據(jù)泌豆,然而有的響應(yīng)式數(shù)據(jù)我們并不會(huì)用到定庵,造成性能上的浪費(fèi)
3.像keep-alive transition transition-group 這些內(nèi)置組件,不管用不用其實(shí)都已經(jīng)掛到Vue.options.components上踪危,如果不用蔬浙,造成對(duì)象變大,從而占用內(nèi)存
4.父子組件更新陨倡,沒(méi)有明確的來(lái)源
5.不支持IE8及以下瀏覽器