前端面試 -Vue2系列

vue

1為啥用Vue?

1MVVM 數據的雙向綁定

2指令系統 不需要操作DOM

3組件化

2v-show和v-if、v-for

v-show 通過 display:none 隱藏元素,DOM還在。不可以觸發組件的生命周期, 性能消耗 小

v-if 將 DOM元素整個添加或刪除 ,可以觸發組件的生命周期, 性能消耗 大

v-for和v-if不建議一起使用?

v-for優先順序高一些所以,每次循環都會執行一次v-if判斷,會大大影響效率。

如果一定要一起使用可以使用template標籤包裹 裡邊寫v-if

3vue生命周期

BeforeCreate 實例初始化後被調用,此時this沒有,不能操作data和methods watch
Created函數 實例已經創建完成 ,可以訪問data等但是不能操作dom
Beforemounte mounted
BeforeUpdate Updated
beforeDestroy Destroy
activated deactivated keep-alive 快取的組件激活時/停用時
數據請求在created和mouted的區別? 都能拿到實例對象的屬性和方法 放在mounted請求有可能導致頁面閃動(頁面dom結構已經生成),但如果在頁面載入前完成則不會出現此情況建議:放在create生命周期當中

4computed與watch區別

computed計算屬性,watch監視屬性。倆個都能監聽data里的數據變化,區別是

既能用 computed 實現又可以用 watch 監聽來實現的功能,推薦用 computed 。因為有快取。

特別的是watch可以做具體的業務邏輯非同步使用。

5組件中data為什麼是函數?

函數會 產生數據污染情況 。如果是對象,組件復用的話,一個地方的數據變化會影響到另一個。

因為對象屬於引用類型,倆個組件的實例指向的是同一個記憶體地址的數據。

6Vue set的使用

vue 對已經存在的對象後添加的屬性無法做響應式。需要用到Vue.set方法,

特別的Vue對數組的改變也無法監聽,需要用到數組的方法,來實現。

7Vue響應式原理

data變頁面變

通過object.defineProperty 方法的getter和setter,監聽data里的數據,變化會調用setter方法,重新生成DOM

頁面變data變

通過v-model(語法糖)原理:v-on綁定的input事件,將value值設置為事件觸發變化的值

<input type="text" :value='msg' @input='msg = $event.target.value'

8組件通訊

  1. 通過 props 傳遞
  2. 通過 $emit 觸發自定義事件
  3. 使用 ref
  4. EventBus
  5. $parent 或$root
  6. attrs 與 listeners
  7. Provide 與 Inject
  8. Vuex

9nextTick理解

因為vue更新dom是一個非同步操作,並不是數據變化會馬上更新,會進入一個非同步隊列,等全部數據變化之後才渲染頁面。因此要基於新的DOM操作時,需要用到這個函數。

10插槽

讓父組件給子組件指定位置插入html結構,子組件利用solt決定位置。

特別的 作用域插槽是當數據在子組件(slot標籤)身上需要傳給父組件(template標籤slot-scope)。

11mixin混合

多個組件可以復用的 如datacomponentsmethodscreatedcomputed等等 可以提取到混合函數里

局部混入:配置項mixins: [myMixin]全局混入 Vue.mixin()

特別的 當組件存在與mixin對象相同的選項的時候 ,會合併使用組件身上的優先,當有生命周期函數時會先執行混合函數,在執行組件身上的

12key原理

就是一個節點的唯一標識。在diff演算法中可以根據key,更準確, 更快的找到對應的vnode節點

13keep-alive實現

在路由中設置keepAlive屬性判斷是否需要快取 , 使用keep-alive標籤包裹router-view

14Vuex

集中式狀態管理