談?wù)剬?duì)vuex的理解

首先我們先拋出三個(gè)問題
(1)有了vuex我們是不是就不需要組件之間傳參?
(2)vuex和localstorage啥區(qū)別擅编?
(3)vuex里面直接修改state為什么還要有專門的修改方法mutation?
先把3個(gè)問題的答案放出來:
(1)vuex是多個(gè)組件宪郊,共享同一個(gè)數(shù)據(jù)的狀態(tài)管理工具双炕。只是父子之間的數(shù)據(jù)傳遞沒必要使用vuex,小型項(xiàng)目官方都不推薦使用vuex,只會(huì)增加項(xiàng)目的負(fù)擔(dān),大型的項(xiàng)目并且是多個(gè)組件共享的用vuex更好
(2)vuex和localstorage兩者應(yīng)用場(chǎng)景不同。vuex是當(dāng)前vue項(xiàng)目的全局狀態(tài)對(duì)象火欧,存放在內(nèi)存中,一旦當(dāng)前vue項(xiàng)目刷新茎截,vuex的數(shù)據(jù)也將恢復(fù)默認(rèn)值苇侵;而localstorage是存放在瀏覽器中的對(duì)象,即使刷新數(shù)據(jù)也仍然存在企锌。
(3)對(duì)于這個(gè)問題榆浓,在創(chuàng)建 store 的時(shí)候傳入 strict: true, 開啟嚴(yán)格模式,那么任何修改state的操作撕攒,只要不經(jīng)過mutation的函數(shù)陡鹃,vue就會(huì) throw error

const store = new Vuex.Store({
   state,
   strict:true
   //開啟嚴(yán)格模式后,只能通過mutation來改變狀態(tài)(不支持異步)否則會(huì)報(bào)錯(cuò)
})
//下面的開啟嚴(yán)格模式就會(huì)報(bào)錯(cuò)抖坪,不開啟是可行的
  console.log(store.state.count) //0
  store.state.count = 3;
  console.log(store.state.count)  //3

注意:發(fā)布環(huán)境下不要開啟嚴(yán)格模式萍鲸,嚴(yán)格模式會(huì)深度監(jiān)測(cè)狀態(tài)樹來檢測(cè)不合規(guī)的狀態(tài)變化,造成不必要的性能損失
但是真正原因是:
Vuex的state是響應(yīng)式的擦俐,響應(yīng)式就是狀態(tài)改變頁面組件也實(shí)時(shí)更新猿推。但是要實(shí)現(xiàn)響應(yīng)式必須通過提交mutation去改變state,并且還需要遵守一定的規(guī)則

image.png

下面從是什么,為什么蹬叭,怎么用的角度來談對(duì)vuex的理解

【1】vuex是什么

多個(gè)組件,共享状知,同一個(gè)數(shù)據(jù)的狀態(tài)管理工具
vuex適用于大型單頁應(yīng)用秽五,簡(jiǎn)單的應(yīng)用使用 Vuex 可能是繁瑣冗余的

【2】為什么

當(dāng)在開發(fā)大型單頁應(yīng)用時(shí),會(huì)出現(xiàn)多個(gè)視圖組件依賴同一個(gè)狀態(tài)饥悴,來自不同視圖的行為需要變更同一個(gè)狀態(tài)坦喘。如登錄狀態(tài)、加入購(gòu)物車西设、音樂播放等瓣铣。
或許你認(rèn)為可以用傳參的方法解決組件之間互相傳值的問題。但是傳參的方法對(duì)于多層嵌套的組件將會(huì)變得很繁瑣贷揽,并且對(duì)于兄弟組件間的傳遞無能為力棠笑。所以vuex出現(xiàn)了,相當(dāng)于一個(gè)“前端的數(shù)據(jù)庫”禽绪。
Vuex主要用于解決組件之間同一狀態(tài)的共享問題蓖救,它能把組件的共享狀態(tài)抽取出來,當(dāng)做一個(gè)全局單例模式進(jìn)行管理印屁。 這樣不管你在何處改變狀態(tài)循捺,都會(huì)通知使用該狀態(tài)的組件做出相應(yīng)修改。即Vuex采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài) 這里的關(guān)鍵在于集中式存儲(chǔ)管理雄人。 這意味著本來需要共享狀態(tài)的更新是需要組件之間的通訊从橘,而現(xiàn)在有了Vuex,組件就都和store通訊了

【3】怎么用

