年后想跳槽的,要抓緊時間補補了!前端面試干貨——Vue

年底了,有的盆友可能會考慮跳槽,從今天起,每天更新一些面試題,也是考察自己是否對這些知識點熟練于心。
糖糖會堅持更新,若有遺漏知識點,后續會補充。如果有不對的地方,歡迎朋友們指出。

“形象走在能力前面”

無論你今年幾歲,只要你邁入職場,建議去準備一套正裝。在外形上要職業化、專業化。

女生,化淡妝,保證自己的氣色要活力滿滿。男生,要干凈整潔,有精神。

“態度決定一切”

前端知識點多如牛毛,如果真的是面試,題海深深,你怎么知道問你什么?如果你跟背書一樣,十分機械地回答,也無法得到面試官的認可。
如果問到不會的,也不會害怕,畢竟知識點那么多,卡殼很正常,但你要妥善解決。

始終呈現一個自信的、積極的態度,百分之八十的公司或者企業更看重的是你的工作態度和忠誠度。

“知己知彼百戰百勝”

一般面試會問什么?關心什么?
人事關心你的生活狀態是否符合工作要求。
項目經理關心你的技術是否達標。
面試提問會涉及模塊:

個人介紹(含離職原因)、項目案例、主流框架、基礎知識點。

建議對自己擅長的模塊展開回答,把一個面試題回答透,比你沒有目標的背題有用。


image.png

面試干貨——能力和技術十分重要:

Vue 的優缺點

優點:
創建單頁面應用的輕量級Web應用框架
簡單易用
雙向數據綁定
組件化的思想
虛擬DOM
數據驅動視圖
缺點:
不支持IE8

談談對SPA 的理解

SPA是Single-Page-Application的縮寫,翻譯過來就是單頁應用。在WEB頁面初始化時一同加載Html、Javascript、Css。一旦頁面加載完成,SPA不會因為用戶操作而進行頁面重新加載或跳轉,取而代之的是利用路由機制實現Html內容的變換。

優點
1.良好的用戶體驗,內容更改無需重載頁面。
2.基于上面一點,SPA相對服務端壓力更小。
3.前后端職責分離,架構清晰。
缺點
1.由于單頁WEB應用,需在加載渲染頁面時請求JavaScript、Css文件,所以耗時更多。
2.由于前端渲染,搜索引擎不會解析JS,只能抓取首頁未渲染的模板,不利于SEO。
3.由于單頁應用需在一個頁面顯示所有的內容,默認不支持瀏覽器的前進后退。

缺點3的補充:

前端路由機制解決了單頁應用無法前進后退的問題。Hash模式中Hash變化會被瀏覽器記錄(onhashchange事件),History模式利用 H5 新增的pushState和replaceState方法可改變瀏覽器歷史記錄棧。

MVVM 的理解

MVVM是Model-View-ViewModel的縮寫。Model 代表數據層,可定義修改數據、編寫業務邏輯。View 代表視圖層,負責將數據渲染成頁面。ViewModel 負責監聽數據層數據變化,控制視圖層行為交互,簡單講,就是同步數據層和視圖層的對象。ViewModel 通過雙向綁定把 View 和 Model 層連接起來,且同步工作無需人為干涉,使開發人員只關注業務邏輯,無需頻繁操作DOM,不需關注數據狀態的同步問題。


mvvm

這張圖建議保存,十分直觀,方便理解與記憶。

如何實現 v-model

v-model指令用于實現input、select等表單元素的雙向綁定,是個語法糖。

原生 input 元素若是text/textarea類型,使用 value 屬性和 input 事件。
原生 input 元素若是radio/checkbox類型,使用 checked屬性和 change 事件。
原生 select 元素,使用 value 屬性和 change 事件。

input 元素上使用 v-model 等價于

<input :value="message" @input="message = $event.target.value" />
復制代碼

實現自定義組件的 v-model
自定義組件的v-model使用prop值為value和input事件。若是radio/checkbox類型,需要使用model來解決原生 DOM 使用的是 checked 屬性 和 change 事件,如下所示。

// 父組件
<template>
  <base-checkbox v-model="baseCheck" />
</template>
復制代碼
// 子組件
<template>
  <input type="checkbox" :checked="checked" @change="$emit('change', $event.target.checked)" />
</template>
<script>
export default {
  model: {
    prop: 'checked',
    event: 'change'
  },
  prop: {
    checked: Boolean
  }
}
</script>
復制代碼

Vue 響應式原理
核心源碼位置:vue/src/core/observer/index.js

響應式原理3個步驟:數據劫持、依賴收集、派發更新。

數據分為兩類:對象、數組。

