Vuex 學習筆記
vue
const state = { count: 1 } export default state;
const mutations = { // state就是store裏面的參數 num傳遞過來的參數 add(state, num) { state.count = state.count + num; }, reduce(state) { state.count--; } }; export default mutations;
const getters = { countDouble(state) { return state.count % 2 ? '奇數' : '偶數' } } export default getters;
當咱們經過mutations裏面的定義的方法改變state的時候,會實時的更新這個數是奇數仍是偶數vuex
addActions(context, params) { /** * context 裏面的參數 * { dispatch commit getters state } * params 就是調用 addActions 裏面的參數 就是這裏的 addActions(100) 參數就是 100 */ console.log(context, params) fetch('https://api.myjson.com/bins/y10ma').then(data => { return data.json() }).then(data => { // 異步操做 add 方法就是 context.commit('add', data.num) }); }, // 這個地方就是解構賦值 reduceActions({ commit }) { console.log(commit); commit('reduce') } } export default actions;
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) import state from './store'; //全局的state倉庫 import mutations from './mutations'; // 全局的 mutations 定義全局的事件 import getters from './getters'; // 全局的 computed 經過監聽 state 裏面值得變化 返回須要的數據類型 import actions from './actions' // 全局的異步操做 const store = new Vuex.Store({ state, // 定義狀態 mutations, getters, actions }); export default store;
import Vue from 'vue' import App from './App' import router from './router' Vue.config.productionTip = false import store from './store/index'; /* eslint-disable no-new */ new Vue({ el: '#app', router, store, components: { App }, template: '<App/>' })
如何在組件當中 調用上面的一系列的方法。json
<template> <div> <!-- 這個裏面的寫法能夠省略掉this --> <h2> ...mapState(['count']) 獲取state 裏面的數據 </h2> <div>$store.state.count => {{ $store.state.count }}</div> <div>{{ $route.name }}</div> <div>mapState => {{count}}</div> <div>mapState => {{c}}</div> <!-- getters 就是vue 裏面的 computed屬性 當數據發生改變的時候 會通知getters裏面定義的數據 --> <h2>getters 的使用 注意定義 和 mapGetters 的使用方式</h2> <div> $store.getters.countDouble 訪問=> {{ $store.getters.countDouble }}</div> <div> ...mapGetters(['countDouble'])訪問=> {{countDouble }}</div> <h2> 時間都是定義在mutations裏面 ...mapMutations(['add']) 參數傳遞: @click="add(100)"</h2> <button @click="add(100)">+</button> <button @click="reduce">-</button> <h2> 如何處理異步 actions 處理異步的操做 </h2> <button @click="addActions(1000)">異步增長</button> <button @click="reduceActions">異步減小</button> </div> </template> <script> /** * mapState 快速獲取到 state 裏面的值 * mapMutations 映射 mutation 中定義的方法 * mapGetters 映射 getters 裏面定義的一系列值 * mapActions 映射 異步操做 */ import {mapState, mapMutations,mapGetters,mapActions} from 'vuex'; export default { created(){ console.log(this.$store); // vuex 裏面的所用方法屬性都會被掛載到vue的實例上面 這個this 指的就是vue的實例 console.log(this.$route); // router 上面的全部屬性 一樣會直接掛載到 $route 上面 }, // 經過computed 獲取到數據 computed: { // 直接訪問 獲取state裏面的數據 count(){ return this.$store.state.count }, ...mapState(['count']), // 最經常使用的獲取 Vuex裏面state的數據 1 ...mapState({ // 獲取 state 裏面的數據 2 c:state => state.count }), // 獲取getters裏面的數據 ...mapGetters(['countDouble']) }, methods:{ // 這樣映射裏面的 mutations 方法的時候 參數傳遞 須要在 @click="add(100)" 100就是裏面傳遞的參數 ...mapMutations(['add','reduce']), // 最多見的寫法 常規方法 ...mapActions(['addActions','reduceActions']), // add(){ // // 傳遞事件 // this.$store.commit('add',10); // }, // reduce(){ // this.$store.commit('reduce'); // } } } </script> <style> </style>