一步一个脚印学 vuex!

707 阅读3分钟

先看图,看不懂没关系,我们先往下看,看完下面的再回头看,便会恍然大悟!

vuex 是什么?

是一个专为vue.js 应用程序开发的状态管理模式 + 库。 它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

vuex为什么出现?

1、多个组件依赖于同一状态时,对于多层嵌套的组件的传参将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。

2、来自不同组件的行为需要变更同一状态。 以往采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。

所以vuex出现了!

什么情况下我应该使用 Vuex?

Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行权衡。

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。引用 Redux 的作者 Dan Abramov 的话说就是:

Flux 架构就像眼镜:您自会知道什么时候需要它。

怎么引用?

1、npm install vuex --save;

2、在src路径下创建store文件夹,然后创建index.js

import Vue from 'vue'
import Vuex from 'vuex' 
Vue.use(Vuex) 
//将vuex 注册倒Vue上
const store = new Vuex.Store({   
    //用来数据共享数据存储  
    state:{   },   
    //用来注册改变数据状态 
     mutations:{      },   
    // 用来对共享数据进行过滤操作  
    // Getter 接受 state 作为其第一个参数  
    getters:{    },   
    //解决异步改变共享数据  
    // Action 提交的是 mutation,而不是直接变更状态。  
    actions:{  },   
    // 用来挂载模块 Vuex 允许我们将 store 分割成模块  
    // 每个模块拥有自己的 state、mutation、action、getter、  
    // 甚至是嵌套子模块——从上至下进行同样方式的分割:  
    modules:{    }
})
export default store;

3、在main.js中引入:

import store from './store'
new Vue({ store }) 

五个核心:

1、state://用来存储共享数据

state: {    
    count: 0
},

2、mutations://用来改变数据(同步)

mutations:{     
    //参数一:固定为当前store的state,参数二:自定义值     
    setCount(state){           
         count++;         
    }
}

3、getters://用来过滤数据

getters: {    
    //参数一:固定为当前store的state,参数二:其他 getter    
    filterCount: (state) => {          
        return `我是过滤后的count值${state.count}`    
    }
}

4、actions://用来改变数据(异步,提交的是mutations的方法修改数据)

ctions:{     
    //参数一:固定为context可解构出commit、state、getters,参数二:自定义     
    asycSetCount(context){           
        return new Promise((resolve,reject) => {             
            setTimeout(() => {                 
            context.commit('mutations中的方法名')               
                resolve();             
            }, 1000)          
        })      
    }
}

5、modules://用来划分store模块

默认情况下,模块内部的 action 和 mutation 仍然是注册在全局命名空间的——这样使得多个模块能够对同一个 action 或 mutation 作出响应

namespaced: true 添加模块命名空间

在index.js引入所有模块:
import 模块名称1 from '....';
import 模块名称2 from '....';
const store = new Vuex.Store({     
modules:{ 
        模块名称1, 
        模块名称2, ......  
    }
})

访问:

一. state:
1、this.$store.state.数据变量名;
2、辅助函数 => mapState 帮助我们生成计算属性

computed:{    
    // 映射 this.数据1 为 store.state.数据1    
    ...mapState([数据1,...])
}

二. mutations:
1、this.$store.commit('mutations里的方法名');
2、辅助函数 => mapMutations 将组件中的methods映射为store.commit

methods:{    
    ...mapMutations([需要访问的mutations方法名,...])
}

三. getters:

1、this.$store.getters.getter方法名;
2、辅助函数 => mapGetters是将store中的getters映射到局部计算属性

computed:{    
    ...mapGetters([getters方法名, ...])
}

四. actions:
1、this.$store.dispatch('asycSetCount');
2、辅助函数 => mapActions将组件中的methods映射为store.dispatch

methods:{    
    ...mapActions([actions方法名, ...])
}

5. modules:

访问state:

        this.$store.state.模块名.模块里面的state名

访问mutations:

        this.$store.commit('模块名/方法名')

访问getters:

        this.$store.getters['模块名/方法名']

访问actions:

        this.$store.dispatch("模块名/方法名");

modules辅助函数:
...mapState/mapActions/mapGetters/mapMutations('模块名称', [
   state数据/方法名,
   ...
])

注:辅助函数都得手动引入

在带命名空间的模块内访问全局内容

getter:rootState 和 rootGetters 会作为第三和第四参数传入
action:包含rootState 和 rootGetters
rootState.全局state数据;
rootGetters.全局getters方法。