對象
遍歷對象,通過Object.defineProperty為每個屬性添加 getter 和 setter,進行數據劫持。getter 函數用于在數據讀取時進行依賴收集,在對應的 dep 中存儲所有的 watcher;setter 則是數據更新后通知所有的 watcher 進行更新。

核心源碼

function defineReactive(obj, key, val, shallow) {
  // 實例化一個 dep, 一個 key 對應一個 dep
  const dep = new Dep()
 
  // 獲取屬性描述符
  const getter = property && property.get
  const setter = property && property.set
  if ((!getter || setter) && arguments.length === 2) {
    val = obj[key]
  }

  // 通過遞歸的方式處理 val 為對象的情況,即處理嵌套對象
  let childOb = !shallow && observe(val)
  
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    // 攔截obj.key,進行依賴收集
    get: function reactiveGetter () {
      const value = getter ? getter.call(obj) : val
      // Dep.target 是當前組件渲染的 watcher
      if (Dep.target) {
        // 將 dep 添加到 watcher 中
        dep.depend()
        if (childOb) {
          // 嵌套對象依賴收集
          childOb.dep.depend()
          // 響應式處理 value 值為數組的情況
          if (Array.isArray(value)) {
            dependArray(value)
          }
        }
      }
      return value
    },
    set: function reactiveSetter (newVal) {
      // 獲取舊值
      const value = getter ? getter.call(obj) : val
      // 判斷新舊值是否一致
      if (newVal === value || (newVal !== newVal && value !== value)) {
        return
      }
      if (process.env.NODE_ENV !== 'production' && customSetter) {
        customSetter()
      }

      if (getter && !setter) return
      // 如果是新值,用新值替換舊值
      if (setter) {
        setter.call(obj, newVal)
      } else {
        val = newVal
      }
      // 新值做響應式處理
      childOb = !shallow && observe(newVal)
      // 當響應式數據更新,依賴通知更新
      dep.notify()
    }
  })
}
復制代碼

數組
用數組增強的方式,覆蓋原屬性上默認的數組方法,保證在新增或刪除數據時,通過 dep 通知所有的 watcher 進行更新。

核心源碼

const arrayProto = Array.prototype
// 基于數組原型對象創建一個新的對象
export const arrayMethods = Object.create(arrayProto)

const methodsToPatch = [
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
]

methodsToPatch.forEach(function (method) {
  const original = arrayProto[method]
  // 分別在 arrayMethods 對象上定義7個方法
  def(arrayMethods, method, function mutator (...args) {
    // 先執行原生的方法
    const result = original.apply(this, args)
    const ob = this.__ob__
    let inserted
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }
    // 針對新增元素進行響應式處理
    if (inserted) ob.observeArray(inserted)
    // 數據無論是新增還是刪除都進行派發更新
    ob.dep.notify()
    return result
  })
})
復制代碼

Vuex 的理解及使用

Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式,采用集中式存儲管理應用的所有組件的狀態。

主要解決如下 兩個 問題

  1. 多個視圖依賴同一狀態。
  2. 來自不同視圖的行為需要變更同一個狀態。

其包含如下模塊,搬官網圖

vuex

State:定義并初始化全局狀態。
Getter: 依賴 State 中的狀態,進行二次包裝,不會影響 State 源數據。
Mutation: 更改 State 狀態的函數,必須是同步。
Action:用于提交 Mutation,可包含任意異步操作。
Module:若應用復雜,Store 會集中一個比較大的對象而顯得臃腫,Module允許我們將 Store模塊化管理。

當然,若應用比較簡單,共享狀態也比較少,可以用 Vue.observe 去替代 Vuex,省去安裝一個庫也挺好。

Vue 路由傳參方式
Vue 路由有 三種 方式進行傳參

方案一
// 路由配置
{
path: '/detail/:id',
name: 'Detail',
component: () => import('./Detail.vue')
}
// 路由跳轉
let id = 1
this.router.push({ path: '/detail/{id}'})
// 獲取參數
this.$route.params.id
復制代碼
方案二
方案二,URL 雖然不顯示我們的傳參,但是是可以在子組件獲取參數的。當然也有問題:會存在刷新丟失參數。

若想不丟失,需和方案一路由配置一樣。原因是第二種方式傳參是上一個頁面 push 函數中攜帶的,刷新沒有 push 的動作。

// 路由配置
{
path: '/detail',
name: 'Detail',
component: () => import('./Detail.vue')
}
// 路由跳轉
let id = 1
this.router.push({ name: 'Detail', params: { id: id } }) // 獲取參數 this.route.params.id
復制代碼
方案三
// 路由配置
{
path: '/detail',
name: 'Detail',
component: () => import('./Detail.vue')
}
// 路由跳轉
let id = 1
this.router.push({ name: 'Detail', query: { id: id } }) // 獲取參數 this.route.query.id
復制代碼

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容