🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
1.首先,我们先了解什么是Vuex,Vuex 是一个专为 Vue.js 应用程序开发的**状态管理模式**。 这个状态自管理应用包含以下几个部分: * **state**,驱动应用的数据源; * **view**,以声明方式将**state**映射到视图; * **actions**,响应在**view**上的用户输入导致的状态变化。 如果您的应用够简单,您最好不要使用 Vuex。一个简单的[store 模式](https://cn.vuejs.org/v2/guide/state-management.html#%E7%AE%80%E5%8D%95%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86%E8%B5%B7%E6%AD%A5%E4%BD%BF%E7%94%A8)就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。 2.接下来,我们开始安装Vuex,使用命令:`npm install vuex --save` 安装成功后,我们在src目录下新建 store 文件夹,然后新建 index.js 文件,目录结构如下 ![](https://img.kancloud.cn/91/1b/911b9227ee95e01f24755ab40e9d2b63_246x195.png) 在store/index.js文件中,创建vuex实例 ``` ~~~ import Vue from 'vue' // 引入vue import Vuex from 'vuex' // 引入vuex // 使用vuex Vue.use(Vuex) // 创建vuex实例 const store = new Vuex.Store({ }) export default store // 导出store ~~~ ``` ![](https://img.kancloud.cn/d8/58/d8588fcbe97202acec72729613ab0602_571x289.png) 3.然后,在main.js中引入该文件 ![](https://img.kancloud.cn/54/c3/54c3f2ff96d298701c10e5e89ab0d651_686x527.png) 4.开始我们的vuex业务代码 ### State vuex的数据源,我们需要保存的数据保存在这里,在页面通过 this.$store.state来获取数据 ![](https://img.kancloud.cn/f8/d0/f8d030d5fed02988b055a61ad2161363_504x274.png) ***** ![](https://img.kancloud.cn/1c/64/1c648360e374d1eb3fbacf7a6d8dcc74_662x137.png) ***** ![](https://img.kancloud.cn/01/a1/01a1ba568ce83a3b4be46f0dd85d6e18_516x237.png) 当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余,我们可以使用`mapState`辅助函数帮助我们生成计算属性。 ![](https://img.kancloud.cn/7f/d0/7fd005b4059aeebfabdec10b0b55b13e_596x451.png) 这样就简便很多啦 ### Getter Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的[计算属性](https://cn.vuejs.org/v2/guide/computed.html)))。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。 ![](https://img.kancloud.cn/62/98/6298b6a20d8f19fbb4e6c0be7b3a961d_630x384.png) ***** ![](https://img.kancloud.cn/d9/15/d9157e83603c2dd4f3bcd17f30803e65_1090x169.png) ***** ![](https://img.kancloud.cn/f9/a6/f9a69e6318115ea442c7da66546cb341_468x198.png) `mapGetters`辅助函数 ![](https://img.kancloud.cn/7b/48/7b48a31cad3df3a25e8f2de013735b4a_829x520.png) ### Mutation 如果我们需要修改count值,那就需要mutation,更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。 ![](https://img.kancloud.cn/30/44/3044763cbb431582786e73f83bef0002_611x558.png) count加1,减1 ![](https://img.kancloud.cn/42/c5/42c5acaa35b26416c41c2b0e11a0e8f6_1096x569.png) 点击按钮运行效果 ![](https://img.kancloud.cn/4f/b3/4fb399bc876dd2633066bfecfd961b15_700x380.gif) ### Action Action 类似于 mutation,不同在于: * Action 提交的是 mutation,而不是直接变更状态。 * Action 可以包含任意异步操作。 * mutation 必须同步执行,Action 就不受约束!我们可以在 action 内部执行异步操作 ![](https://img.kancloud.cn/dc/29/dc294f1af0634b127e80077b619e8905_977x703.png) ![](https://img.kancloud.cn/f8/b8/f8b85e8eff2bf422ce6c15bcea968a2d_1066x610.png) 运行结果 ![](https://img.kancloud.cn/ea/14/ea1451b11a72eb2c6a4b774d6ad898f9_700x380.gif) 我们还可以自定义参数,控制每次点击增加或减少的数量 ![](https://img.kancloud.cn/54/44/544464d3dd05feb2b2c54b553231714f_952x748.png) ![](https://img.kancloud.cn/c5/eb/c5ebb0198ebfd45b87b7532cb2318ab3_1027x598.png) 运行结果 ![](https://img.kancloud.cn/b5/43/b543fa964687ef740f0e92ab959f2595_700x380.gif)