正在持續更新中... ,路過的朋友,能夠點個贊,關注一下~~~
javascript
Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理,更強大。vue
promise有三種狀態,等待態、成功態、失敗態,當new一個promise實例對象的時候,傳遞兩個對應的方法,onFulfilled,onRejected,並初始化當前的狀態,當狀態發生改變的時候便會觸發對應的方法,成功-onFulfilled,失敗-onRejected, 若狀態一直沒有改變,則一直處於等待狀態,即當異步程序處理完了以後再改變狀態,完成異步任務。java
在整個過程當中,牽扯到 promise的鏈式調用,以及異步的暫存(處於等待狀態的先存儲起來)與調用(狀態改變便進行調用)node
參考文檔:ios
promise解決異步git
javascript異步解決方案github
答:1,返回一個失敗的promse 2,拋出一個錯誤面試
答:返回一個處於pending(等待)狀態的promiseajax
...
eg. [...obj] (須要保證obj是可迭代 )from
, eg. Array.from()slice
方法,eg. [].slice.call(obj)擴展運算符:須要保證obj是可迭代 Array.from不須要保證obj是否可迭代,內部會使它可迭代算法
答:解構賦值 [] {} Map : 裏面存儲惟一的值 WeakMap Set ES6中的模塊化 箭頭函數 裝飾器 模板字符串 數組中一堆方法 reduce map filter some every..... 對象中一堆方法 Object.key() Object.defindproty Objct.value Objtct.xxxx 類,繼承 構造器 原型鏈 Proxy ---- defindprototy
Symbol ...
v-model:是一個語法糖,本質是 :value
與 @input
<Son2 :value="counter" @input="newValue=>counter = newValue"></Son2>
<Son2 v-model="counter"></Son2>
複製代碼
beforeCeate
實例化vue後,走的第一個鉤子,此時尚未數據劫持 created
vue實例已經建立完成,數據偵測OK,methods,computed也OK了,el OK
beforeUpdate
data改變了 準備渲染視圖 domdiff updated
渲染視圖完畢 不要去修改data,可能死循環 beforeDestroy
vm銷燬以前調用 destroyed
銷燬以後調用
created
vm已建立完成 發起ajax請求mounted
vm已掛載完成 發起ajax請求 操做dombeforeUpdate
再近一步去修改狀態 不會從新渲染updated
不能修改數據beforeDestroy
優化操做,清空定時器,解除事件綁定Vue生命週期在真實場景下的業務應用
created:進行ajax請求異步數據的獲取、初始化數據
mounted:掛載元素dom節點的獲取
nextTick:針對單一事件更新數據後當即操做dom
updated:任何數據的更新,若是要作統一的業務邏輯處理
watch:監聽數據變化,並作相應的處理
vue的生命週期
vm.$data
:Vue 實例觀察的數據對象 vm.$options
:用於當前 Vue 實例的初始化選項。 vm.$nextTick
: vm.$el
: 獲取到真實的dom 獲取到的可能不是更新後的 須要在下一下事件環中獲取更新後的dom元素 vm.$watch
: 監控一個數據 vm.$set
: 將數據設置成響應式 vm.$delete
: 刪除對象的屬性。
key的做用
做用:高效的更新虛擬DOM,key是給DOM添加惟一的標識,當元素髮生改變的時候,經過domdiff算法,作到更小更新,提升性能。 歸納說:改變的元素進行更新,不改變的不更新
緣由
使用index做爲key時,可能存在DOM元素沒有發生改變,只是順序發生了改變,可是此時的key的值就發生了改變,根據domdiff算法,就會更新全部key變化的DOM元素
例如:渲染一個數組,綁定index,做爲惟一標識,當數據進行倒序排序時,DOM元素沒變,順序發生了改變,但此時DOM上的key發生了改變,就會從新進行渲染,浪費性能。
computed
:計算屬性有緩存,若是計算屬性所依賴的數據沒有必變,它會去緩存中取methods
:方法是沒有緩存,每一次拿數據,都會調用這個方法watch
:監控數據的變化,第1次編譯沒有觸發 須要配合mounted
鉤子,或者使用immediate: true
使第一次編譯時觸發computed
有緩存
method
沒有緩存
特別提醒
能使用computed就不要使用watch
queue
避免同一個請求發出屢次,(有動畫時,也避免多個動畫)cancelToken
切換到下一個頁面時,把上一個頁面相關的請求給取消(沒有完成的)函數防抖(debounce): 在事件被觸發n秒後再執行回調,若是在這n秒內又被觸發,則從新計時;
典型的案例就是輸入搜索:輸入結束後n秒才進行搜索請求,n秒內又輸入的內容,就從新計時。
函數節流(throttle): 規定在一個單位時間內,只能觸發一次函數,若是這個單位時間內觸發屢次函數,只有一次生效;
典型的案例就是鼠標不斷點擊觸發,規定在n秒內屢次點擊只有一次生效。
答:使用keep-alive,能在組件切換過程當中將狀態保留在內存中,防止重複渲染DOM。
答:切換頁面的時候,可能上個頁面的請求尚未請求完,取消上一次的頁面中的請求,提升性能
答:瀏覽器的 sessionStorage
答:採用分頁渲染,如不能分頁,使用虛擬列表(長列表),相似cubeui
中的RecycleList
長列表渲染
參考文檔
答: 代碼角度的優化 ;性能角度的優化;用戶體驗角度的優化
能夠參考具體的優化方案:
答:
vue-router
類,該類中規定必須有一個install
的靜態方法vue-router
,並在vue
中使用這個中間件,當使用Vue.use
時,便會自動的調用vue-router
中的install(Vue)
靜態方法,並將全部的組件做爲參數依次傳入。import VueRouter from "./vue-router" Vue.use(VueRouter);
install
靜態方法中,使用Vue.mixin()
爲每一個組件都混入一個beforeCreate
方法,在beforeCreate
方法中,如果main
根組件,則將main.js
中的參數router
掛載到自身_router上,並將本身掛載到自身的屬性_root
上,若不是根組件,則將父組件的_root掛載到自身的_root,(此處相似於遞歸設置)beforeCreate
中爲每一個組件都添加一個 $router
與 $route
的屬性,$router
指向自定義vue-router
中的靜態方法;$route指向當前存放對的路由裏面的屬性
vue-router
中設置一個構造器,用於接收new 自定義vue-router
時傳遞的參數(mede,router
....),轉換路由格式,而且處理不一樣的路由模式(hash,history),將處理後的當前路由進行保存
,定義全局的router-link組件
,使用屬性傳值與匿名插槽定義,顯示的路由,當點擊時進行跳轉
,定義全局的router-view組件
,獲取當前路由,與路由表,相比對,進行渲染
。vue-router 原理 圖示