持續更新中...css
面試傳送門:html
即Model-View-ViewModel。前端
Vue是以數據爲驅動的,Vue自身將DOM和數據進行綁定,一旦建立綁定,DOM和數據將保持同步,每當數據發生變化,DOM會跟着變化vue
ViewModel是Vue的核心,它是Vue的一個實例。Vue實例時做用域某個HTML元素上的,這個HTML元素能夠是body,也能夠是某個id所指代的元素。react
DOM Listeners和Data Bindings是實現雙向綁定的關鍵。DOM Listeners監聽頁面全部View層DOM元素的變化,當發生變化,Model層的數據隨之變化;Data Bindings監聽Model層的數據,當數據發生變化,View層的DOM元素隨之變化。jquery
條件渲染指令,與v-if不一樣的是,不管v-show的值爲true或false,元素都會存在於HTML代碼中;而只有當v-if的值爲true,元素纔會存在於HTML代碼中。v-show指令只是設置了元素CSS的style值webpack
在vue-router寫着keep-alive,keep-alive的含義:若是把切換出去的組件保留在內存中,能夠保留它的狀態或避免從新渲染。爲此能夠添加一個keep-alive指令es6
路由嵌套會將其餘組件渲染到該組件內,而不是進行整個頁面跳轉。
router-view自己就是將組件渲染到該位置,web
有時候咱們想就像使用jquery那樣去訪問一個元素,此時就可使用v-el指令,去給這個元素註冊一個索引,方便經過所屬實例的$el訪問這個元素。面試
注: HTML不區分大小寫,因此v-el:someEl將轉換爲全小寫。能夠用v-el:some-el而後設置this.$el.someEl。
示例:
<span v-el:msg>hello</span>
<span v-el:other-msg>world</span>
this.$els.msg.textContent //-> "hello"
this.$els.otherMsg.textContent// -> "world"
this.$els.msg//-><span>hello</span>
複製代碼
在vuejs中,咱們常常要綁定一些事件,有時候給DOM元素綁定,有時候給組件綁定。綁定事件在HTML中用v-on:click="event",能夠簡寫爲:@click="event"
Vue.js(是一套構建用戶界面的 漸進式框架。與其餘重量級框架不一樣的是,Vue 採用自底向上增量開發的設計。
Vue 的核心庫只關注視圖層,而且很是容易學習,很是容易與其它庫或已有項目整合。
另外一方面,Vue 徹底有能力驅動採用單文件組件和Vue生態系統支持的庫開發的複雜單頁應用。
Vue.js 的目標是經過儘量簡單的 API 實現響應的數據綁定和組合的視圖組件
route是「路由信息對象」,包括path,params,hash,query,fullPath,matched,name等路由信息參數。
router是「路由實例對象」,包括了路由的跳轉方法(push、replace),鉤子函數等。
mvc和mvvm其實區別並不大。都是一種設計思想。主要就是mvc中Controller演變成mvvm中的viewModel。mvvm主要解決了mvc中大量的DOM 操做使頁面渲染性能下降,加載速度變慢,影響用戶體驗。
區別:vue數據驅動,經過數據來顯示視圖層而不是節點操做。
場景:數據操做比較多的場景,更加便捷
低耦合。視圖(View)能夠獨立於Model變化和修改,一個ViewModel能夠綁定到不一樣的"View"上,當View變化的時候Model能夠不變,當Model變化的時候View也能夠不變。
可重用性。你能夠把一些視圖邏輯放在一個ViewModel裏面,讓不少view重用這段視圖邏輯。
獨立開發。開發人員能夠專一於業務邏輯和數據的開發(ViewModel),設計人員能夠專一於頁面設計。
可測試。界面素來是比較難於測試的,而如今測試能夠針對ViewModel來寫。
(1)vuex是什麼?
vue框架中狀態管理。
(2)vuex有哪幾種屬性?
有五種,分別是 State、 Getters、Mutations 、Actions、 Module
vuex的State特性
A、Vuex就是一個倉庫,倉庫裏面放了不少對象。其中state就是數據源存放地,對應於通常Vue對象裏面的data
B、state裏面存放的數據是響應式的,Vue組件從store中讀取數據,如果store中的數據發生改變,依賴這個數據的組件也會發生更新
C、它經過mapState把全局的 state 和 getters 映射到當前組件的 computed 計算屬性中
vuex的Getters特性
A、getters 能夠對State進行計算操做,它就是Store的計算屬性
B、 雖然在組件內也能夠作計算屬性,可是getters 能夠在多組件之間複用
C、 若是一個狀態只在一個組件內使用,是能夠不用getters
vuex的Mutations特性
Actions 相似於 mutations,不一樣在於:Actions 提交的是 mutations,而不是直接變動狀態;Actions 能夠包含任意異步操做。
(3)不用Vuex會帶來什麼問題?
可維護性會降低,想修改數據要維護三個地方;
可讀性會降低,由於一個組件裏的數據,根本就看不出來是從哪來的;
增長耦合,大量的上傳派發,會讓耦合性大大增長,原本Vue用Component就是爲了減小耦合,如今這麼用,和組件化的初衷相背。
將當前組件的<style>修改成<style scoped>
首先,咱們都知道在前端性能優化的一個祕訣就是儘量少地操做DOM,不只僅是DOM相對較慢,更由於頻繁變更DOM會形成瀏覽器的迴流或者重回,這些都是性能的殺手,所以咱們須要這一層抽象,在patch過程當中儘量地一次性將差別更新到DOM中,這樣保證了DOM不會出現性能不好的狀況.
其次,現代前端框架的一個基本要求就是無須手動操做DOM,一方面是由於手動操做DOM沒法保證程序性能,多人協做的項目中若是review不嚴格,可能會有開發者寫出性能較低的代碼,另外一方面更重要的是省略手動DOM操做能夠大大提升開發效率.
當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用「就地複用」策略。若是數據項的順序被改變,Vue 將不會移動 DOM 元素來匹配數據項的順序, 而是簡單複用此處每一個元素,而且確保它在特定索引下顯示已被渲染過的每一個元素。key 的做用主要是爲了高效的更新虛擬DOM。
使用Object.assign(),vm.options.data能夠獲取到組件初始化狀態下的data。
Object.assign(this.$data, this.$options.data())
Vue 是異步修改 DOM 的而且不鼓勵開發者直接接觸 DOM,但有時候業務須要必須對數據更改--刷新後的 DOM 作相應的處理,這時候就可使用 Vue.nextTick(callback)這個 api 了。
關於Vue 3.0,大體說了三個點,第一個是關於提出的新API setup()函數,第二個說了對於Typescript的支持,最後說了關於替換Object.defineProperty爲 Proxy 的支持。
詳細說了下關於Proxy代替帶來的性能上的提高,由於傳統的原型鏈攔截的方法,沒法檢測對象及數組的一些更新操做,但使用Proxy又帶來了瀏覽器兼容問題。
vue 實現數據雙向綁定主要是:採用數據劫持結合發佈者-訂閱者模式的方式,經過 Object.defineProperty() 來劫持各個屬性的 setter,getter,在數據變更時發佈消息給訂閱者,觸發相應監聽回調
nextTick,則能夠在回調中獲取更新後的 DOM
由於js自己的特性帶來的,若是 data 是一個對象,那麼因爲對象自己屬於引用類型,當咱們修改其中的一個屬性時,會影響到全部Vue實例的數據。若是將 data 做爲一個函數返回一個對象,那麼每個實例的 data 屬性都是獨立的,不會相互影響了
咱們能夠將同一函數定義爲一個 method 或者一個計算屬性。對於最終的結果,兩種方式是相同的
不一樣點:
Vue中watch、computed與methods的聯繫和區別
優勢:
缺點:
vue的生命週期主要分爲beforeCreate,created,beforeMount,mounted,beforeUpdate,updated,beforeDestroy,destroyed
建立先後、載入先後、更新先後、銷燬先後
Vue 生命週期與鉤子函數
全局的
單個路由獨享的
組件級的
前端配置vue.config.js
後端配置
jsonp(只能解決get)
步驟:
1).去建立一個script標籤
2).script的src屬性設置接口地址 3).接口參數,必需要帶一個自定義函數名,要否則後臺沒法返回數據 4).經過定義函數名去接受返回的數據
hash模式從新加載的時候只加載#後面的
history模式則是整個地址從新加載,不過他能夠保存歷史記錄,方便前進後退
vue-router 有 3 種路由模式:hash、history、abstract
v-if v-show區別
v-for
v-model
v-bind
v-on
Vue 的父組件和子組件生命週期鉤子函數執行順序?
能夠在鉤子函數 created、beforeMount、mounted 中進行調用,由於在這三個鉤子函數中,data 已經建立,能夠將服務端端返回的數據進行賦值。可是本人推薦在 created 鉤子函數中調用異步請求,由於在 created 鉤子函數中調用異步請求有如下優勢:
由於組件是用來複用的,且 JS 裏對象是引用關係,若是組件中 data 是一個對象,那麼這樣做用域沒有隔離,子組件中的 data 屬性值會相互影響。
若是組件中 data 選項是一個函數,那麼每一個實例能夠維護一份被返回對象的獨立的拷貝,組件實例之間的 data 屬性值不會互相影響;而 new Vue 的實例,是不會被複用的,所以不存在引用對象的問題。
Proxy 的優點以下:
優勢:
缺點:
虛擬 DOM 的實現原理主要包括如下 3 部分:
默認插槽
具名插槽
做用域插槽
vue-router模塊的router-link組件。
在router目錄下的index.js文件中,對path屬性加上/:id。使用route對象的params.id。
vue文件的一個加載器。
用途:js能夠寫es六、style樣式能夠scss或less、template能夠加jade等根據官網的定義,
vue-loader 是 webpack 的一個 loader,用於處理 .vue 文件.
當Vue 處理指令時,v-for 比 v-if 具備更高的優先級,這意味着v-if將分別重複運行於每一個v-for循環中。經過v-if 移動到容器元素,不會再重複遍歷列表中的每一個值。取而代之的是,咱們只檢查它一次,且不會在 v-if 爲否的時候運算 v-for。
全部的 prop 都使得其父子 prop 之間造成了一個單向下行綁定:父級 prop 的更新會向下流動到子組件中,可是反過來則不行。這樣會防止從子組件意外改變父級組件的狀態,從而致使你的應用的數據流向難以理解。
額外的,每次父級組件發生更新時,子組件中全部的 prop 都將會刷新爲最新的值。這意味着你不該該在一個子組件內部改變 prop。若是你這樣作了,Vue 會在瀏覽器的控制檯中發出警告。子組件想修改時,只能經過 $emit 派發一個自定義事件,父組件接收到後,由父組件修改。
因爲 JavaScript 的限制,Vue 不能檢測到如下數組的變更:
assets文件夾是放靜態資源;
components是放組件;
router是定義路由相關的配置;
view視圖;
app.vue是一個應用主組件;
main.js是入口文件;
單頁面應用(SPA),通俗一點說就是指只有一個主頁面的應用,瀏覽器一開始要加載全部必須的 html, js, css。全部的頁面內容都包含在這個所謂的主頁面中。但在寫的時候,仍是會分開寫(頁面片斷),而後在交互的時候由路由程序動態載入,單頁面的頁面跳轉,僅刷新局部資源。多應用於pc端。
多頁面(MPA),就是指一個應用中有多個頁面,頁面跳轉時是整頁刷新
單頁面的優勢:
用戶體驗好,快,內容的改變不須要從新加載整個頁面,基於這一點spa對服務器壓力較小
先後端分離
頁面效果會比較炫酷(好比切換頁面內容時的專場動畫)
單頁面缺點:
初次加載時耗時多
頁面複雜度提升不少
導航不可用,若是必定要導航須要自行實現前進、後退。
在vue-router單頁面應用中,則是路徑之間的切換,也就是組件的切換。路由模塊的本質 就是創建起url和頁面之間的映射關係。
至於爲啥不能用a標籤,這是由於用Vue作的都是單頁應用,就至關於只有一個主的index.html頁面,因此你寫的標籤是不起做用的,必須使用vue-router來進行管理。
使用Proxy 使用當即執行函數