vuex基礎(chǔ)使用大全

vuex是什么

vuex是一個狀態(tài)管理工具,在使用vue寫代碼的時候能幫助我們更好的管理數(shù)據(jù)

vuex

  • 當(dāng)我們需要對數(shù)據(jù)進行更好的統(tǒng)一的管理的時候
  • 就需要用到vuex
    • 安裝vuex指令:npm i vuex -S
    • 創(chuàng)建一個store文件夾,在下面創(chuàng)建一個index.js文件
    • 引入vue和vuex
    • store用來統(tǒng)一管理數(shù)據(jù)
    • 在組件中我們可以使用$store.state.username訪問到下面?zhèn)}庫中聲明定義的username屬性
//引入vue和vuex
import Vue from 'vue'
import Vuex from 'vuex'
//插件使用
Vue.use(Vuex);

// 創(chuàng)建vue項目管理狀態(tài)的倉庫
const store = new Vuex.Store({
  // 提供倉庫管理的狀態(tài)
  state: {
    username: 'zhangsan'
  }

});
//導(dǎo)出倉庫
export default store;

vue中的mutation

  • 在vue中,不推薦在倉庫外部對state直接進行修改
  • 推薦使用提交mutation從而修改state
  • 使用下面兩種方法進行修改數(shù)據(jù)修改
  • 當(dāng)我們在組件中直接修改state中數(shù)據(jù),也是可以修改的,但是這樣會讓數(shù)據(jù)變得變得不可控,我們需要阻止啟動生產(chǎn)消息,當(dāng)我們在組件中修改state中數(shù)據(jù)中報出警告提示
  • 我們把mutation作為修改state的唯一方式
//在main.js中輸入這一行語句后,如果組件中直接修改state,vue可以給我報出警告提示
Vue.config.productionTip = false
//使用mutation修改state方法
//方法一:使用一個數(shù)組
this.$store.commit('modifyUsername', 'lisi')
//方法二:使用一個對象
    this.$store.commit({
        // type不能省略
        type: 'modifyUsername',
        value: 'lisi'
     })

vue中的action

  • 對倉庫數(shù)據(jù)進行修改前,有異步操作,就使用actions
  • 我們組件中調(diào)起action操作,在action中執(zhí)行異步操作,然后調(diào)起mutation,依舊使用mutation修改state
  • 示例
//在組件中調(diào)起action
// 調(diào)用actions
// 調(diào)用action方法一,使用一個數(shù)組
// this.$store.dispatch('modifyUsernameAction', 'lisi');
// 調(diào)用action方法二,使用一個對象
this.$store.dispatch({
type: 'modifyUsernameAction',
value: 'lisi'
})
//在倉庫中使用action調(diào)用mutation
 actions: {
    // 方法名字是自定義的
    modifyUsernameAction(context, payload){
      console.log('modifyUsernameAction執(zhí)行了。。虱歪。。栅表。');
      setTimeout(() => {
        context.commit({
          type: 'modifyUsername',
          value: payload.value
        });
      }, 2000);
    }
  }
//mutation被調(diào)用修改state
mutations: {
    // 方法名字自定義
    modifyUsername(state, payload){
      console.log('modifyUsername調(diào)用了笋鄙。。怪瓶。萧落。');
      state.username = payload.value;
    }
  }

過濾器

  • 過濾器可以將數(shù)據(jù)在dom中的展示變成我們需要的樣子,而不改變變量本身的內(nèi)容
  • 因此我們可以方便的計算和展示

全局過濾器

  • 我們在main.js中聲明全局過濾器
  • 聲明一個名為upppercase的過濾器,將字母轉(zhuǎn)化為大寫
//這是在main.js中聲明的一個全局過濾器
Vue.filter("uppercase", (value, ...rest) => {
  console.log("uppercase過濾器執(zhí)行了。洗贰。找岖。。");
  console.log(rest);
  return value.toUpperCase();
});
  • 當(dāng)我們使用時,使用如下方式
//這樣子message代表的字符串就會以uppercase返回后的數(shù)據(jù)方式展示在dom元素上,而message不被改變
<template>
<h1>{{ message | uppercase }}</h1>
</template>

局部過濾器

  • 局部過濾器我們在組件的script中創(chuàng)建
export default {
  // 局部過濾器
  filters: {
    currency(value, num) {
      return "$" + (value / 6.6999).toFixed(num);
    },
  },
  data(){
      return{}
  }
}

vuex中的計算屬性getters

  • 類似組件中的計算屬性,
  • 在組件中我們用this.$store.getters.recommendCount來訪問
  • 示例:
const store = new Vuex.Store({
    state: {
        banner: [],
        list: []
     },

  // 計算屬性
  // 返回 list的長度和奇偶
    getters: {
        recommendCount(state, getters){
          return state.list.length;
        },
        type(state, getters){
          return getters.recommendCount % 2 === 1 ? 'odd' : 'even';
        }
      },
    })

vuex中的mapState

  • mapState可以將全局state中的屬性轉(zhuǎn)化成組件的計算屬性
  computed: {
    // 內(nèi)部的計算屬性
    ab() {
      return this.a + this.b;
    },
    //.......其他內(nèi)部計算屬性都可以在這寫
    // 全局的屬性轉(zhuǎn)為組件的計算屬性
    ...mapState({
      bannerData: (state) => state.banner,
      listData: (state) => state.list,
      count: (state) => state.list.length,
    })
  },

