參考:https://segmentfault.com/a/11...javascript
一、語法簡化php
HTML、XHTML的DOCTYPE、html、meta、script等標籤,在HTML5中有大幅度的簡化。html
二、統一網頁內嵌多媒體語法前端
之前,在網頁中播放多媒體時,須要使用ActiveX或Plug-in的方式來完成。有了HTML5以後,使用<video>或<audio>標籤播放視頻和音頻,不須要在安裝其餘的什麼來播放了。vue
三、新增了語義標籤java
爲了增長網頁的可讀性,HTML5增長了<header>、<footer>、<section>、<article>、<nav>、<hgroup>、<aside>、<figure>語義標籤。web
四、HTML5廢除了一些舊標籤面試
廢除的大部分是網頁美化方面的標籤,例如:<big>、<u>、<font>、<basefont>、<center>、<s>、<tt>。對<frame>框架,不能使用。ajax
五、全新的表單設計vue-router
表單是網頁設計者最經常使用的功能,HTML5對錶單作了很大的更改,不但新增了幾項新的標籤,對原來的<form>標籤也增長了許多屬性。
六、新增了<canvas>標籤,能夠繪製圖形
HTML5新增了具備繪圖功能的<canvas>
擴展資料
HTML5新特徵
一、表單是實現用戶與頁面後臺交互主要組成部分,HTML5在表單的設計上功能更增強大。input類型和屬性的多樣性大大地加強了HTML可表達的表單形式,再加上新增長的一些表單標籤,使得本來須要JavaScript來實現的控件,能夠直接使用HTML5的表單來實現。
二、HTML5較之傳統的數據存儲有自已的存儲方式,容許在客戶端實現較大規模的數據存儲。爲了知足不一樣的需求,HTML5支持DOM Storage和Web SQL Database 兩種存儲機制。
其中,DOM Storage 適用於具備key/value對的基本本地存儲;而WebSQLDatabase是適用於關係型數據庫的存儲方式,開發者可使用SQL語法對這些數據進行查詢、插入等操做。
三、HTML5最大特點之一就是支持音頻視頻,在經過增長了<audio>、<video>兩個標籤來實現對多媒體中的音頻、視頻使用的支持,只要在Web網頁中嵌入這兩個標籤,而無需第三方插件(如Flash)就能夠實現音視頻的播放功能。
HTML5對音頻、視頻文件的支持使得瀏覽器擺脫了對插件的依賴,加快了頁面的加載速度,擴展了互聯網多媒體技術的發展空間。
相同:在本地(瀏覽器端)存儲數據
不一樣:
前端通訊類的問題,主要包括如下內容:
一、什麼是同源策略及限制
同源策略是一個概念,就一句話。有什麼限制,就三句話。能說出來便可。
二、先後端如何通訊
若是你不許備,估計也就只能說出ajax。這個能夠考察出知識面。
三、如何建立Ajax
Ajax在先後端通訊中常常用到。作業務時,能夠藉助第三方的庫,好比vue框架裏的庫、jQuery也有封裝好的方法。但若是讓你用原生的js去實現,該怎麼作?
這就是考察你的動手能力,以及框架原理的掌握。若是能寫出來,能夠體現出你的基本功。是加分項。
四、跨域通訊的幾種方式
這部分很是重要。無非就是問你:什麼是跨域、跨域有什麼限制、跨域有幾種方式。
下面分別講解。
同源策略的概念和具體限制
同源策略:限制從一個源加載的文檔或腳本如何與來自另外一個源的資源進行交互。這是一個用於隔離潛在惡意文件的關鍵的安全機制。(來自MDN官方的解釋)
具體解釋:
(1)源包括三個部分:協議、域名、端口(http協議的默認端口是80)。若是有任何一個部分不一樣,則源不一樣,那就是跨域了。
(2)限制:這個源的文檔沒有權利去操做另外一個源的文檔。這個限制體如今:(要記住)
Cookie、LocalStorage和IndexDB沒法獲取。
沒法獲取和操做DOM。
不能發送Ajax請求。咱們要注意,Ajax只適合同源的通訊。
先後端如何通訊
主要有如下幾種方式:
Ajax:不支持跨域。
WebSocket:不受同源策略的限制,支持跨域。
CORS:不受同源策略的限制,支持跨域。一種新的通訊協議標準。能夠理解成是:同時支持同源和跨域的Ajax。
如何建立Ajax
關於Ajax請求,能夠看本人的基礎文章:Ajax入門和發送http請求
在回答 Ajax 的問題時,要回答如下幾個方面:
一、XMLHttpRequest 的工做原理
二、兼容性處理
XMLHttpRequest只有在高級瀏覽器中才支持。在回答問題時,這個兼容性問題不要忽略。
三、事件的觸發條件
四、事件的觸發順序
XMLHttpRequest有不少觸發事件,每一個事件是怎麼觸發的。
發送 Ajax 請求的五個步驟(XMLHttpRequest的工做原理)
(1)建立XMLHttpRequest 對象。
(2)使用open方法設置請求的參數。open(method, url, 是否異步)。
(3)發送請求。
(4)註冊事件。 註冊onreadystatechange事件,狀態改變時就會調用。
若是要在數據完整請求回來的時候才調用,咱們須要手動寫一些判斷的邏輯。
(5)獲取返回的數據,更新UI。
發送 get 請求和 post 請求
get請求舉例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h1>Ajax 發送 get 請求</h1> <input type="button" value="發送get_ajax請求" id='btnAjax'> <script type="text/javascript"> // 綁定點擊事件 document.querySelector('#btnAjax').onclick = function () { // 發送ajax 請求 須要 五步 // (1)建立異步對象 var ajaxObj = new XMLHttpRequest(); // (2)設置請求的參數。包括:請求的方法、請求的url。 ajaxObj.open('get', '02-ajax.php'); // (3)發送請求 ajaxObj.send(); //(4)註冊事件。 onreadystatechange事件,狀態改變時就會調用。 //若是要在數據完整請求回來的時候才調用,咱們須要手動寫一些判斷的邏輯。 ajaxObj.onreadystatechange = function () { // 爲了保證 數據 完整返回,咱們通常會判斷 兩個值 if (ajaxObj.readyState == 4 && ajaxObj.status == 200) { // 若是可以進到這個判斷 說明 數據 完美的回來了,而且請求的頁面是存在的 // 5.在註冊的事件中 獲取 返回的 內容 並修改頁面的顯示 console.log('數據返回成功'); // 數據是保存在 異步對象的 屬性中 console.log(ajaxObj.responseText); // 修改頁面的顯示 document.querySelector('h1').innerHTML = ajaxObj.responseText; } } } </script> </body> </html>
post 請求舉例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h1>Ajax 發送 get 請求</h1> <input type="button" value="發送put_ajax請求" id='btnAjax'> <script type="text/javascript"> // 異步對象 var xhr = new XMLHttpRequest(); // 設置屬性 xhr.open('post', '02.post.php'); // 若是想要使用post提交數據,必須添加此行 xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // 將數據經過send方法傳遞 xhr.send('name=fox&age=18'); // 發送並接受返回值 xhr.onreadystatechange = function () { // 這步爲判斷服務器是否正確響應 if (xhr.readyState == 4 && xhr.status == 200) { alert(xhr.responseText); } }; </script> </body> </html>
onreadystatechange 事件
註冊 onreadystatechange 事件後,每當 readyState 屬性改變時,就會調用 onreadystatechange 函數。
readyState:(存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化)
0: 請求未初始化
1: 服務器鏈接已創建
2: 請求已接收
3: 請求處理中
4: 請求已完成,且響應已就緒
事件的觸發條件
事件的觸發順序
上圖的參考連接:
你真的會使用XMLHttpRequest嗎?
實際開發中用的 原生Ajax請求
var util = {}; //獲取 ajax 請求以後的json util.json = function (options) { var opt = { url: '', type: 'get', data: {}, success: function () { }, error: function () { }, }; util.extend(opt, options); if (opt.url) { //IE兼容性處理:瀏覽器特徵檢查。檢查該瀏覽器是否存在XMLHttpRequest這個api,沒有的話,就用IE的api var xhr = XMLHttpRequest ? new XMLHttpRequest() : new window.ActiveXObject('Microsoft.XMLHTTP'); var data = opt.data, url = opt.url, type = opt.type.toUpperCase(); dataArr = []; } for (var key in data) { dataArr.push(key + '=' + data[key]); } if (type === 'GET') { url = url + '?' + dataArr.join('&'); xhr.open(type, url.replace(/\?$/g, ''), true); xhr.send(); } if (type === 'POST') { xhr.open(type, url, true); // 若是想要使用post提交數據,必須添加此行 xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(dataArr.join('&')); } xhr.onload = function () { if (xhr.status === 200 || xhr.status === 304) { //304表示:用緩存便可。206表示獲取媒體資源的前面一部分 var res; if (opt.success && opt.success instanceof Function) { res = xhr.responseText; if (typeof res === 'string') { res = JSON.parse(res); //將字符串轉成json opt.success.call(xhr, res); } } } else { if (opt.error && opt.error instanceof Function) { opt.error.call(xhr, res); } } }; }
Ajax 的推薦連接:https://segmentfault.com/a/11...
跨域通訊的幾種方式
方式以下:
一、JSONP
二、WebSocket
三、CORS
四、Hash
五、postMessage
上面這五種方式,在面試時,都要說出來。
一、JSONP
面試會問:JSONP的原理是什麼?怎麼實現的?
在CORS和postMessage之前,咱們一直都是經過JSONP來作跨域通訊的。
JSONP的原理:經過<script>標籤的異步加載來實現的。好比說,實際開發中,咱們發現,head標籤裏,能夠經過<script>標籤的src,裏面放url,加載不少在線的插件。這就是用到了JSONP。
JSONP的實現:
好比說,客戶端這樣寫:
<script src="http://www.smyhvae.com/?data=name&callback=myjsonp"></script>
上面的src中,data=name是get請求的參數,myjsonp是和後臺約定好的函數名。 服務器端這樣寫:
myjsonp({ data: {} })
因而,本地要求建立一個myjsonp 的全局函數,才能將返回的數據執行出來。
實際開發中,前端的JSONP是這樣實現的:
<script> var util = {}; //定義方法:動態建立 script 標籤 /** * [function 在頁面中注入js腳本] * @param {[type]} url [description] * @param {[type]} charset [description] * @return {[type]} [description] */ util.createScript = function (url, charset) { var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); charset && script.setAttribute('charset', charset); script.setAttribute('src', url); script.async = true; return script; }; /** * [function 處理jsonp] * @param {[type]} url [description] * @param {[type]} onsucess [description] * @param {[type]} onerror [description] * @param {[type]} charset [description] * @return {[type]} [description] */ util.jsonp = function (url, onsuccess, onerror, charset) { var callbackName = util.getName('tt_player'); //事先約定好的 函數名 window[callbackName] = function () { //根據回調名稱註冊一個全局的函數 if (onsuccess && util.isFunction(onsuccess)) { onsuccess(arguments[0]); } }; var script = util.createScript(url + '&callback=' + callbackName, charset); //動態建立一個script標籤 script.onload = script.onreadystatechange = function () { //監聽加載成功的事件,獲取數據 if (!script.readyState || /loaded|complete/.test(script.readyState)) { script.onload = script.onreadystatechange = null; // 移除該script的 DOM 對象 if (script.parentNode) { script.parentNode.removeChild(script); } // 刪除函數或變量 window[callbackName] = null; //最後不要忘了刪除 } }; script.onerror = function () { if (onerror && util.isFunction(onerror)) { onerror(); } }; document.getElementsByTagName('head')[0].appendChild(script); //往html中增長這個標籤,目的是把請求發送出去 }; </script>
二、WebSocket
WebSocket的用法以下:
// var ws = new WebSocket('wss://echo.websocket.org'); //建立WebSocket的對象。參數能夠是 ws 或 wss,後者表示加密。 //把請求發出去 ws.onopen = function (evt) { console.log('Connection open ...'); ws.send('Hello WebSockets!'); }; //對方發消息過來時,我接收 ws.onmessage = function (evt) { console.log('Received Message: ', evt.data); ws.close(); }; //關閉鏈接 ws.onclose = function (evt) { console.log('Connection closed.'); };
Websocket的推薦連接:http://www.ruanyifeng.com/blo...
面試通常不會讓你寫這個代碼,通常是考察你是否瞭解 WebSocket概念,知道有這麼回事便可。
三、CORS
CORS 能夠理解成是既能夠同步、也能夠異步的Ajax。
fetch 是一個比較新的API,用來實現CORS通訊。用法以下:
// url(必選),options(可選) fetch('/some/url/', { method: 'get', }).then(function (response) { //相似於 ES6中的promise }).catch(function (err) { // 出錯了,等價於 then 的第二個參數,但這樣更好用更直觀 });
CORS的推薦連接:http://www.ruanyifeng.com/blo...
推薦連接裏有詳細的配置。
另外,若是面試官問:「CORS爲何支持跨域的通訊?」
答案:跨域時,瀏覽器會攔截Ajax請求,並在http頭中加Origin。
四、Hash
url的#後面的內容就叫Hash。Hash的改變,頁面不會刷新。這就是用 Hash 作跨域通訊的基本原理。
補充:url的?後面的內容叫Search。Search的改變,會致使頁面刷新,所以不能作跨域通訊。
使用舉例:
場景:個人頁面 A 經過iframe或frame嵌入了跨域的頁面 B。
如今,我這個A頁面想給B頁面發消息,怎麼操做呢?
(1)首先,在個人A頁面中:
//僞代碼 var B = document.getElementsByTagName('iframe'); B.src = B.src + '#' + 'jsonString'; //咱們能夠把JS 對象,經過 JSON.stringify()方法轉成 json字符串,發給 B
(2)而後,在B頁面中:
// B中的僞代碼 window.onhashchange = function () { //經過onhashchange方法監聽,url中的 hash 是否發生變化 var data = window.location.hash; };
五、postMessage()方法
H5中新增的postMessage()方法,能夠用來作跨域通訊。既然是H5中新增的,那就必定要提到。
場景:窗口 A (http:A.com)向跨域的窗口 B (http:B.com)發送信息。步驟以下。
(1)在A窗口中操做以下:向B窗口發送數據:
// 窗口A(http:A.com)向跨域的窗口B(http:B.com)發送信息 Bwindow.postMessage('data', 'http://B.com'); //這裏強調的是B窗口裏的window對象
(2)在B窗口中操做以下:
// 在窗口B中監聽 message 事件 Awindow.addEventListener('message', function (event) { //這裏強調的是A窗口裏的window對象 console.log(event.origin); //獲取 :url。這裏指:http://A.com console.log(event.source); //獲取:A window對象 console.log(event.data); //獲取傳過來的數據 }, false);
參考:https://www.jianshu.com/p/fa25121c0f5f
MVVM 是 Model-View-ViewModel 的縮寫。
Model表明數據模型,也能夠在Model中定義數據修改和操做的業務邏輯。
View表明UI 組件,它負責將數據模型轉化成UI 展示出來。
ViewModel監聽模型數據的改變和控制視圖行爲、處理用戶交互,簡單理解就是一個同步View 和 Model的對象,鏈接Model和View。
在MVVM架構下,View 和 Model 之間並無直接的聯繫,而是經過ViewModel進行交互,Model 和 ViewModel 之間的交互是雙向的, 所以View 數據的變化會同步到Model中,而Model 數據的變化也會當即反應到View 上。
ViewModel經過雙向數據綁定把 View 層和 Model 層鏈接了起來,而View 和 Model 之間的同步工做徹底是自動的,無需人爲干涉,所以開發者只需關注業務邏輯,不須要手動操做DOM, 不須要關注數據狀態的同步問題,複雜的數據狀態維護徹底由 MVVM 來統一管理。
MVVM的優缺點?
優勢:
分離視圖(View)和模型(Model),下降代碼耦合,提升視圖或者邏輯的重用性: 好比視圖(View)能夠獨立於Model變化和修改,一個ViewModel能夠綁定不一樣的"View"上,當View變化的時候Model不能夠不變,當Model變化的時候View也能夠不變。你能夠把一些視圖邏輯放在一個ViewModel裏面,讓不少view重用這段視圖邏輯
提升可測試性: ViewModel的存在能夠幫助開發者更好地編寫測試代碼
自動更新dom: 利用雙向綁定,數據更新後視圖自動更新,讓開發者從繁瑣的手動dom中解放
缺點:
Bug很難被調試: 由於使用雙向綁定的模式,當你看到界面異常了,有多是你View的代碼有Bug,也多是Model的代碼有問題。數據綁定使得一個位置的Bug被快速傳遞到別的位置,要定位原始出問題的地方就變得不那麼容易了。另外,數據綁定的聲明是指令式地寫在View的模版當中的,這些內容是沒辦法去打斷點debug的
一個大的模塊中model也會很大,雖然使用方便了也很容易保證了數據的一致性,當時長期持有,不釋放內存就形成了花費更多的內存
對於大型的圖形應用程序,視圖狀態較多,ViewModel的構建和維護的成本都會比較高。
beforeCreate(建立前) 在數據觀測和初始化事件還未開始
created(建立後) 完成數據觀測,屬性和方法的運算,初始化事件,$el屬性尚未顯示出來
beforeMount(載入前) 在掛載開始以前被調用,相關的render函數首次被調用。實例已完成如下的配置:編譯模板,把data裏面的數據和模板生成html。注意此時尚未掛載html到頁面上。
mounted(載入後) 在el 被新建立的 vm.$el 替換,並掛載到實例上去以後調用。實例已完成如下的配置:用上面編譯好的html內容替換el屬性指向的DOM對象。完成模板中的html渲染到html頁面中。此過程當中進行ajax交互。
beforeUpdate(更新前) 在數據更新以前調用,發生在虛擬DOM從新渲染和打補丁以前。能夠在該鉤子中進一步地更改狀態,不會觸發附加的重渲染過程。
updated(更新後) 在因爲數據更改致使的虛擬DOM從新渲染和打補丁以後調用。調用時,組件DOM已經更新,因此能夠執行依賴於DOM的操做。然而在大多數狀況下,應該避免在此期間更改狀態,由於這可能會致使更新無限循環。該鉤子在服務器端渲染期間不被調用。
beforeDestroy(銷燬前) 在實例銷燬以前調用。實例仍然徹底可用。
destroyed(銷燬後) 在實例銷燬以後調用。調用後,全部的事件監聽器會被移除,全部的子實例也會被銷燬。該鉤子在服務器端渲染期間不被調用。
1.什麼是vue生命週期?
答: Vue 實例從建立到銷燬的過程,就是生命週期。從開始建立、初始化數據、編譯模板、掛載Dom→渲染、更新→渲染、銷燬等一系列過程,稱之爲 Vue 的生命週期。
2.vue生命週期的做用是什麼?
答:它的生命週期中有多個事件鉤子,讓咱們在控制整個Vue實例的過程時更容易造成好的邏輯。
3.vue生命週期總共有幾個階段?
答:它能夠總共分爲8個階段:建立前/後, 載入前/後,更新前/後,銷燬前/銷燬後。
4.第一次頁面加載會觸發哪幾個鉤子?
答:會觸發 下面這幾個beforeCreate, created, beforeMount, mounted 。
5.DOM 渲染在 哪一個週期中就已經完成?
答:DOM 渲染在 mounted 中就已經完成了。
Vue 組件間通訊只要指如下 3 類通訊:父子組件通訊、隔代組件通訊、兄弟組件通訊
(1)props / $emit適用 父子組件通訊
這種方法是 Vue 組件的基礎,相信大部分同窗耳聞能詳,因此此處就不舉例展開介紹。
(2)ref 與 $parent / $children適用 父子組件通訊
ref:若是在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;若是用在子組件上,引用就指向組件實例
$parent / $children:訪問父 / 子實例
(3)EventBus ($emit / $on)適用於 父子、隔代、兄弟組件通訊
這種方法經過一個空的 Vue 實例做爲中央事件總線(事件中心),用它來觸發事件和監聽事件,從而實現任何組件間的通訊,包括父子、隔代、兄弟組件。
(4)$attrs/$listeners適用於 隔代組件通訊
$attrs:包含了父做用域中不被 prop 所識別 (且獲取) 的特性綁定 ( class 和 style 除外 )。當一個組件沒有聲明任何 prop 時,這裏會包含全部父做用域的綁定 ( class 和 style 除外 ),而且能夠經過 v-bind="$attrs" 傳入內部組件。一般配合 inheritAttrs 選項一塊兒使用。
$listeners:包含了父做用域中的 (不含 .native 修飾器的) v-on 事件監聽器。它能夠經過 v-on="$listeners" 傳入內部組件
(5)provide / inject適用於 隔代組件通訊
祖先組件中經過 provider 來提供變量,而後在子孫組件中經過 inject 來注入變量。 provide / inject API 主要解決了跨級組件間的通訊問題,不過它的使用場景,主要是子組件獲取上級組件的狀態,跨級組件間創建了一種主動提供與依賴注入的關係。
(6)Vuex適用於 父子、隔代、兄弟組件通訊
Vuex 是一個專爲 Vue.js 應用程序開發的狀態管理模式。每個 Vuex 應用的核心就是 store(倉庫)。「store」 基本上就是一個容器,它包含着你的應用中大部分的狀態 ( state )。
Vuex 的狀態存儲是響應式的。當 Vue 組件從 store 中讀取狀態的時候,若 store 中的狀態發生變化,那麼相應的組件也會相應地獲得高效更新。
改變 store 中的狀態的惟一途徑就是顯式地提交 (commit) mutation。這樣能夠方便地跟蹤每個狀態的變化。
hash模式:在瀏覽器中符號「#」,#以及#後面的字符稱之爲hash,用window.location.hash讀取;
特色:hash雖然在URL中,但不被包括在HTTP請求中;用來指導瀏覽器動做,對服務端安全無用,hash不會重加載頁面。
hash 模式下,僅 hash 符號以前的內容會被包含在請求中,如 http://www.xxx.com,所以對於後端來講,即便沒有作到對路由的全覆蓋,也不會返回 404 錯誤。
hash 模式的實現原理
早期的前端路由的實現就是基於 location.hash 來實現的。其實現原理很簡單,location.hash 的值就是 URL 中 # 後面的內容。好比下面這個網站,它的 location.hash 的值爲 '#search':
https://www.abc.com#search
hash 路由模式的實現主要是基於下面幾個特性:
URL 中 hash 值只是客戶端的一種狀態,也就是說當向服務器端發出請求時,hash 部分不會被髮送;
hash 值的改變,都會在瀏覽器的訪問歷史中增長一個記錄。所以咱們能經過瀏覽器的回退、前進按鈕控制hash 的切換;
能夠經過 a 標籤,並設置 href 屬性,當用戶點擊這個標籤後,URL 的 hash 值會發生改變;或者使用 JavaScript 來對 loaction.hash 進行賦值,改變 URL 的 hash 值;
咱們可使用 hashchange 事件來監聽 hash 值的變化,從而對頁面進行跳轉(渲染)。
history模式:history採用HTML5的新特性;且提供了兩個新方法:pushState(),replaceState()能夠對瀏覽器歷史記錄棧進行修改,以及popState事件的監聽到狀態變動。
history 模式下,前端的 URL 必須和實際向後端發起請求的 URL 一致,如 http://www.xxx.com/items/id。後端若是缺乏對 /items/id 的路由處理,將返回 404 錯誤。Vue-Router 官網裏如此描述:「不過這種模式要玩好,還須要後臺配置支持……因此呢,你要在服務端增長一個覆蓋全部狀況的候選資源:若是 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。」
history 模式的實現原理
HTML5 提供了 History API 來實現 URL 的變化。其中作最主要的 API 有如下兩個:history.pushState() 和 history.repalceState()。這兩個 API 能夠在不進行刷新的狀況下,操做瀏覽器的歷史紀錄。惟一不一樣的是,前者是新增一個歷史記錄,後者是直接替換當前的歷史記錄,以下所示:
window.history.pushState(null, null, path);
window.history.replaceState(null, null, path);
history 路由模式的實現主要基於存在下面幾個特性:
pushState 和 repalceState 兩個 API 來操做實現 URL 的變化 ;
咱們可使用 popstate 事件來監聽 url 的變化,從而對頁面進行跳轉(渲染);
history.pushState() 或 history.replaceState() 不會觸發 popstate 事件,這時咱們須要手動觸發頁面跳轉(渲染)。
abstract模式 : 支持全部 JavaScript 運行環境,如 Node.js 服務器端。若是發現沒有瀏覽器的 API,路由會自動強制進入這個模式.
vue全家桶包含:vue-cli、vue-router、vuex、vue-Devtool調試工具、UI組件庫;
https://segmentfault.com/a/11...
其餘問題
8.vue中 key 值的做用?答:當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用「就地複用」策略。若是數據項的順序被改變,Vue 將不會移動 DOM 元素來匹配數據項的順序, 而是簡單複用此處每一個元素,而且確保它在特定索引下顯示已被渲染過的每一個元素。key的做用主要是爲了高效的更新虛擬DOM。