安裝使用步驟
1.安裝
sudo cnpm install vuex -S
2.引入狀態(tài)管理工具vuex
import vuex from 'vuex'
import store from './vuex/store'
3.main.js里面實(shí)例化
new Vue({
  el: '#app',
  router, :style="{ 'left': leftnum + 'px' }"  
  store,
  components: { App },
  template: '<App/>'
})
4.在src里面和views同級(jí)創(chuàng)建vuex文件里面store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
  // 定義狀態(tài)
  state: {
    //動(dòng)態(tài)路由的數(shù)組
    keepAlive:[],
    //全局域名
    domainName:"",
  }
})
export default store

5.使用:this.$store.state.名字

使用方法核心內(nèi)容

(1)state 存放狀態(tài)
(2)mutations 美[mju??tion] 同步的础钠,唯一更改state的方法是提交 mutation恰力。
(3)getters 加工state成員給外界類似于計(jì)算屬性
(4)actions 異步的,然后提交mutation去操作state
(5)modules 模塊化狀態(tài)管理


image.png
(1)state 存放狀態(tài)
const store = new Vuex.store({
    state:{
        name:'jack'
    },
})
//頁面調(diào)用
this.$store.state
(2)mutations同步的對(duì)state操作的集合珍坊,比如對(duì)該數(shù)據(jù)的修改牺勾、增加、刪除等等阵漏。里面的函數(shù)有兩個(gè)默認(rèn)形參([state] [payload])

state是當(dāng)前VueX對(duì)象中的state
payload是該方法在被調(diào)用時(shí)傳遞參數(shù)使用的

//index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.store({
    state:{
        name:'jack'
    },
    mutations:{
        //es6語法驻民,等同edit:funcion(){...}
        //編輯
        edit(state,payload){
            //(1)直接調(diào)用
            state.name = 'wayne'
            //(2)傳值調(diào)用
            state.name = payload
            //(3)傳值對(duì)象調(diào)用
            state.name = payload.name
        },
        //新增
        myadd(state,payload){
            //新增邏輯
            Vue.set(state,"name1","dawei")
        },
        //刪除  
        mydel(state,payload){
            //刪除邏輯
            Vue.delete(state,"name1")
        },
    }
})
export default store
//頁面通過this.$store.commit調(diào)用
//(1)直接調(diào)用
this.$store.commit('edit')
//(2)傳值調(diào)用
this.$store.commit('edit','wayne')
//(3)傳值對(duì)象調(diào)用
this.$store.commit('edit',{name:'wayne',sex:'男'})
//還可以這么寫
this.$store.commit({
    type:'edit',
    payload:{
        name:'wayne',
        sex:'男'
    }
})
image.png

新增和刪除不能使用xx.xx = xx履怯,delete state.info.age這種原來的模式因?yàn)椴皇琼憫?yīng)式的回还,響應(yīng)式規(guī)定新增和刪除有自己的方法,這樣才能自動(dòng)更新到組件上面去叹洲;
新增用Vue.set(state,"name1","dawei")柠硕,
刪除用Vue.delete(state,"name1")

(3)getters 加工state成員給外界類似于計(jì)算屬性

可以對(duì)state中的成員加工后傳遞給外界,Getters中的方法有兩個(gè)默認(rèn)參數(shù)
state 當(dāng)前VueX對(duì)象中的狀態(tài)對(duì)象
getters 當(dāng)前getters對(duì)象

//index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.store({
    state:{
        name:'jack',
        age:'15'
    },
    mutations:{
        //編輯
        edit(state,payload){
        }
    },
    getters:{
       nameInfo(state){
           return "姓名:"+state.name
       },
       fullInfo(state,getters){
           return getters.nameInfo+'年齡:'+state.age
        }  
  }
})
export default store
// 調(diào)用
this.$store.getters.fullInfo//姓名:jack 年齡:15
(4)actions 專門放置異步操作,然后提交mutation去操作state

注意:Action 提交的是 mutation蝗柔,而不是直接改變state闻葵,只有mutation能改變state。
至于是在頁面組件中等異步操作(如axious請(qǐng)求接口改變state)完成后去commit調(diào)用mutation癣丧;還是直接action去做異步axious槽畔,根據(jù)不同的業(yè)務(wù)場(chǎng)景有不同的選擇,也有不同的好處體現(xiàn)出來胁编。
比如多次遇到的異步(如axious請(qǐng)求接口改變state)那就直接放在action里面厢钧,需要的時(shí)候頁面組件直接使用this.$store.dispatch就可以不用重復(fù)寫axious,所以vuex只是為了更靈活使開發(fā)者多一個(gè)選擇嬉橙,讓代碼盡可能的變動(dòng)優(yōu)雅早直。
Actions中的方法有兩個(gè)默認(rèn)參數(shù)
context 上下文(相當(dāng)于箭頭函數(shù)中的this)對(duì)象
payload 掛載參數(shù)

