這一講咱們最主要的就是學習vue中的數據管理VueX,這個是一個大殺器html
Promise 有幾個比較重要的方法,最重要的仍是有一個叫作all的方法,這個也是很是的強大的vue
假設咱們目前要求,但願能按順序的拿到前後的兩個ajax那麼我應該怎麼處理呢ajax
Promse.all( [ new Promose( ( resolve,rejcet ) => { $.ajax({ url:'xxxx', data:'xxxx', sucess:(res) => { resolve(res) } }) $.ajax({ url:'xxxx', data:'xxxx', sucess:(res) => { resolve(res) } }) }) ]).then( results => { consel.log(results) // 這樣拿到的就是一個數組了, 前後的順序就是裏面的值 } )
注意啊這裏對promise的深刻的解釋說明vuex
這兩個回調回調函數是 在傳入的時候定義的,可是調用是在promse裏調的!這兩個參數是函數!!函數!!回調函數!
Vue官方介紹
絕大多數的管方都很是喜歡用概念來解釋概念,這就有點難搞了,我這個概念的都不懂,你又給我搞另外一個概念
實際上那個Vuex就是一個大管家,統一進行管理,全局的單例模式npm
Vuex實際上就是一個 用來放 一些組件共享的數據的,實際上這多是是下面這些狀況api
登陸
假設咱們目前有50+頁面。咱們都每個頁面都要發送接口請求並且這些請求須要token,那麼若是我是登陸的,我就須要在每個頁面拿到個人登陸token這樣就形成了數據的傳來傳去很是麻煩,若是咱們有一個公共的地方來放這些東西就行了數組
購物車。收藏
也會有這種組件之間打出傳值的狀況發生,那麼我如何管理這些東西呢,這個就是一個問題promise
綜上所述,咱們須要使用Vuex*sass
這裏假設有這樣的一個需求:咱們目前有兩個組件App.vue 還有BMlaoli.vue 我呢,他們之間有層級的關係,app裏面有一個變量叫作contuend 我但願我在app裏面對countend的操做可以動態的傳遞到咱們的BMlaoli裏,並且不使用父子組件傳值,那麼咱們如何作呢?親看下面講演app
App
<template> <div id="app"> <h1> 我是vueapp </h1> </div> </template> <script> export default { name: 'App', components: { } } </script> <style> </style>
BMlaoli
<template> <div> <h1>我是bm界面</h1> </div> </template> <script> export default { } </script> <style lang="sass" scoped> </style>
<template> <div id="app"> <p>{{contuned}}</p> <button @click="contuned ++" >+</button> <button @click="contuned --" >-</button> </div> </template> <script> import bmlao from '@/components/Bmlaoli'; export default { name: 'App', components: { bmlao, }, data() { return { contuned: 100 } }, } </script> <style> </style>
可是問題來了,我目前但願大家在app裏面作的更改能夠反映到個人Bm組件裏,並且不經過父子組件的方式,那麼我該怎麼作呢?實際上很是的簡單
這個時候咱們就須要一個 ‘第三者來處理這個東西’,這個第三者就是這個Vuex。
實際上,若是你有手動的安裝使用配VueRouter的經驗的話。這Vuex也是差很少的都是同樣的使用方法
第一步:npm install vuex
第二步:建立一個文件夾sote裏寫一個index.js
第三部:在index裏面安裝
第四部:在main裏掛載就行了
index.js
import Vue from 'vue' import Vuex from 'vuex' // 安裝 Vue.use(Vuex) // 使用 const store = new Vuex.Store({ state:{}, mutations: { }, actions:{}, getters:{}, modules:{} }) // 倒出 export default store
main.js
import Vue from 'vue' import App from './App.vue' // 導入 import Store from './store' Vue.config.productionTip = false // 掛載 new Vue({ Store, render: h => h(App), }).$mount('#app')
很是的簡單
<template> <div id="app"> <p>{{ $store.state.contuned }}</p> <button @click="$store.state.contuned ++" >+</button> <button @click="$store.state.contuned --" >-</button> <h1>------bmlaoli的界面--------</h1> <bmlao></bmlao> </div> </template> <script> import bmlao from '@/components/Bmlaoli'; export default { name: 'App', components: { bmlao, }, data() { return { // contuned: 100 } }, } </script> <style> </style>
$store.state.contuned
須要很是說的就是 請你不要這樣去修改vuex裏的值,而是經過以下的方式去修改,詳細見官方api說明
概述咱們的更改邏輯
view視圖提交(Dispatch) ----> actions處理異步操做(commit) -----> Muations 記錄你的修改 ,方便之後追蹤(Mutate) -----> state修改(render)
代碼邏輯
/state/index.js
state:{ contuned:1000 }, mutations: { increment(state){ state.contuned++ }, decrement(state){ state.contuned-- }, }, actions:{}, getters:{}, modules:{}
/app.vue
<template> <div id="app"> <p>{{ $store.state.contuned }}</p> <button @click="additon" >+</button> <button @click="subraction" >-</button> <h1>------bmlaoli的界面--------</h1> <bmlao></bmlao> </div> </template> <script> import bmlao from '@/components/Bmlaoli'; export default { name: 'App', components: { bmlao, }, data() { return { // contuned: 100 } }, methods: { additon() { this.$store.commit('increment') }, subraction() { this.$store.commit('decrement') }, }, } </script> <style> </style>
這樣咱們就能開發者工具追綜這些東西的變化了
vueX中有五個核心
這個東西相似於計算屬性
有時候咱們須要從 store 中的 state 中派生出一些狀態,例如對列表進行過濾並計數:
高階函數 ,返回函數的調用
固然了,你這樣也是能夠的
<h2>{{ $store.state.contuned * $store.state.contuned }}</h2>
可是很low 是不啦,若是你要寫不少不少的複雜邏輯操做,那不就涼涼了嗎,因此這裏引伸出咱們的getter,字面理解就是獲取的時候,對數據作一些手腳,那麼咱們看看如何使用
在getter裏面搞事情
store/index.js
import Vue from 'vue' import Vuex from 'vuex' // 安裝 Vue.use(Vuex) // 使用 const store = new Vuex.Store({ state:{ contuned:1000 }, mutations: { increment(state){ state.contuned++ }, decrement(state){ state.contuned-- }, }, actions:{}, getters:{ powerCounter(state){ return state.contuned * state.contuned } }, modules:{} }) // 倒出 export default store
使用的時候就很是簡單了
/bmlaoli.vue
<h2>{{ $store.getters.powerCounter }}</h2>
如今咱們又有了另外一個需求,若是我想傳遞參數,怎麼辦,我但願我過濾出一些數據,並且咱們但願咱們是指定條件的過濾
這裏就涉及到咱們的傳遞參數的問題了
store/index.js
fliter(state,getters){ console.log(getters)//這裏的getters實際上就是你的整個外面的getters對象 // 若是你要傳遞參數,你只能返回函數的調用 return age => { state.students.filter( s => s.age >= age ) } }
/bmlaoli.vue
原數據 <h2>{{ $store.getters.students }}</h2> 過濾以後 <h2>{{ $store.getters.fliter(40) }}</h2>
vuex惟一更新狀態的方式,就是在這裏,若是你要更改數據,vuex惟一的更改方式就是 mutation
事件類型(函數名)
回調函數(回調函數,具體的業務代碼)
mutations: { // increment 事件類型 // (state){ 回調函數 // state.contuned++ // }, increment(state){ state.contuned++ }, decrement(state){ state.contuned-- }, },
需求:咱們但願點擊更改狀態的時候的時候可傳入參數
/sotre/index.js
mutations: { increment(state){ state.contuned++ }, decrement(state){ state.contuned-- }, incrementCour(state,palyload){ consle.log(palyload)//拿到了一個傳遞過來的對象 } },
bmlaoliu.vue3
addcCount(parmas){ this.$sore.commit( 'incrementCour' ,palyload) }