Vuex

Vuex常見(jiàn)屬性以及組件中調(diào)用的幾種方法

定義 :vue組件的狀態(tài)管理模式,存放在vuex里的數(shù)據(jù)可以在所有的組件當(dāng)中使用;

vuex的引用

import vuex from 'vuex'


vuex中的核心屬性

  • state: 用來(lái)存放數(shù)據(jù)的屬性.

    state:{
      num : 50, //定義一個(gè)num
      title : 400
    }
    
  • getters:類似組件中的computed屬性,其值受state中的影響,

    getters : {
      //例如寫(xiě)一個(gè)總和的函數(shù)
        //需要傳一個(gè)參數(shù),也就是state
      dbNum(state){
            return state.num * 2
        }
    }
    
  • mutations : 組件如果想要改變vuex中的數(shù)據(jù)時(shí),那么vuex提供的改變數(shù)據(jù)的方法將寫(xiě)在此屬性下 ,這里的方法必須是同步的,異步只能改變視圖的值

mutations:{
    //state為了獲取到數(shù)據(jù);
    //payload即是調(diào)用該方法時(shí)傳的參數(shù),可以是個(gè)對(duì)象
    chanNum(state,payload){
        state.num += payload  //如果傳的參數(shù)是對(duì)象{age:20},payload.age
    }
}
  • actions:用于存儲(chǔ)異步處理數(shù)據(jù)的方法,最常見(jiàn)的就是settimeout(),

    actions : {
          //context是一個(gè)對(duì)象,里面的commit()方法用來(lái)調(diào)用mutations中的方法
        //解構(gòu)  let {commit} = context
        asyncChanNum ({commit},payload) {
            settimeout (() =>{
                //注意這里是調(diào)用mutations中的函數(shù)
                commit("chanNum",payload)
            },5000)
        }
    }
    

vuex的拆分

由于在開(kāi)發(fā)過(guò)程當(dāng)中,要存儲(chǔ)的數(shù)據(jù)很多,所以將其拆分一個(gè)個(gè)小塊

在store中新建一個(gè)vuex對(duì)應(yīng)功能的文件夾以及js文件,例如:/store/add/index.js
  • 在index.js中導(dǎo)出對(duì)象
export default {
    //注意需要一個(gè)命名空間為true,不然在組件中調(diào)用的時(shí)候不能識(shí)別,設(shè)置可讀 
    namespaced:true,
    state : {},
    mutations : {},
    getters:{},
    actions : {},
}
  • store/index.js中引用
import Vue from 'vue'
import Vuex from 'vuex'
import add from "./add"  //idnex.js可以省略,盡量模塊名保持一致
Vue.use(Vuex)
//導(dǎo)出Vuex
export default new Vuex.Store({
    modules : {
        add  //注冊(cè)模塊
    }
})
將vuex模塊進(jìn)一步細(xì)化
  • 同理,將state mutations getters action 單獨(dú)放在相應(yīng)的功能文件夾下面,在index.js中統(tǒng)一導(dǎo)入

    import actions from "./actions";
    import getters from "./getters";
    import mutations from "./mutations";
    import state from "./state";
    export default {
    
      namespaced: true, //設(shè)置可讀  可以在store中把當(dāng)前模塊文件夾名稱(add),當(dāng)作模塊名使用
      state,
      getters,
      mutations,
      actions,
    }
    

vuex的引用

一、普通調(diào)用

注意當(dāng)把vuex一一拆分之后,$store就失去作用了

<template>
    <div>
        <p>{{$store.state.num}}</p>
        <p>
            {{dbNum}}
        </p>
        <button @click="asyncChanNum">  //調(diào)用的函數(shù)名  ,也可以在此處傳參數(shù)
            add
        </button>
    </div>
</template>
export default {
    //vuex中的state和getters要寫(xiě)在computed屬性中
    //$store是一個(gè)對(duì)象,用來(lái)接受vuex中的屬性
    computed:{
        num(){
           return this.$store.state.num
        },
        dbNum(){
         return this.$store.getters.dbNum
        }
    },
    //其余的兩個(gè)屬性在methods中調(diào)用或者直接在標(biāo)簽中使用
    methods:{
        chanNum(){
            //注意mutations中函數(shù)的調(diào)用   commit()
            this.$store.commit("chanNum",{age : 20}) //第一個(gè)是vuex中的方法名,第二個(gè)要傳的實(shí)參
        },
        asyncChanNum(){
            this.$store.dispatch("asyncChanNum",{num:50})
        }
    }
}

二、輔助函數(shù)

  • 在組件中引入模塊

    import { mapState, mapMutations,mapGetters,mapActions } from "vuex";

  1. 展開(kāi)數(shù)組的方式引用

    <template>
     <div>
            {{num}}
        </div>
        <p>
            {{dbNum}}
        </p>
    </template>
    
    export default {
        computed  :{
            // 數(shù)組當(dāng)中寫(xiě)數(shù)據(jù)或者函數(shù)
            ...mapState(["num",]) ,
            ...mapGetters(["dbNum"])
        },
        methods : {
           //數(shù)組中的數(shù)據(jù)可直接使用胡子語(yǔ)法在模板中使用,也可以用this來(lái)調(diào)用
            ...mapMutations(["chanNnm"]),
            ...mapActions(["asyncChanNum"])
        }
    }
    
  2. 展開(kāi)對(duì)象的方式引用

    export default {
        computed:{
            //寫(xiě)成對(duì)象的形式,state中的數(shù)據(jù)有所不同
            ...mapState({
                num : state => state.num,  //當(dāng)vue拆分后,state.路徑.數(shù)據(jù)   當(dāng)時(shí)設(shè)置namespaced:true就是為了在這里起作用
            }),
        },
        methods :{
            ...mapMutations :({
                chanNum : "chanNum" ,//同理若是拆分后就要在前面加上路徑
            })
        }
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Vuex 是什么? Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開(kāi)發(fā)的狀態(tài)管理模式。 vuex 應(yīng)用場(chǎng)景: 頻繁進(jìn)...
    韓girl閱讀 264評(píng)論 0 0
  • 簡(jiǎn)介 Vuex中的輔助函數(shù)可以簡(jiǎn)化我們的操作,讓我們操作Vuex中的數(shù)據(jù)更加的方便。 通過(guò)下面的演示來(lái)展示...
    a91afcace9ee閱讀 687評(píng)論 0 1
  • vuex 基本使用 1. 安裝 vuex 2. 在vue項(xiàng)目下的src目錄下創(chuàng)建一個(gè) store 目錄,并在里面...
    塔木德_lil_47閱讀 259評(píng)論 0 0
  • 安裝 npm npm install vuex --save 在一個(gè)模塊化的打包系統(tǒng)中,您必須顯式地通過(guò)Vue.u...
    蕭玄辭閱讀 3,050評(píng)論 0 7
  • 概念 state:驅(qū)動(dòng)應(yīng)用的數(shù)據(jù)源state由mutations來(lái)更改,當(dāng)computed綁定state時(shí)可以用m...
    passenger_z閱讀 197評(píng)論 0 2

友情鏈接更多精彩內(nèi)容