vue.js面試筆記

一、react和vue有哪些不一樣,說說你對這兩個框架的見解

相同點css

  • 都支持服務器端渲染
  • 都有Virtual DOM,組件化開發,經過props參數進行父子組件數據的傳遞,都實現webComponent規範
  • 數據驅動視圖
  • 都有支持native的方案,React的React native,Vue的weex

不一樣點html

  • React嚴格上只針對MVC的view層,Vue則是MVVM模式
  • virtual DOM不同,vue會跟蹤每個組件的依賴關係,不須要從新渲染整個組件樹.而對於React而言,每當應用的狀態被改變時,所有組件都會從新渲染,因此react中會須要shouldComponentUpdate這個生命週期函數方法來進行控制
  • 組件寫法不同, React推薦的作法是 JSX + inline style,也就是把HTML和CSS全都寫進JavaScript了,即'all in js'; Vue推薦的作法是webpack+vue-loader的單文件組件格式,即html,css,jd寫在同一個文件;
  • 數據綁定: vue實現了數據的雙向綁定,react數據流動是單向的
  • state對象在react應用中不可變的,須要使用setState方法更新狀態;在vue中,state對象不是必須的,數據由data屬性在vue對象中管理

2.MVC和MVVM的區別

MVC(Model-View-Controller)前端

  • MVC是比較直觀的架構模式,用戶操做->View(負責接收用戶的輸入操做)->Controller(業務邏輯處理)->Model(數據持久化)->View(將結果反饋給View)。
  • MVC使用很是普遍,好比JavaEE中的SSH框架

MVVM(Model-View-ViewModel)vue

  • 若是說MVP是對MVC的進一步改進,那麼MVVM則是思想的徹底變革。它是將「數據模型數據雙向綁定」的思想做爲核心,所以在View和Model之間沒有聯繫,經過ViewModel進行交互,並且Model和ViewModel之間的交互是雙向的,所以視圖的數據的變化會同時修改數據源,而數據源數據的變化也會當即反應view。

如何理解vue中MVVM模式?react

  • MVVM全稱是Model-View-ViewModel;vue是以數據爲驅動的,一旦建立dom和數據就保持同步,每當數據發生變化時,dom也會變化。
  • DOMListeners和DataBindings是實現雙向綁定的關鍵。DOMListeners監聽頁面全部View層DOM元素的變化,當發生變化,Model層的數據隨之變化;DataBindings監聽Model層的數據,當數據發生變化,View層的DOM元素隨之變化。

三、vue的虛擬dom?

  • 虛擬的DOM的核心思想是:對複雜的文檔DOM結構,提供一種方便的工具,進行最小化地DOM操做。
  • 簡單來講,虛擬DOM是用Object來表明一顆節點,這個Object叫作VNode,而後使用兩個VNode進行對比,根據對比後的結果修改真實DOM。
  • 爲何是兩個VNode?由於每次渲染都會生成一個新的VNode,而後和上一次渲染時用的VNode進行對比。而後將這一次新生成的VNode緩存,用來進行下一次對比。

四、說出至少4種vue當中的指令和它的用法?

  • v-if:是「真正」的條件渲染,在切換中組件會適當的被銷燬和重建;
  • v-for:數據循環渲染;
  • v-show:控制元素的顯示隱藏,即控制元素的display,基於 CSS 進行切換
  • v-bind:class:綁定一個屬性;
  • v-model:實現雙向綁定

五、組件之間的傳值通訊?

  • 父組件向子組件傳值,經過props
//父組件經過標籤上面定義傳值
    <template>
        <Main :obj="data"></Main>
    </template>
    <script>
        //引入子組件
        import Main form "./main"
        
        exprot default{
            name:"parent",
            data(){
                return {
                    data:"我要向子組件傳遞數據"
                }
            },
            //初始化組件
            components:{
                Main
            }
        }
    </script>
