vue面試總結
1.vue生命周期
1、beforeCreate():組件實例剛剛被創建 (el和data並未初始化)
2、created():組件創建完成,屬性已綁定,但DOM還未生成,$el屬性還不存在 (完成data數據的初始化)
3、beforeMount():模板編譯/掛載之前 (完成了el和data初始化)
4、Mounted():模板編譯/掛載之后 (完成掛載)
5、beforeUpdate():組件更新之前
6、updated():組件更新之后
7、beforedestroy():組件銷毀之前
8、destroyed():組件銷毀之后
9、 activated keep-alive組件激活時調用。該鈎子在服務器端渲染期間不被調用。用於性能優化緩存dom和數據。
deactivated keep-alive組件停用時調用。該鈎子在服務端渲染期間不被調用。
適應場景:
beforecreate : 可以在這
加個loading事件,在加載實例時觸發
created : 初始化完成時的事件寫在這里,如在這
結束loading事件,異步請求也適宜在這里調用
mounted : 掛載元素,獲取到DOM節點
updated : 如果對數據統一處理,在這里寫上相應函數
beforeDestroy : 可以做一個確認停止事件的確認框
nextTick : 更新數據后立即操作dom
語言闡述:
那么我最常用的:created、mounted、destroyed、activated
created通常在初始化數據的時候使用,比如說:我們獲取異步的ajax,初始化ajax獲取的數據放在created里面
mounted掛載元素,跟dom相關的 比如說觸發獲取dom的操作,
destroyed 比如說我在這個頁面做了一個定時器,那么離開頁面的時候,要做一個clear,要不然就會出現內存泄露,因為是單頁面應用,跳轉之后不會自動銷毀。
再比如監聽一些事件,比如滾動事件,離開的時候也要給它卸載,不然造成內存泄露;
activated 需要配合keep-alive才能生效,比如首頁這種存量大更新不頻繁的地方,可以給它做一個緩存,再第一次訪問的時候把它緩存下來。用於性能優化緩存dom和數據。
使用:套到路由的外邊,整個頁面就會被它緩存起來,但是之后你會發現,在后台數據更新的時候,第一次訪問過后再刷新的時候,還是之前的數據,dom就不再更新了。如果想要繼續更新的話,就需要把初始化數據,也就是created里面的數據放到activaed里面,這樣就會解除緩存。
2.vue的傳值
1.路由帶參數進行傳值:
a.通過query把orderId 從A組件傳遞給B組件,
this.$router.push({path:'/conponentsB',query:{orderId:123}}) //跳轉到B
b.在B組件中獲取A組件傳遞過來的參數
this.$route.query.orderId
2.通過設置 session Storage緩存的形式進行傳遞
3.父子組件傳值
父傳子 props
子傳父 子組件用$emit觸發事件,父組件用$on監聽子組件的事件
兄弟傳值 定義一個新的vue實例eventBus.js,
然后a組件用 eventBus.$emit,
b組件用 evrntBus.$on
父鏈 this.$parent 子組件使用可以直接訪問該組件的父實例或組件
this.$children 父組件也可以使用它訪問所有的子組件
子組件索引 用ref來為子組件指定一個索引名稱,就是在子組件標簽上ref指定一個名稱,然后在父組件通過this.$refs訪問指定名稱的子組件
vuex傳值
vuex有state、mutations、action、getters
state存放屬性、變量
mutations用於同步,改變state的值
action 用於調取異步,如獲取ajax, 並傳遞給mutations
Getters 可以對state進行計算操作,
modules 主要用來拆分state
常用的是mutations 對應的方法是 commit
actions 對應的方法是 dispatch
3.computed、watch的區別
computed計算屬性本身具有緩存特性,界面刷新,計算屬性有限讀取緩存,判斷是否有相關值的改變,相關值改變才會計算屬性
(舉例:購物車里面的商品列表和總金額之間的關系,只要商品列表里面的商品數量發生變化,或減少或增多或刪除商品,總金額都應該發生變化。這里的這個總金額使用computed屬性來進行計算是最好的選擇。)
而watch方法調用沒有,
每次刷新,方法都會執行,類似於事件監聽+事件機制;
watch的方法默認是不會執行的,只有依賴的屬性發生變化才會執行。
watch無法監聽數組的情況,以及解決方案
無法監聽數組的情況
1. 利用索引直接設置一個數組項時,例如:arr[indexOfItem] = newValue;
2. 修改數組的長度時,例如:arr.length = newLength;
3. 解決方案 1.this.$set(arr, index, newVal); 2.使用數組 splice 方法
4.MVVM模式(前后端分離的模式)
(注:react、vue都不是MVVM框架,只是有借鑒MVVM的思路)
View :用戶看到的視圖
Model :本地數據和數據庫中的數據
ViewModel:視圖和數據庫之間的橋,它就像是一個中轉站,負責轉換Model中的數據對象來讓數據變得更容易管理和使用,
該層向上 與視圖層進行雙向綁定,
向下與Model層通過接口請求進行數據交互,
通常我們寫產品:
1.通過接口從數據庫中讀取數據,然后將數據經過處理展現到用戶看到的視圖層
2.從視圖上讀取用戶的輸入,然后又將用戶的輸入通過接口寫入到數據庫中,