關於vue 常見面試題 (三) (賊全,一般人我不告訴他 )

1、vue如何監聽鍵盤事件中的按鍵?

<input @keyup.enter=“function”> 直接方法.就可以了

.delete	delete(刪除)/BackSpace(退格)
.tab	Tab
.enter	Enter(回車)
.esc	Esc(退出)
.space	Space(空格鍵)
.left	Left(左箭頭)
.up	Up(上箭頭)
.right	Right(右箭頭)
.down	Down(下箭頭)
.ctrl	Ctrl
.alt	Alt
.shift	Shift
.meta	(window系統下是window鍵,mac下是command鍵) 

2、ajax和axios、fetch的區別?

  1. jQuery ajax
$.ajax({
   type: 'POST',
   url: url,
   data: data,
   dataType: dataType,
   success: function () {},
   error: function () {}
}); 

傳統 Ajax 指的是 XMLHttpRequest(XHR), 最早出現的發送後端請求技術,隸屬於原始js中,核心使用XMLHttpRequest對象,多個請求之間如果有先後關係的話,就會出現回調地獄。
JQuery ajax 是對原生XHR的封裝,除此以外還增添了對JSONP的支持,舉出幾個缺點,那可能只有:

1.本身是針對MVC的編程,不符合現在前端MVVM的浪潮
2.基於原生的XHR開發,XHR本身的架構不清晰。
3.JQuery整個項目太大,單純使用ajax卻要引入整個JQuery非常的不合理(採取個性化打包的方案又不能享受CDN服務)
4.不符合關注分離(Separation of Concerns)的原則
5.配置和調用方式非常混亂,而且基於事件的異步模型不友好

  1. axios
axios({
    method: 'post',
    url: '/user/12345',
    data: {
        firstName: 'Y',
        lastName: 'L'
    }
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

axios 是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,本質上也是對原生XHR的封裝,只不過它是Promise的實現版本,符合最新的ES規範,它本身具有以下特徵:

1.從瀏覽器中創建 XMLHttpRequest
2.支持 Promise API
3.客戶端支持防止CSRF
4.提供了一些併發請求的接口(重要,方便了很多的操作)
5.從 node.js 創建 http 請求
6.攔截請求和響應
7.轉換請求和響應數據
8.取消請求
9.自動轉換JSON數據

  1. fetch
try {
  let response = await fetch(url);
  let data = response.json();
  console.log(data);
} catch(e) {
  console.log("Oops, error", e);
}

fetch號稱是AJAX的替代品,是在ES6出現的,使用了ES6中的promise對象。Fetch是基於promise設計的。Fetch的代碼結構比起ajax簡單多了,參數有點像jQuery ajax。但是,一定記住fetch不是ajax的進一步封裝,而是原生js,沒有使用XMLHttpRequest對象。
fetch的優點

1.符合關注分離,沒有將輸入、輸出和用事件來跟蹤的狀態混雜在一個對象裏
2.更好更方便的寫法

坦白說,上面的理由對我來說完全沒有什麼說服力,因爲不管是Jquery還是Axios都已經幫我們把xhr封裝的足夠好,使用起來也足夠方便,爲什麼我們還要花費大力氣去學習fetch?
我認爲fetch的優勢主要優勢就是:

1.語法簡潔,更加語義化
2.基於標準 Promise 實現,支持 async/await
3.同構方便,使用 isomorphic-fetch
4.更加底層,提供的API豐富(request, response)
5.脫離了XHR,是ES規範裏新的實現方式

fetch是一個低層次的API,你可以把它考慮成原生的XHR,所以使用起來並不是那麼舒服,需要進行封裝。
例如:

1)fetch只對網絡請求報錯,對400,500都當做成功的請求,服務器返回 400,500 錯誤碼時並不會 reject,只有網絡錯誤這些導致請求不能完成時,fetch 纔會被 reject。
2)fetch默認不會帶cookie,需要添加配置項: fetch(url, {credentials: ‘include’})
3)fetch不支持abort,不支持超時控制,使用setTimeout及Promise.reject的實現的超時控制並不能阻止請求過程繼續在後臺運行,造成了流量的浪費
4)fetch沒有辦法原生監測請求的進度,而XHR可以

總結:axios既提供了併發的封裝,也沒有fetch的各種問題,而且體積也較小,當之無愧現在最應該選用的請求的方式。

3、vue-cli如何新增自定義指令?

1.創建局部指令

var app = new Vue({
    el: '#app',
    data: {    
    },
    // 創建指令(可以多個)
    directives: {
        // 指令名稱
        dir1: {
            inserted(el) {
                // 指令中第一個參數是當前使用指令的DOM
                console.log(el);
                console.log(arguments);
                // 對DOM進行操作
                el.style.width = '200px';
                el.style.height = '200px';
                el.style.background = '#000';
            }
        }
    }
})  

2.全局指令

Vue.directive('dir2', {
    inserted(el) {
        console.log(el);
    }
})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章