//子組件經過props方法接受數據
     
    <template>
        <div>{{data}}</div>
    </template>
    <script>
        exprot default{
            name:"son",
            //接受父組件傳值
            props:["data"]
        }
    </script>
  • 子組件向父組件傳值:經過$on,$emitwebpack

    1. 子組件中須要以某種方式(如點擊事件)的方法來觸發一個自定義的事件;
    2. 將須要傳的值做爲$emit的第二個參數,該值將做爲實參傳給響應事件的方法;
    3. 在父組件中註冊子組件並在子組件標籤上綁定自定義事件的監聽。
//子組件:
<template>
    <div @click="up"></div>
</template>

methods: {
    up() {
        this.$emit('upup','hehe'); //主動觸發upup方法,'hehe'爲向父組件傳遞的數據
    }
}

//父組件
<div>
    <child v-on:upup="change" :msg="msg"></child> //監聽子組件觸發的upup事件,而後調用change方法
</div>
methods: {
    change(msg) {
        this.msg = msg;
    }
}
  • 非父子組件通訊

若是2個組件不是父子組件那麼如何通訊呢?這時能夠經過eventHub來實現通訊.
所謂eventHub就是建立一個事件中心,至關於中轉站,能夠用它來傳遞事件和接收事件.angularjs

let Hub = new Vue(); //建立事件中心

//組件1觸發:
<div @click="eve"></div>
methods: {
    eve() {
        Hub.$emit('change','hehe'); //Hub觸發事件
    }
}

//組件2接收:
<div></div>
created() {
    Hub.$on('change', () => { //Hub接收事件
        this.msg = 'hehe';
    });
}

六、vue的優勢是什麼?

  • 低耦合。視圖(View)能夠獨立於Model變化和修改,一個ViewModel能夠綁定到不一樣的"View"上,當View變化的時候Model能夠不變,當Model變化的時候View也能夠不變。
  • 可重用性。你能夠把一些視圖邏輯放在一個ViewModel裏面,讓不少view重用這段視圖邏輯。
  • 獨立開發。開發人員能夠專一於業務邏輯和數據的開發(ViewModel),設計人員能夠專一於頁面設計,使用Expression Blend能夠很容易設計界面並生成xml代碼。
  • 可測試。界面素來是比較難於測試的,而如今測試能夠針對ViewModel來寫。

七、路由之間跳轉?

  • 聲明式(標籤跳轉) <router-link :to="index">es6

  • 編程式(js跳轉) router.push('index')

八、組件的使用和本身建立公用組件?

  • 第一步:在components目錄新建你的組件文件(indexPage.vue),script必定要export default {}
  • 第二步:在須要用的頁面(組件)中導入:import indexPage from '@/components/indexPage.vue'
  • 第三步:注入到vue的子組件的components屬性上面,components:{indexPage}
  • 第四步:在template視圖view中使用,

問題有indexPage命名,使用的時候則index-pageweb

九、vue如何實現按需加載配合webpack設置?

  • webpack中提供了require.ensure()來實現按需加載。之前引入路由是經過import 這樣的方式引入,改成const定義的方式進行引入。
  • 不進行頁面按需加載引入方式:import home from '../../common/home.vue'
  • 進行頁面按需加載的引入方式:const home = r => require.ensure( [], () => r (require('../../common/home.vue')))

十、vuex是什麼?怎麼使用?哪一種功能場景使用它?

  • vue框架中狀態管理。在main.js引入store,注入。場景有:單頁應用中,組件之間的狀態。音樂播放、登陸狀態、加入購物車
  • 數據單向流動vue-router

    1. 一個應用能夠看做是由上面三部分組成: View, Actions,State,數據的流動也是從View => Actions => State =>View,以此達到數據的單向流動,可是項目較大的,組件嵌套過多的時候,多組件共享同一個State會在數據傳遞時出現不少問題。Vuex就是爲了解決這些問題而產生的。
    2. Vuex能夠被看做項目中全部組件的數據中心,咱們將全部組件中共享的State抽離出來,任何組件均可以訪問和操做咱們的數據中心。
    3. Vuex的組成,一個實例化的Vuex.Storestate, mutationsactions三個屬性組成:state中保存着共有數據,改變state中的數據只能經過mutations中的方法,且mutations中的方法必須是同步的,若是要寫異步的方法,須要些在actions中,並經過commitmutations中進行state中數據的更改。

