vuex是vue的状态管理工具,为了更方便实现多个组件共享状态

// src/store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

// Vuex是一个对象,里面有一个大写的Store和install方法
export default new Vuex.Store({
  state: {
    count: 1
  },
  getters: {
    getCount(state) {
      return state.count + 1
    }
  },
  mutations: {
    changeCount(state, payload) {
      state.count += payload 
    }
  },
  actions: {
    changeCount({ commit }, payload) {
      setTimeout(() => {
        commit('changeCount', payload)
      }, 1000)
    }
  },
  modules: {
  }
})
// src/main.js

import Vue from 'vue'
import App from './App.vue'
import store from './store'

Vue.config.productionTip = false

// 注入vue-router后所有组件都可以获取到_router属性,可以通过$router使用
// 注入的是vuex中的store,所有组件都可以同$store拿到这个变量
new Vue({
  store,
  render: h => h(App)
}).$mount('#app')
// src/App.vue

<template>
  <div id="app">
    <div>
      count:{{$store.state.count}}
    </div>

    <div>
      gettter:{{$store.getters.getCount}}
    </div>

    <!-- 不要直接修改state的值,因为一个state的值可能被多个组件使用,如果在某个组件里直接修改这个state的值,会影响到其他组件,不利于查找数据的改变来源。 -->
    <button @click="$store.state.count = 10">不合规改变state</button>

    <button @click="$store.commit('changeCount', 10)">同步加{{$store.state.count}}</button>

    <button @click="$store.dispatch('changeCount', 100)">异步加{{$store.state.count}}</button>
  </div>
</template>

这里我们可以进行类比: state 类比为组件的状态 ,getters类比为组件的计算属性 , mutations类比为组件中的方法(可以更改组件的状态),actions用于进行异步操作将结果提交给mutation

<template>
  <div id="app">
    <div>
      count:{{$store.state.count}}
    </div>

    <div>
      gettter:{{$store.getters.getCount}}
    </div>

    <!-- 不要直接修改state的值,因为一个state的值可能被多个组件使用,如果在某个组件里直接修改这个state的值,会影响到其他组件,不利于查找数据的改变来源。 -->
    <button @click="$store.state.count = 10">不合规改变state</button>

    <button @click="$store.commit('changeCount', 10)">同步加{{$store.state.count}}</button>

    <button @click="$store.dispatch('changeCount', 100)">异步加{{$store.state.count}}</button>
  </div>
</template>

不允许直接修改state的值,因为一个state的值可能被多个组件使用,如果在某个组件里直接修改这个state的值,会影响到其他组件,不利于查找数据的改变来源。

这个$store属性是通过根实例传入的

new Vue({
  store,
  render: h => h(App)
}).$mount('#app')

内部会将store属性挂载在每个实例上命名为$store,这样所有组件都可以操作同一个store属性