Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。Vuex 是专门为 Vue.js 设计的状态管理库,以利用 Vue.js 的细粒度数据响应机制来进行高效的状态更新。
用vuex来保存需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新。
![6c190eca2a66f7e6931294f0118129c7.png](https://i-blog.csdnimg.cn/blog_migrate/59581584f2c20ec20576c598b0760ec7.png)
Vuex有5种属性: 分别是 state、getter、mutation、action、module;
state: 用于数据的存储,是store中的唯一数据源。
Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。可以在页面通过 this.$store.state 来获取state。
getters:如vue中的计算属性computed一样,基于state数据的二次包装,常用于数据的筛选过滤和多个数据的相关性计算。getter的返回值会根据它的依赖被缓存起来,只有当它的依赖值发生了变化才会被重新计算。可以在.vue文件里通过 this.$store.getters.方法名 来获取,如{{this.$store.getters.getNum}}。
mutations:类似函数,改变state数据的唯一途径,且不能用于处理异步事件。在.vue文件里通过 this.$store.commit("方法名") 来调用。
actions:类似于mutation
,用于提交mutation
来改变状态,而不直接变更状态,可以包含任意异步操作。
actions可以理解为通过将mutations里面处理数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispatch 来分发 action。在.vue文件里通过 this.$store.dispatch("方法名") 来调用。
modules:类似于命名空间,用于项目中将各个模块的状态分开定义和操作,便于维护。
下面来新建一个Vue项目来演示Vuex的使用:
1、用vue-cli3创建一个新项目
vue create vue-demo
创建过程中勾选上vuex选项。
2、可以看到创建好的新项目文件夹里包含目录store,该store目录下包含一个vuex(index.js文件),该文件创建了Vuex.Store实例并使用export default导出。
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
},
mutations: {
},
actions: {
},
modules: {
}
})
然后在项目的main.js文件中引入该vuex文件(在文件里的语句 import store from ./store),并在该vue实例全局引入store对象。
项目结构如图:
![115ac1203701b56d8045614dd68c6351.png](https://i-blog.csdnimg.cn/blog_migrate/8af80d92a6ba5debd162563874bd0a0d.jpeg)
3、例如,在HelloWorld.vue文件中添加两个按钮,一个执行加1一个执行减1,点击按钮调用addHandle(执行加的方法)和reduceHandle(执行减的方法),然后在两个函数内部直接提交mutations中的方法来修改值。
![40b1e0eb402af934b6ad6c4b4fe8fba5.png](https://i-blog.csdnimg.cn/blog_migrate/7544a31dbfbcd2d59158c28a2c60337a.jpeg)
![17f56bbe59cc5dd2c0c8cd0ebcecd1eb.png](https://i-blog.csdnimg.cn/blog_migrate/235b91a29d35e8686faa67250e004a34.jpeg)
4、但官方并不建议这样直接去修改store里的值,而是建议先去提交一个actions,在actions中提交mutation再去修改状态值。
![f6ea64464bd5dac993bc6e3f2581ad2d.png](https://i-blog.csdnimg.cn/blog_migrate/48ced32efb9771b880907273f3d3ce37.jpeg)
![d5cb3473dda042861826fad87ff7a604.png](https://i-blog.csdnimg.cn/blog_migrate/85be39cf6f9e7b74aa892726a8e2d6ee.jpeg)
把commit提交mutations修改为使用dispatch来提交actions,点击页面实现的效果一样。
另外,若需要指定加减某特定值,可直接传入dispatch中的第二个参数,然后在actions中的对应函数中接受参数再传递给mutations中的函数进行计算:
![003d2613b3fa06c3b4a726c70b8f76ca.png](https://i-blog.csdnimg.cn/blog_migrate/2c8767056874e32615b073b8afe46bba.jpeg)
![d098e91d49c645b275243158c7d15a76.png](https://i-blog.csdnimg.cn/blog_migrate/651a00e3fd0e18829d96fe559fd75632.png)
5、可使用mapState、mapGetters、mapActions来代替this.$store.state.count和this.$store.dispatch("funName")这种冗长的写法:
![2b543052c552daa16edb2e8157f33227.png](https://i-blog.csdnimg.cn/blog_migrate/15841dc1e5ad8d7231bdf06f178f5105.jpeg)
![9edba24b58d60a146dae64c96ab0dc0d.png](https://i-blog.csdnimg.cn/blog_migrate/02c2dd366135d3e06b09bf361b6ef7c0.png)
![a30098d3c5f7a07308401e8724080919.png](https://i-blog.csdnimg.cn/blog_migrate/40a51dc6d3b466953fce708c275dd8fa.jpeg)
本文引用解析:
https://vuex.vuejs.org/zh/vuex.vuejs.org 公司要求会使用框架vue,面试题会被问及哪些?_慕课手记www.imooc.com![f46e454975c0acbf2b1bb0a83d56ebb7.png](https://i-blog.csdnimg.cn/blog_migrate/4671d11a2e8b04d0bbc845c7f69005b0.jpeg)
![9adcf06ed676b867b7a7a38e0fe57b43.png](https://i-blog.csdnimg.cn/blog_migrate/1b3018cbd932b74973f767950dd7c3b2.jpeg)