十一、v-show和v-if指令的共同點和不一樣點?

  • v-show指令是經過修改元素的displayCSS屬性讓其顯示或者隱藏
  • v-if指令是直接銷燬和重建DOM達到讓元素顯示和隱藏的效果

十二、如何讓CSS只在當前組件中起做用?

  • 將當前組件的<style>修改成<style scoped>

1三、<keep-alive></keep-alive>的做用是什麼?

  • <keep-alive></keep-alive>包裹動態組件時,會緩存不活動的組件實例,主要用於保留組件狀態或避免從新渲染。
  • 大白話: 好比有一個列表和一個詳情,那麼用戶就會常常執行打開詳情=>返回列表=>打開詳情…
    這樣的話列表和詳情都是一個頻率很高的頁面,那麼就能夠對列表組件使用<keep-alive></keep-alive>進行緩存,這樣用戶每次返回列表的時候,都能從緩存中快速渲染,而不是從新渲染

1四、Vue中引入組件的步驟?

  • 採用ES6的import ... from ...語法或CommonJSrequire()方法引入組件
  • 對組件進行註冊,代碼以下
// 註冊
Vue.component('my-component', {
  template: '<div>A custom component!</div>'
})
  • 3.使用組件<my-component></my-component>

1五、指令v-el的做用是什麼?

  • 提供一個在頁面上已存在的 DOM 元素做爲 Vue 實例的掛載目標.能夠是 CSS 選擇器,也能夠是一個 HTMLElement 實例

1六、在Vue中使用插件的步驟

  • 採用ES6的import ... from ...語法或CommonJSrequire()方法引入插件
  • 使用全局方法Vue.use( plugin )使用插件,能夠傳入一個選項對象Vue.use(MyPlugin, { someOption: true })

1七、vue-loader是什麼?使用它的用途有哪些?

  • 解析.vue文件的一個加載器,將template/js/style轉換成js模塊。
  • 用途:js能夠寫es六、style樣式能夠scss或less、template能夠加jade等

1八、請說出vue.cli項目中src目錄每一個文件夾和文件的用法?

  • assets文件夾是放靜態資源;
  • components是放組件;
  • router是定義路由相關的配置;
  • view視圖;
  • app.vue是一個應用主組件;
  • main.js是入口文件

1九、聊聊你對Vue.js的template編譯的理解?

  • 簡而言之,就是先轉化成AST樹,再獲得的render函數返回VNode(Vue的虛擬DOM節點)
  • 詳情步驟:
    首先,經過compile編譯器把template編譯成AST語法樹(abstract syntax tree 即 源代碼的抽象語法結構的樹狀表現形式),compile是createCompiler的返回值,createCompiler是用以建立編譯器的。另外compile還負責合併option。

    而後,AST會通過generate(將AST語法樹轉化成render funtion字符串的過程)獲得render函數,render的返回值是VNode,VNode是Vue的虛擬DOM節點,裏面有(標籤名、子節點、文本等等)

20、vue-router的兩種模式的區別

前端路由的核心,就在於 —— 改變視圖的同時不會向後端發出請求。

  • hash —— 即地址欄 URL 中的 # 符號(此 hash 不是密碼學裏的散列運算)。
    好比這個 URL:http://www.abc.com/#/hello,hash 的值爲 #/hello。它的特色在於:hash 雖然出如今 URL 中,但不會被包括在 HTTP 請求中,對後端徹底沒有影響,所以改變 hash 不會從新加載頁面。
  • history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(須要特定瀏覽器支持)
    這兩個方法應用於瀏覽器的歷史記錄棧,在當前已有的 back、forward、go 的基礎之上,它們提供了對歷史記錄進行修改的功能。只是當它們執行修改時,雖然改變了當前的 URL,但瀏覽器不會當即向後端發送請求。