vuex中的mapGetters

  • mapGetters可以將全局中的計算計算屬性(getters)中的屬性轉(zhuǎn)化為組件的計算屬性
  computed: {
    // 內(nèi)部的計算屬性
    ab() {
      return this.a + this.b;
    },
    //.......其他內(nèi)部計算屬性都可以在這寫
    // 全局的屬性轉(zhuǎn)為組件的計算屬性
    ...mapState({
      bannerData: (state) => state.banner,
      listData: (state) => state.list,
      count: (state) => state.list.length,
    }),
    
    
    // 全局的計算屬性轉(zhuǎn)為組件的計算屬性
    // 方式1:
    // ...mapGetters(['recommendCount', 'type']),
    // 方式2:
    ...mapGetters({
      count: 'recommendCount',
      type: 'type',
    }),

  }

vuex的mapMutations和mapActions

  • mapMutations可以將全局中的matation為組件的methods
  • mapActions可以將全局中的actions轉(zhuǎn)化為組件的methods
  methods: {
    //組件內(nèi)部的方法敛滋。许布。。

    // 轉(zhuǎn)換全局的mutations為組件的methods
    // ...mapMutations([]),
    // ...mapMutations({}),

    // 轉(zhuǎn)換全局的actions為組件的methods
    // 方式1:
    // ...mapActions(['requestBannerData', 'requestRecommendList']),
    // 方式2:
    ...mapActions({
      requestBanner: 'requestBannerData',
      requestRecommend: 'requestRecomm,endList',
    }),
  },

vuex中的模塊化(modules)

  • 當(dāng)我們在store中的index.js中寫所有的數(shù)據(jù)管理時,數(shù)據(jù)非常多,管理不方便,所以我們使用模塊化管理數(shù)據(jù)
  • 創(chuàng)建新的文件分別管理不同組件的數(shù)據(jù),如下示例1
  • 可以給模塊化設(shè)置命名空間,如下示例1
  • 在index.js中導(dǎo)入組件數(shù)據(jù)管理的文件,如下示例2
  • 在組件中調(diào)用時需要加上路徑名稱,如下示例3
  • 當(dāng)有模塊化時候,我們需要使用到mapState,mapGetters,mapMutations,mapActions時候,需要加上模塊名稱,如下示例4
//示例1
//在管理組件數(shù)據(jù)的文件夾導(dǎo)出一個對象,
export default {
  // 設(shè)置命名空間
  namespaced: true,

  state: {
    banner: [1, 2, 3, 4]
  },

  getters: {
    len(state, getters, rootState, rootGetters){
      console.log(state, getters, rootState, rootGetters);
      return state.banner.length;
    }
  },

  mutations: {
    add(state, payload){
      console.log('home add.....');
      state.banner.push(payload);
    } 
  },
  actions: {
    addAction(context, payload){
      console.log('home add action.....');
      context.commit('add');
    } 
  }
}
//示例2
import Vue from "vue";
import Vuex from "vuex";
//導(dǎo)入模塊
import user from './modules/user'
import home from './modules/home'
Vue.use(Vuex);
// 創(chuàng)建vue項目管理狀態(tài)的倉庫
const store = new Vuex.Store({
  // 倉庫外部不能對state進行修改绎晃,只能在倉庫內(nèi)部修改
  strict: true,
  
  state: {},
  mutations: {},
  actions: {},
  
  // 設(shè)置了倉庫的模塊
  modules: {
  //給user模塊重新命名為了u
    u: user,
    home
  }
});
//示例3
export default {
  methods: {
    btnAction(){
      // 調(diào)用模塊的state
      console.log(this.$store.state.home.banner);

      // 調(diào)用getters
      console.log(this.$store.getters['home/len']);

      // 調(diào)用muataions
      this.$store.commit('home/add', 'a');

      // 調(diào)用actions
      this.$store.dispatch('home/addAction', 'a');
    }
  }
}
//示例4
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
export default {
  computed: {
    ...mapState({
      name: state=>state.user.name
    }),
    ...mapGetters({
      age: 'user/age'
    })
  },
  methods: {
    ...mapMutations({
      modifyName: 'user/modifyName'
    }),
    ...mapActions({
      modifyNameAction: 'user/modifyNameAction'
    })
  },

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜜唾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庶艾,更是在濱河造成了極大的恐慌袁余,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件落竹,死亡現(xiàn)場離奇詭異泌霍,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門朱转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟹地,“玉大人,你說我怎么就攤上這事藤为」钟耄” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵缅疟,是天一觀的道長分别。 經(jīng)常有香客問我,道長存淫,這世上最難降的妖魔是什么耘斩? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮桅咆,結(jié)果婚禮上括授,老公的妹妹穿的比我還像新娘。我一直安慰自己岩饼,他們只是感情好荚虚,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著籍茧,像睡著了一般版述。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寞冯,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天渴析,我揣著相機與錄音,去河邊找鬼简十。 笑死檬某,一個胖子當(dāng)著我的面吹牛撬腾,可吹牛的內(nèi)容都是我干的螟蝙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼民傻,長吁一口氣:“原來是場噩夢啊……” “哼胰默!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漓踢,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤牵署,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喧半,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奴迅,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年挺据,在試婚紗的時候發(fā)現(xiàn)自己被綠了取具。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脖隶。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暇检,靈堂內(nèi)的尸體忽然破棺而出产阱,到底是詐尸還是另有隱情,我是刑警寧澤块仆,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布构蹬,位于F島的核電站,受9級特大地震影響悔据,放射性物質(zhì)發(fā)生泄漏庄敛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一科汗、第九天 我趴在偏房一處隱蔽的房頂上張望铐姚。 院中可真熱鬧,春花似錦肛捍、人聲如沸隐绵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽依许。三九已至,卻和暖如春缀蹄,著一層夾襖步出監(jiān)牢的瞬間峭跳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工缺前, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛀醉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓衅码,卻偏偏與公主長得像拯刁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逝段,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345