vue生命周期
VUE面試點(diǎn):
需要熟悉:生命周期,鉤子函數(shù),鉤子函數(shù)參數(shù)
單文件開(kāi)發(fā)(需要使用webpack,項(xiàng)目暫時(shí)無(wú)法使用? 例子:http://div.io/topic/1701)
v-if 對(duì)條件塊會(huì)創(chuàng)建、銷毀、創(chuàng)建
v-show 一開(kāi)始就會(huì)創(chuàng)建組件,根據(jù)css屬性display來(lái)顯示、隱藏條件塊
prop
單向數(shù)據(jù)流? --? 當(dāng)父組件更新時(shí),子組件中的所有prop都會(huì)更新會(huì)最新的值,所以不應(yīng)該在子組件中更改prop。子組件通過(guò)$emit 自定義事件通向父組件發(fā)通知。? ??
子組件中可以用data屬性存儲(chǔ)prop,也可以使用計(jì)算屬性來(lái)轉(zhuǎn)換prop。
computed和watch運(yùn)行機(jī)制:
https://segmentfault.com/a/1190000016368913
https://juejin.im/post/5d59f2a451882549be53b170
watch允許異步操作
為什么vue不能給數(shù)組元素直接賦值呢?
vue的雙向綁定是通過(guò)object.defineProperty給對(duì)象添加setter/getter方法實(shí)現(xiàn)的。object.defineProperty是針對(duì)已有項(xiàng)的設(shè)置,數(shù)組中新加的項(xiàng)是不會(huì)被設(shè)置的,也不會(huì)觸發(fā)響應(yīng)。data中的屬性是預(yù)先定義好的。
動(dòng)態(tài)添加的數(shù)組項(xiàng)不能被劫持而產(chǎn)生響應(yīng),給數(shù)組的每一項(xiàng)做劫持,性能低且笨拙。
vue生命周期
keep-alive的了解?
https://cn.vuejs.org/v2/api/#keep-alive

組件中的data為什么是一個(gè)函數(shù)?而不是對(duì)象?
組件是復(fù)用的,并且js里對(duì)象是引用關(guān)系,如果組件data是對(duì)象,作用域就沒(méi)隔離,子組件中的data屬性值會(huì)相互影響。
如果組件data是函數(shù),每個(gè)組件實(shí)例都返回一份對(duì)象的獨(dú)立拷貝,組件實(shí)例間的data屬性就不會(huì)相互影響。
而new vue的實(shí)例只有一份,是不會(huì)被復(fù)用的,所以不存在引用對(duì)象的問(wèn)題。
v-model的原理?
v-mode本質(zhì)上是語(yǔ)法糖,它為不同的輸入元素使用不同的屬性并且拋出不同的事情。
text和textarea使用value屬性和input事件
checkout和radio使用checked屬性和change事件
select將value作為prop,并將change作為事件
vue組件間通信方式?
props和$emit 父子間通信。
ref和$parent/$children
eventbus($emit和$on)--一個(gè)空vue實(shí)例,用它來(lái)觸發(fā)事件和監(jiān)聽(tīng)事件,父子、兄弟、隔代組件間都可以通信。
$attrs和$listeners--
provide和inject--
vuex
你使用過(guò)vuex嗎?
vue-router的路由模式有幾種?
能說(shuō)下 vue-router 中常用的 hash 和 history 路由模式實(shí)現(xiàn)原理嗎?
1.hash模式實(shí)現(xiàn)原理--hash路由模式實(shí)現(xiàn)主要基于以下幾個(gè)特性
早期前端路由是由?location.hash 實(shí)現(xiàn)的。?location.hash 的值就是URL#后面的內(nèi)容,#是用來(lái)指導(dǎo)瀏覽器動(dòng)作的,對(duì)服務(wù)端無(wú)用,發(fā)送的請(qǐng)求中不帶有#。只改變#后面的內(nèi)容,不會(huì)刷新頁(yè)面,頁(yè)面會(huì)滾動(dòng)到#指定的錨點(diǎn)位置。
hash每次改變,會(huì)在瀏覽器的訪問(wèn)歷史中增加一個(gè)記錄(IE6、7不支持),所以可以通過(guò)瀏覽器前進(jìn)、回退按鈕控制hash的切換。
可以通過(guò)a標(biāo)簽,設(shè)置href屬性,用戶點(diǎn)擊標(biāo)簽后hash會(huì)發(fā)生變化。或者使用javascript對(duì)location.hash復(fù)制來(lái)URL hash。
html5事件onhashchange 監(jiān)聽(tīng)hash的變化,從而對(duì)頁(yè)面進(jìn)行跳轉(zhuǎn)(渲染)。
2.history模式實(shí)現(xiàn)的原理--
html5提供了history api來(lái)實(shí)現(xiàn)URL變化。history.pushState和history.replaceState,這兩個(gè)api在不刷新的情況下,操作瀏覽器的歷史記錄。history.pushState是新增一條歷史記錄,history.replaceState是替換當(dāng)前的歷史記錄。
window.history.pushState(null, null, path);window.history.replaceState(null, null, path);
history路由模式實(shí)現(xiàn)主要基于以下幾個(gè)特性
pushState和replaceState兩個(gè)api來(lái)操作實(shí)現(xiàn)url變化。
使用popstate監(jiān)聽(tīng)url變化,從而對(duì)頁(yè)面進(jìn)行跳轉(zhuǎn)(渲染)
pushState和replaceState不會(huì)觸發(fā)popstate,需要手動(dòng)觸發(fā)頁(yè)面跳轉(zhuǎn)(渲染)
什么是MVVM?
https://juejin.im/post/5d421bcf6fb9a06af23853f1


vue怎么監(jiān)聽(tīng)對(duì)象和數(shù)組的?
-- object.defineProperty只能劫持屬性。不能劫持整個(gè)對(duì)象和數(shù)組,vue通過(guò)遍歷數(shù)組和遞歸遍歷對(duì)象,利用object.defineProperty對(duì)數(shù)組和獨(dú)享實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)。