所以能夠說,hash 模式和 history 模式都屬於瀏覽器自身的特性,Vue-Router 只是利用了這兩個特性(經過調用瀏覽器提供的接口)來實現前端路由。

2一、vuejs與angularjs以及react的區別?

  • 與AngularJS的區別
    相同點:
    1.都支持指令:內置指令和自定義指令。
    2.都支持過濾器:內置過濾器和自定義過濾器。
    3.都支持雙向數據綁定。
    4.都不支持低端瀏覽器。
    不一樣點:
    1.AngularJS的學習成本高,好比增長了Dependency Injection特性,而Vue.js自己提供的API都比較簡單、直觀。
    2.在性能上,AngularJS依賴對數據作髒檢查,因此Watcher越多越慢。
    3.Vue.js使用基於依賴追蹤的觀察而且使用異步隊列更新。全部的數據都是獨立觸發的。對於龐大的應用來講,這個優化差別仍是比較明顯的。

  • 與React的區別
    相同點:
    1.React採用特殊的JSX語法,Vue.js在組件開發中也推崇編寫.vue特殊文件格式,對文件內容都有一些約定,二者都須要編譯後使用。
    2.中心思想相同:一切都是組件,組件實例之間能夠嵌套。
    3.都提供合理的鉤子函數,可讓開發者定製化地去處理需求。
    4.都不內置列數AJAX,Route等功能到核心包,而是以插件的方式加載。
    5.在組件開發中都支持mixins的特性。
    不一樣點:
    1.React依賴Virtual DOM,而Vue.js使用的是DOM模板。React採用的Virtual DOM會對渲染出來的結果作髒檢查。
    2.Vue.js在模板中提供了指令,過濾器等,能夠很是方便,快捷地操做DOM。

2二、請詳細說下你對vue生命週期的理解?

  • 總共分爲8個階段建立前/後,載入前/後,更新前/後,銷燬前/後。
    建立前/後: 在beforeCreate階段,vue實例的掛載元素el和數據對象data都爲undefined,還未初始化。在created階段,vue實例的數據對象data有了,el尚未。

    載入前/後:在beforeMount階段,vue實例的$eldata都初始化了,但仍是掛載以前,爲虛擬的dom節點,data.message還未替換。在mounted階段,vue實例掛載完成,data.message成功渲染。

    更新前/後:當data變化時,會觸發beforeUpdateupdated方法。

    銷燬前/後:在執行destroy方法後,對data的改變不會再觸發周期函數,說明此時vue實例已經解除了事件監聽以及和dom的綁定,可是dom結構依然存在

2三、什麼是vue生命週期?

  • Vue 實例從建立到銷燬的過程,就是生命週期。也就是從開始建立、初始化數據、編譯模板、掛載Dom→渲染、更新→渲染、卸載等一系列過程,咱們稱這是 Vue 的生命週期。

2四、vue生命週期的做用是什麼?

  • 藉助組件各個階段的鉤子能夠對組件有更好的利用和擴展。

2五、第一次頁面加載會觸發哪幾個鉤子?

  • 會觸發 beforeCreate, created, beforeMount, mounted 這幾個鉤子

2六、DOM 渲染在 哪一個週期中就已經完成?

  • DOM 渲染在 mounted 中就已經完成了

2七、簡單描述每一個週期具體適合哪些場景?

  • 生命週期鉤子的一些使用方法:
    beforecreate : 能夠在這加個loading事件,在加載實例時觸發
    created : 初始化完成時的事件寫在這裏,如在這結束loading事件,異步請求也適宜在這裏調用
    mounted : 掛載元素,獲取到DOM節點
    updated : 若是對數據統一處理,在這裏寫上相應函數
    beforeDestroy : 能夠作一個確認中止事件的確認框
    nextTick : 更新數據後當即操做dom
相關文章
相關標籤/搜索