前言javascript
最近在整理Vue的一些內容,包括Vue 3.0新特性,Vue 2.0的一些特性以及實現方法,還有Vue全家桶的內容,涉及到的內容較多因此找個機會發篇文章,把要點所有講出來.綜合整理下這樣看着也舒服,好了廢話很少說開始開始.php
正文html
簡述:更完備、更精準、更高效,能夠對響應式跟蹤進行調試,新增了一個建立可觀察對象(observable)的 API。前端
3.0 版本里將有一個基於 Proxy 的觀察者,它會提供全語言覆蓋的響應式跟蹤。相比於 2.x 版本里基於 Object.defineProperty 的觀察者,新的實現更增強大:vue
上面正文中提到的Proxy算是此次Vue 3.0 最大的亮點,它不只取代了Vue 2.0 的 Object.defineProperty 方法而且組建生成增快 100%還有就是快一倍 / 減小通常的內存使用java
下面看一個最簡單的Proxy實現方法:webpack
let obj = {
a : 1
}
let proxyObj = new Proxy(obj,{
get : function (target,prop) {
return prop in target ? target[prop] : 0
},
set : function (target,prop,value) {
target[prop] = 888;
}
})
console.log(proxyObj.a); // 1
console.log(proxyObj.b); // 0
proxyObj.a = 666;
console.log(proxyObj.a) // 888
複製代碼
上述例子中,咱們事先定義了一個對象 obj , 經過 Proxy 構造器生成了一個 proxyObj 對象,並對其的 set(寫入) 和 get (讀取) 行爲從新作了修改。ios
當咱們訪問對象內本來存在的屬性時,會返回原有屬性內對應的值,若是試圖訪問一個不存在的屬性時,會返回0 ,即咱們訪問 proxyObj.a 時,本來對象中有 a 屬性,所以會返回 1 ,當咱們試圖訪問對象中不存在的 b 屬性時,不會再返回 undefined ,而是返回了 0 ,當咱們試圖去設置新的屬性值的時候,老是會返回 888 ,所以,即使咱們對 proxyObj.a 賦值爲 666 ,可是並不會生效,依舊會返回 888!git
想要了解更多Proxy就去這裏看看阮一峯大大的ECMAScript 6 入門: es6.ruanyifeng.com/#docs/proxyes6
新的觀察者還有如下特色:
很容易知道爲何一個組件會從新渲染
簡述:體積更小、速度更快,支持 tree-shaking,支持 fragment 和 portal,支持自定義 render。
體積更小。新的代碼庫在設計的時候就考慮了 tree-shaking。內置的組件(如 )和內置的指令(v-model)是按需引入的,支持 tree-shaking。新的運行時最小體積將低於 10kb(gzip以後)。除此以外,因爲不少特性是支持 tree-shaking 的,因此咱們能夠提供更多的內置特性,若是你不想用這些特性,你的代碼體積徹底不會增長。另外在這裏說一嘴,Vue 2.0 體積是Vue 3.0 的一倍
速度更快,包括虛擬 DOM 的掛載和更新、組件實例的初始化和觀察者的建立。3.0 版本將讓你的應用啓動時間減小一半。
支持 fragment 和 portal。雖然體積變小了,可是 3.0 版本仍是帶來了新功能,那就是支持 Fragment(一個組件包含多個根節點)和 Portal(在 DOM 中渲染一個 subtree,而不須要在一個組件中)。
插槽機制加強。全部由編譯產生的插槽如今都是函數,這些函數會在子組件的 render 調用時被調用。這樣一來,插槽中的依賴會被認爲是子組件的依賴而不是父組件的依賴。這意味着:一、當插槽內容變化時,只有子組件從新渲染;二、當父組件從新渲染時,若是插槽內容沒有變化,子組件就不須要從新渲染。這個特性提供了更精確的組件樹層面上的變動檢測,因此會減小不少無用的渲染。
自定義 render。咱們會提供一個 API 用來建立自定義的 render,所以你不須要爲了自定義一些功能而 fork Vue 的代碼。這個特性給 Weex 和 NativeScript Vue 這樣的項目提供了不少便利。
簡述:編譯出的內容對 tree-shaking 友好,更多 AOT 優化,更好的錯誤提示,對 source map 的支持更好。
爲了輸出對 tree-shaking 友好的代碼,模板中若是用到了一些可選特性,那麼生成的代碼中將使用 ES 模塊語法來 import 這些特性。所以沒有用到的可選特性就不會出如今最終代碼中。
因爲對虛擬 DOM 進行了優化,因此有了更高效的編譯時優化,好比靜態樹提高、靜態屬性提高、爲運行時添加編譯提示信息以減小子節點正常化(children normalization),VNode 建立的快速路徑等。
重寫解析器(parser),以在模板編譯錯誤提示中添加位置信息。這也會使得 Vue 支持模板的 source map。新的解析器能夠提供給第三方工具使用,好比 eslint-plugin-vue 和 IDE。
1. 默認進行懶觀察(lazy observation)。在 2.x 版本里,不過數據多大,都會在一開始就爲其建立觀察者。當數據很大時,這可能會在頁面載入時形成明顯的性能壓力。3.x 版本,只會對「被用於渲染初始可見部分的數據」建立觀察者,並且 3.x 的觀察者更高效。
2. 更精準的變動通知。比例來講:2.x 版本中,你使用 Vue.set 來給對象新增一個屬性時,這個對象的全部 watcher 都會從新運行;3.x 版本中,只有依賴那個屬性的 watcher 纔會從新運行。
暫時來說,Vue 3.0 和 Vue 2.0 中間雖然api沒有什麼特別大的變化,可是相對於原理而言Vue 3.0 使用了TypeScript進行重構以後各方面的性能提高都有了一個重大突破(相對於2.0來講),另外這個工做已近從2.6版本漸漸開始了,雖然提高效果不是很明顯,可是我相信Vue3.0能給咱們帶來更大的驚喜.
首先咱們先得了解什麼事MVVM框架,它又和普通的框架有什麼區別(Jquery):
mvvm 是 model + view + viewmodel 框架,經過 viewmodel 鏈接數據模型model 和 view
Vue是以數據爲驅動的,Vue自身將DOM和數據進行綁定,一旦建立綁定,DOM和數據將保持同步,每當數據發生變化,DOM會跟着變化。
ViewModel是Vue的核心,它是Vue的一個實例。Vue實例時做用域某個HTML元素上的,這個HTML元素能夠是body,也能夠是某個id所指代的元素。
DOM Listeners和Data Bindings是實現雙向綁定的關鍵。DOM Listeners監聽頁面全部View層DOM元素的變化,當發生變化,Model層的數據隨之變化;Data Bindings監聽Model層的數據,當數據發生變化,View層的DOM元素隨之變化。
區別:vue 是數據驅動,經過數據來顯示視圖層而不是節點操用
既然知道其中的區別就讓咱們看看vue雙向綁定的原理是什麼,簡單用一句話歸納就是:
vue.js 是採用數據劫持結合發佈者-訂閱者模式的方式,經過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變更時發佈消息給訂閱者,觸發相應的監聽回調。
js實現簡單的雙向綁定
<body>
<div id="app">
<input type="text" id="txt">
<p id="show"></p>
</div>
</body>
<script type="text/javascript">
var obj = {}
Object.defineProperty(obj, 'txt', {
get: function () {
return obj
},
set: function (newValue) {
document.getElementById('txt').value = newValue
document.getElementById('show').innerHTML = newValue
}
})
document.addEventListener('keyup', function (e) {
obj.txt = e.target.value
})
</script>
複製代碼
既然講了原理咱們就不得不談談Vue的特點生命週期:
首先總共分爲8個階段建立前/後,載入前/後,更新前/後,銷燬前/後,下面就看看官方講解:
建立前/後:
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(銷燬後) 在實例銷燬以後調用。調用後,全部的事件監聽器會被移除,全部的子實例也會被銷燬。該鉤子在服務器端渲染期間不被調用。
總結來說什麼事vue的生命週期:
Vue 實例從建立到銷燬的過程,就是生命週期。從開始建立、初始化數據、編譯模板、掛載Dom→渲染、更新→渲染、銷燬等一系列過程,稱之爲 Vue 的生命週期。另外呢這裏再跟你們嘮嘮生命週期在第一次頁面加載的時候會觸發 beforeCreate, created, beforeMount, mounted 這幾個鉤子,而且DOM 渲染在 mounted 中就已經完成了,這樣你們是否是更好理解一些呢
生命週期鉤子的一些使用方法: beforecreate : 能夠在這加個loading事件,在加載實例時觸發 created : 初始化完成時的事件寫在這裏,如在這結束loading事件,異步請求也適宜在這裏調用 mounted : 掛載元素,獲取到DOM節點 updated : 若是對數據統一處理,在這裏寫上相應函數 beforeDestroy : 能夠作一個確認中止事件的確認框 nextTick : 更新數據後當即操做domarguments是一個僞數組,沒有遍歷接口,不能遍歷。
Vue分爲內部指定指令和自定義指令.
簡單來說vue內部指令有這些v-for 、 v-if 、v-bind、v-on、v-show、v-else不是很全面可是用的最多的就是這些了.
而後包括修飾符.prevent: 提交事件再也不重載頁面;.stop: 阻止單擊事件冒泡;.self: 當事件發生在該元素自己而不是子元素的時候會觸發;.capture: 事件偵聽,事件發生的時候會調用這些也會在項目中常常用到.
另外呢v-on能夠綁定多個事件還有就是v-show指令,v-if的區別在於:
條件渲染指令,與v-if不一樣的是,不管v-show的值爲true或false,元素都會存在於HTML代碼中;而只有當v-if的值爲true,元素纔會存在於HTML代碼中。v-show指令只是設置了元素CSS的style值
v-bind算是雙向綁定時會用到,另外v-for在循環加載列表時會使用,另外多說一嘴v-for有一個key的值,它的做用以下:
當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用「就地複用」策略。若是數據項的順序被改變,Vue 將不會移動 DOM 元素來匹配數據項的順序, 而是簡單複用此處每一個元素,而且確保它在特定索引下顯示已被渲染過的每一個元素。key的做用主要是爲了高效的更新虛擬DOM。
修飾符就很少作解釋,你們能夠去看看官網的解釋:
vue官網:
vue中文官網
全局定義指令:在vue對象的directive方法裏面有兩個參數,一個是指令名稱,另一個是函數。組件內定義指令:directives
鉤子函數:bind(綁定事件觸發)、inserted(節點插入的時候觸發)、update(組件內相關更新)
鉤子函數參數:el、binding
在模板中放入太多的邏輯會讓模板太重且難以維護,在須要對數據進行復雜處理,且可能屢次使用的狀況下,儘可能採起計算屬性的方式。好處:①使得數據處理結構清晰;②依賴於數據,數據更新,處理結果自動更新;③計算屬性內部this指向vm實例;④在template調用時,直接寫計算屬性名便可;⑤經常使用的是getter方法,獲取數據,也可使用set方法改變數據;⑥相較於methods,無論依賴的數據變不變,methods都會從新計算,可是依賴數據不變的時候computed從緩存中獲取,不會從新計算。下面是計算屬性基礎的例子:
<div id="app">
<input v-model = "lastName" >
<input v-model = "firstName" >
{{ quanming }}
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
firstName: '健',
lastName: '吳'
},
computed: {
quanming:{
get:function(){
return this.lastName + this.firstName
}
}
}
});
</script>
複製代碼
而vue中的watch是一個比較重要的概念,經過他咱們能夠檢測data的變化,下面是一個簡單的例子:
<div id="app">
<input v-model = "lastName" >
<input v-model = "firstName" >
{{ fullName }}
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
firstName: '健',
lastName: '吳',
fullName: '吳健'
},
watch: {
firstName: function (val) {
this.fullName = this.lastName + val
},
lastName: function (val) {
this.fullName = val + this.firstName
}
}
});
</script>
複製代碼
另外呢watch屬性是咱們經常使用的因此我就具體講講它的的高級用法--監聽對象的屬性變化:
1.監聽對象須要深度監聽 ,以下代碼能夠監聽整個msg對象的變化
watch: {
  msg: {
    handler(newValue, oldValue) {
      console.log(newValue)
    },
    deep: true
  }
}
複製代碼
2.監聽對象裏面某個屬性的變化,經過computed作中間層實現
computed: {
 channel() {
   return this.msg.channel
 }
},
watch:{
channel(newValue, oldValue) {
    console.log('new: %s, old: %s', newval, oldVal)
    //這裏面能夠執行一旦監聽的值發生變化你想作的操做
  }
}
複製代碼
vue中有兩個比較重要的概念一個是數據驅動上面咱們有講到過,一個就是組件機制,接下來就詳細介紹下Vue的組件
1.採用ES6的import ... from ...語法或CommonJS的require()方法引入組件
2.對組件進行註冊,代碼以下注冊:
Vue.component('my-component', {
template: '
3.使用組件
下面貼個小例子:
Vue.component('componentName',{
/*component*/
});
// 這裏注意一點,組件要先註冊再使用
Vue.component('mine',{
template:'#mineTpl',
props:['name','title','city','content']
});
var v=new Vue({
el:'#vueInstance',
data:{
name:'zhang',
title:'this is title',
city:'Beijing',
content:'these are some desc about Blog'
}
});
複製代碼
將當前組件的< style >修改成< style scoped >
< keep-alive >< /keep-alive > 包裹動態組件時,會緩存不活動的組件實例,主要用於保留組件狀態或避免從新渲染。
大白話: 好比有一個列表和一個詳情,那麼用戶就會常常執行打開詳情=>返回列表=>打開詳情…這樣的話列表和詳情都是一個頻率很高的頁面,那麼就能夠對列表組件使用進行緩存.
這樣用戶每次返回列表的時候,都能從緩存中快速渲染,而不是從新渲染
首先,組件能夠提高整個項目的開發效率。可以把頁面抽象成多個相對獨立的模塊,解決了咱們傳統項目開發:效率低、難維護、複用性等問題。
而後,使用Vue.extend方法建立一個組件,而後使用Vue.component方法註冊組件。子組件須要數據,能夠在props中接受定義。而子組件修改好數據後,想把數據傳遞給父組件。能夠採用emit方法。
父組件與子組件傳值:Props
子組件向父組件傳遞數據: 子組件經過$emit方法傳遞參數,觸發父組件event
這個能夠去看看我以前寫的關於Bus通信的文章:
Vue eventbus 使用中的重複觸發解決方案及存在的Bug
另外呢關於vuex通訊咱們放在下面講解
組件基本上算是全面歸納了一下,另外呢Vue和其餘兩大框架Angular以及React有什麼區別呢,咱們接下來就來說講.
相同點:
都支持指令:內置指令和自定義指令。
都支持過濾器:內置過濾器和自定義過濾器。
都支持雙向數據綁定。
都不支持低端瀏覽器。
不一樣點:
1.AngularJS的學習成本高,好比增長了Dependency Injection特性,而Vue.js自己提供的API都比較簡單、直觀。
2.在性能上,AngularJS依賴對數據作髒檢查,因此Watcher越多越慢。 Vue.js使用基於依賴追蹤的觀察而且使用異步隊列更新。全部的數據都是獨立觸發的。 對於龐大的應用來講,這個優化差別仍是比較明顯的。
在angular中你沒法判斷你的數據是否作了更改,因此它設置了一些條件,當你觸發這些條件以後,它就執行一個檢測來遍歷全部的數據,對比你更改的地方,而後執行變化。
這個檢查很不科學。並且效率不高,有不少多餘的地方,因此官方稱爲 髒檢查。
相同點:
React採用特殊的JSX語法,Vue.js在組件開發中也推崇編寫.vue特殊文件格式,對文件內容都有一些約定,二者都須要編譯後使用。
中心思想相同:一切都是組件,組件實例之間能夠嵌套。
都提供合理的鉤子函數,可讓開發者定製化地去處理需求。
都不內置列數AJAX,Route等功能到核心包,而是以插件的方式加載。
在組件開發中都支持mixins的特性。
不一樣點:
React依賴Virtual DOM,而Vue.js使用的是DOM模板。React採用的Virtual DOM會對渲染出來的結果作髒檢查。
Vue.js在模板中提供了指令,過濾器等,能夠很是方便,快捷地操做DOM。
在開發過程當中,咱們須要保證某個元素的 key 在其同級元素中具備惟一性。在 Diff 算法中 會藉助元素的 Key 值來判斷該元素是新近建立的仍是被移動而來的元素,從而減小沒必要要的元素重渲染。
在瀏覽器中符號「#」,#以及#後面的字符稱之爲hash,用window.location.hash讀取;
特色:hash雖然在URL中,但不被包括在HTTP請求中;用來指導瀏覽器動做,對服務端安全無用,hash不會重加載頁面。 hash 模式下,僅 hash 符號以前的內容會被包含在請求中,如 http://www.xxx.com,所以對於後端來講,即便沒有作到對路由的全覆蓋,也不會返回 404 錯誤。
history採用HTML5的新特性;且提供了兩個新方法:pushState(),replaceState()能夠對瀏覽器歷史記錄棧進行修改,以及popState事件的監聽到狀態變動。
history 模式下,前端的 URL 必須和實際向後端發起請求的 URL 一致,如 http://www.xxx.com/items/id。後端若是缺乏對 /items/id 的路由處理,將返回 404 錯誤。Vue-Router 官網裏如此描述:「不過這種模式要玩好,還須要後臺配置支持……因此呢,你要在服務端增長一個覆蓋全部狀況的候選資源:若是 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。」
首頁能夠控制導航跳轉,beforeEach,afterEach等,通常用於頁面title的修改。一些須要登陸才能調整頁面的重定向功能。
beforeEach主要有3個參數to,from,next:
to:route即將進入的目標路由對象,
from:route當前導航正要離開的路由
next:function必定要調用該方法resolve這個鉤子。執行效果依賴next方法的調用參數。能夠控制網頁的跳轉。
優勢:Vue 的目標是經過儘量簡單的 API 實現響應的數據綁定和組合的視圖組件,核心是一個響應的數據綁定系統。MVVM、數據驅動、組件化、輕量、簡潔、高效、快速、模塊友好。
缺點:不支持低版本的瀏覽器,最低只支持到IE9;不利於SEO的優化(若是要支持SEO,建議經過服務端來進行渲染組件);第一次加載首頁耗時相對長一些;不可使用瀏覽器的導航按鈕須要自行實現前進、後退。
首先須要在命令行中進入到項目目錄,而後輸入:
vue init webpack Vue-Project
複製代碼
其中 webpack 是模板名稱,能夠到 vue.js 的 GitHub 上查看更多的模板github.com/vuejs-templ…
Vue-Project 是自定義的項目名稱,命令執行以後,會在當前目錄生成一個以該名稱命名的項目文件夾
配置完成後,能夠看到目錄下多出了一個項目文件夾,裏面就是 vue-cli 建立的一個基於 webpack 的 vue.js 項目
而後進入項目目錄(cd Vue-Project),使用 cnpm 安裝依賴
cnpm install
複製代碼
而後啓動項目
npm run dev
複製代碼
打包上線
npm run build
複製代碼
這裏就不詳細介紹Vue-Cli原理了,貼一篇文章這篇文章講原理講的仍是比較細緻的,Vue-Cli原理在以後的文章裏我會單獨拎出來跟你們詳細講解的,下面是文章地址
請求後臺資源的模塊。npm install axios -S裝好,而後發送的是跨域,需在配置文件中config/index.js進行設置。後臺若是是Tp5則定義一個資源路由。js中使用import進來,而後.get或.post。返回在.then函數中若是成功,失敗則是在.catch函數中
1.GET 請求
// 爲給定 ID 的 user 建立請求
axios.get('/user?ID=12345')
.then(response=>{
console.log(response);
})
.catch(function (error) {
console.log(error);
});
//換個姿式實現
axios.get('/user', {
params: { //區別: get是用params傳值
ID: 12345
}
})
.then(response=>{
console.log(response);
})
.catch(function (error) {
console.log(error);
});
複製代碼
2.POST 請求
axios.post('/user', { // post是用對象傳值
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(response=>{
console.log(response);
})
.catch(function (error) {
console.log(error);
});
複製代碼
3.執行多個併發請求
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) { //兩個參數分別表明返回的結果
// 當這兩個請求都完成的時候會觸發這個函數
}));
複製代碼
請求方法-別名列表
axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])
併發
axios.all(iterable)//iterable是一個能夠迭代的參數如數組等
axios.spread(callback)//callback要等到全部請求都完成纔會執行
首先在主入口文件main.js中引用:
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios,axios);
複製代碼
以後就可使用了,在組件文件中的methods裏去使用了:
getNewsList(){
this.axios.get('api/getNewsList').then((response)=>{
this.newsList=response.data.data;
}).catch((response)=>{
console.log(response);
})
}
複製代碼
這裏一樣以後我會專門出一篇文章來寫axios的.
vuex分別有五種屬性分別是 State、 Getter、Mutation 、Action、 Module
state爲單一狀態樹,在state中須要定義咱們所須要管理的數組、對象、字符串等等,只有在這裏定義了,在vue.js的組件中才能獲取你定義的這個對象的狀態。
getter有點相似vue.js的計算屬性,當咱們須要從store的state中派生出一些狀態,那麼咱們就須要使用getter,getter會接收state做爲第一個參數,並且getter的返回值會根據它的依賴被緩存起來,只有getter中的依賴值(state中的某個須要派生狀態的值)發生改變的時候纔會被從新計算。
更改store中state狀態的惟一方法就是提交mutation,就很相似事件。每一個mutation都有一個字符串類型的事件類型和一個回調函數,咱們須要改變state的值就要在回調函數中改變。咱們要執行這個回調函數,那麼咱們須要執行一個相應的調用方法:store.commit。
action能夠提交mutation,在action中能夠執行store.commit,並且action中能夠有任何的異步操做。在頁面中若是咱們要嗲用這個action,則須要執行store.dispatch
module其實只是解決了當state中很複雜臃腫的時候,module能夠將store分割成模塊,每一個模塊中擁有本身的state、mutation、action和getter。
1、Vuex就是一個倉庫,倉庫裏面放了不少對象。其中state就是數據源存放地,對應於與通常Vue對象裏面的data
2、state裏面存放的數據是響應式的,Vue組件從store中讀取數據,如果store中的數據發生改變,依賴這個數據的組件也會發生更新
3、它經過mapState把全局的 state 和 getters 映射到當前組件的 computed 計算屬性中
1、getters 能夠對State進行計算操做,它就是Store的計算屬性
2、 雖然在組件內也能夠作計算屬性,可是getters 能夠在多組件之間複用
3、 若是一個狀態只在一個組件內使用,是能夠不用getters
1、Action 相似於 mutation,不一樣在於:
2、Action 提交的是 mutation,而不是直接變動狀態。
3、Action 能夠包含任意異步操做
vuex能夠理解爲一種開發模式或框架。好比PHP有thinkphp,java有spring等。經過狀態(數據源)集中管理驅動組件的變化(比如spring的IOC容器對bean進行集中管理)。
應用級的狀態集中放在store中; 改變狀態的方式是提交mutations,這是個同步的事物; 異步邏輯應該封裝在action中。
實戰內容我在以前有寫過文章介紹過,這裏貼一個地址歡迎你們去看:
導航鉤子有:
a/全局鉤子和組件內獨享的鉤子。b/beforeRouteEnter、afterEnter、beforeRouterUpdate、beforeRouteLeave
參數:
有to(去的那個路由)、from(離開的路由)、next(必定要用這個函數才能去到下一個路由,若是不用就攔截)最經常使用就這幾種
在router目錄下的index.js文件中,對path屬性加上/:id。
使用router對象的params.id。
在實際項目中咱們會碰到多層嵌套的組件組合而成,可是咱們如何實現嵌套路由呢?所以咱們須要在 VueRouter 的參數中使用 children 配置,這樣就能夠很好的實現路由嵌套。 index.html,只有一個路由出口
<div id="app">
<!-- router-view 路由出口, 路由匹配到的組件將渲染在這裏 -->
<router-view></router-view>
</div>
複製代碼
main.js,路由的重定向,就會在頁面一加載的時候,就會將home組件顯示出來,由於重定向指向了home組件,redirect的指向與path的必須一致。children裏面是子路由,固然子路由裏面還能夠繼續嵌套子路由。
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
//引入兩個組件
import home from "./home.vue"
import game from "./game.vue"
//定義路由
const routes = [
{ path: "/", redirect: "/home" },//重定向,指向了home組件
{
path: "/home", component: home,
children: [
{ path: "/home/game", component: game }
]
}
]
//建立路由實例
const router = new VueRouter({routes})
new Vue({
el: '#app',
data: {
},
methods: {
},
router
})
複製代碼
home.vue,點擊顯示就會將子路由顯示在出來,子路由的出口必須在父路由裏面,不然子路由沒法顯示。
<template>
<div>
<h3>首頁</h3>
<router-link to="/home/game">
<button>顯示<tton>
</router-link>
<router-view></router-view>
</div>
</template>
複製代碼
game.vue
<template>
<h3>遊戲</h3>
</template>
複製代碼
全局導航鉤子
router.beforeEach(to, from, next),
router.beforeResolve(to, from, next),
router.afterEach(to, from ,next)
組件內鉤子
beforeRouteEnter,
beforeRouteUpdate,
beforeRouteLeave
單獨路由獨享組件
beforeEnter
vue用來寫路由一個插件。router-link、router-view
仍是和上面同樣推薦我寫的文章:
總結
你們能看到這裏仍是很是感謝的,畢竟能看我嘮了這麼久的同志,也是對個人這篇文章的承認吧,另外不建議的話給個贊加個關注,仍是謝謝了,畢竟新人創做不易,光是打字都用了一天,因此仍是指望各位大大們的關注,點評和點贊,若是有轉發就更好了.
另外呢我寫的有什麼不到位的地方還望各位大神在評論區批評指正,感謝.
最後透露一點,下次的文章和算法之類有關,敬請期待,另外文章每一週到兩週時間更新一篇,還望見諒,最近比較忙只能隔週更新,以後時間充裕的話會每週更新的,謝謝.