//index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.store({
    state:{
        name:'jack'
    },
    mutations:{
        //es6語法,等同edit:funcion(){...}
        //編輯
        edit(state,payload){
            //(2)傳值調(diào)用
            state.name = payload
        }
    }市框,
    actions:{
        Edit(context,payload){
            //異步操作
            setTimeout(()=>{
                //提交mutations方法霞扬,修改state
                context.commit('edit',payload)
            },2000)
        }
      }
})
export default store

//在頁面組件中調(diào)用:
this.$store.dispatch('Edit','wayne')
(5)modules 模塊化狀態(tài)管理

當(dāng)項(xiàng)目龐大,狀態(tài)非常多時(shí)拾给,可以采用模塊化管理模式祥得。Vuex 允許我們將 store 分割成模塊(module)。每個(gè)模塊擁有自己的 state蒋得、mutation级及、action、getter额衙、甚至是嵌套子模塊——從上至下進(jìn)行同樣方式的分割饮焦。

const store = new Vuex.Store({
models:{
    a:{
        state:{},
        getters:{},
        ....
    },
     b:{
        state:{},
        getters:{},
        ....
    }窍侧,
}
})
//調(diào)用
this.$store.state.a
//而提交或者dispatch某個(gè)方法和以前一樣,會(huì)自動(dòng)執(zhí)行所有模塊內(nèi)的對(duì)應(yīng)type的方法:
this.$store.commit('editKey')
this.$store.dispatch('aEditKey')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末县踢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伟件,更是在濱河造成了極大的恐慌硼啤,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斧账,死亡現(xiàn)場(chǎng)離奇詭異谴返,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咧织,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嗓袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人习绢,你說我怎么就攤上這事渠抹。” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵梧却,是天一觀的道長(zhǎng)奇颠。 經(jīng)常有香客問我,道長(zhǎng)篮幢,這世上最難降的妖魔是什么大刊? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮三椿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葫辐。我一直安慰自己搜锰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布耿战。 她就那樣靜靜地躺著蛋叼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剂陡。 梳的紋絲不亂的頭發(fā)上狈涮,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音鸭栖,去河邊找鬼歌馍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晕鹊,可吹牛的內(nèi)容都是我干的松却。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼溅话,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晓锻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起飞几,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤砚哆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后屑墨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躁锁,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年绪钥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灿里。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡程腹,死狀恐怖匣吊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤色鸳,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布社痛,位于F島的核電站,受9級(jí)特大地震影響命雀,放射性物質(zhì)發(fā)生泄漏蒜哀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一吏砂、第九天 我趴在偏房一處隱蔽的房頂上張望撵儿。 院中可真熱鬧,春花似錦狐血、人聲如沸淀歇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浪默。三九已至,卻和暖如春缀匕,著一層夾襖步出監(jiān)牢的瞬間纳决,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工乡小, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阔加,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓劲件,卻偏偏與公主長(zhǎng)得像掸哑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子零远,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Vuex五個(gè)概念的簡(jiǎn)單理解牵辣。 1.State 保存共享狀態(tài)信息的地方摔癣。2.Getters 類似我們單個(gè)組件中的計(jì)算...
    似朝朝我心閱讀 862評(píng)論 0 6
  • 為什么需要Vuex 通常 Vue 項(xiàng)目中的數(shù)據(jù)通信,我們通過以下三種方式就可以解決纬向,但是隨著項(xiàng)目多層嵌套的組件增加...
    尤小小閱讀 1,085評(píng)論 1 5
  • vuex是什么 Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式择浊。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件...
    為光pig閱讀 274評(píng)論 0 0
  • 久違的晴天,家長(zhǎng)會(huì)逾条。 家長(zhǎng)大會(huì)開好到教室時(shí)琢岩,離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)师脂。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,527評(píng)論 16 22
  • 今天感恩節(jié)哎担孔,感謝一直在我身邊的親朋好友江锨。感恩相遇!感恩不離不棄糕篇。 中午開了第一次的黨會(huì)啄育,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,571評(píng)論 0 11