自己对 Vuex 一直都不是很熟,所以想再进行一次积累,看看自己还有什么可以补足的。

Vuex 的配置

1.Vuex 安装

在项目根目录终端执行

  1. #安装 vuex
  2. cnpm install vuex --S

2.创建 Vuex 文件

我们需要在项目根目录下建立一个文件夹,我们命名为 store ,在这个文件夹内,我们创建一个 js 文件,命名为 index.js。
在 index.js 中输入

  1. import Vuex from 'vuex'
  2. import Vue from 'vue'
  3. Vue.use(Vuex);
  4. const store = new Vuex.Store({ //创建一个 Store 的实例
  5. state:{
  6. count:0
  7. }
  8. })
  9. export default store

3.修改 main.js 文件

修改根目录中的 main.js 文件,在这个文件中加入:

  1. import store from '../store'
  2. new Vue({
  3. ...
  4. store
  5. ...
  6. })

在这之后,我们就能够在 index.js 中使用 vuex 了。

Vuex 的常用属性和方法

首先,我们可以看看在其他地方该如何调用 Store 的实例中的对象和属性。
我们假设现在有一个 .vue 文件,命名为 count.vue,我们在这里面进行 Store 实例的访问。

  1. <!-- count.vue -->
  2. <template>
  3. <div>
  4. <p>{{msg}}</p>
  5. <button @click="showMsg()">showMsg</button>
  6. </div>
  7. </template>
  8. <script>
  9. export default{
  10. name:'count',
  11. data(){
  12. return{
  13. msg:null
  14. }
  15. },
  16. methods:{
  17. showMsg(){
  18. this.msg = this.$store.state.count
  19. }
  20. }
  21. }
  22. </script>

这样就可以进行 Store 实例的访问。
那么,我们如何改变其中的数值呢?比如,我们想改变 count 具体的值。这时,我们就可以用到 Store 实例中的mutationsactions方法。

同样是刚才的那个例子。
我们先修改 index.js

  1. import Vuex from 'vuex'
  2. import Vue from 'vue'
  3. Vue.use(Vuex);
  4. const store = new Vuex.Store({ //创建一个 Store 的实例
  5. state:{
  6. count:0
  7. },
  8. mutations:{ // mutations 属性
  9. addCount(state){ // 表明 state 对象
  10. state.count ++
  11. }
  12. },
  13. actions:{
  14. takeAddCount(context){ // context 代表一个与 store 这个对象拥有完全相同属性及方法的对象
  15. context.commit("addCount") // context.commit(methodName) === this.$store.commit(methodName)
  16. }
  17. }
  18. })
  19. export default store
  1. <!-- count.vue -->
  2. <template>
  3. <div>
  4. <p>{{this.$store.state.count}}</p>
  5. <button @click=incrsCount()>incrsCount</button> // 使用 mutations
  6. <button @click=incrsCount2()>incrsCount</button> // 使用 actions
  7. </div>
  8. </template>
  9. <script>
  10. export default{
  11. name:'count',
  12. data(){
  13. return{
  14. msg:null
  15. }
  16. },
  17. methods:{
  18. incrsCount(){
  19. this.$store.commit("addCount") 使用 commit 方法
  20. },
  21. incrsCount2(){
  22. this.$store.dispatch("takeAddCount") 使用 dispatch 方法,dispatch 在英语中有派遣的意思
  23. }
  24. }
  25. }
  26. </script>

虽然这两种方法(mutations 和 actions)都能导致数据的变化,但内在的实现机制有区别。

mutations 同步处理

我们来用官方的一个例子来说明问题:

  1. mutations: {
  2. someMutation (state) {
  3. api.callAsyncMethod(() => {
  4. state.count++
  5. })
  6. }
  7. }

在这个例子中,mutations 虽然能完成数据的最终处理,但是其无法在 devtool 中追踪和检测其中的数据的变化。

actions 异步处理

正因为 mutations 存在无法追踪和检测数据的变化的原因,所以我们需要利用 actions 处理 mutations 中的函数,来进行一些异步操作。
实际上,actions 还有一种写法:

  1. actions:{
  2. doAction({commit}){
  3. commit(methodName) // commit === context.commit === this.$store.commit
  4. }
  5. }


( actions 和 mutations 的一些更细的区别还不大清楚,有待研究。