VueX 介绍
官方网站
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。(管理数据共享的工具)
看图结论:
- state 管理数据,管理的数据是响应式的,当数据改变时驱动视图更新。
- mutations 更新数据,state 中的数据只能使用 mutations 去改变数据。
- actions 请求数据,响应成功后把数据提交给 mutations
初始化功能
安装
新建 store.js 文件
1 2 3 4 5 6 7 8 9 10 11 12
| import Vue from "vue"; import Vuex from "vuex";
Vue.use(Vuex);
const store = new Vuex.Store({ state: null, mutations: null, actions: null, }); export default store;
|
在 main.js 配置
1 2 3 4 5 6 7
| ... import store from '@/store'
new Vue({ store, render: h => h(App) }).$mount("#app");
|
state (管理数据)
普通写法
在store.js
文件下写入
1 2 3 4 5 6
| const store = new Vuex.Store({ state: { count: 0, }, });
|
在组件获取state的数据
:原始用法插值表达式
1
| <p>{{ $store.state.count }}</p>
|
计算属性写法
常规写法
正常写法
1 2 3 4 5 6 7 8
| export default { ... computed: { count: function() { return this.$store.state.count; } } };
|
缩写
1 2 3 4 5 6 7 8
| export default { ... computed: { count() { return this.$store.state.count; } } };
|
### mapState
导入
1
| import { mapState } from "vuex";
|
使用:mapState(对象)
基本写法
1 2 3 4 5
| computed: mapState({ count: function(state) { return state.count; }, });
|
箭头函数写法
1 2 3
| computed: mapState({ count: (state) => state.count, });
|
vuex 提供写法
1 2 3
| computed: mapState({ count: "count", });
|
当你的计算属性,需要依赖 vuex 中的数据,同时,依赖组件中 data 的数据
1 2 3 4 5
| computed: mapState({ myCount(state) { return state.count + 233; }, });
|
使用:mapState(数组)
1
| computed: mapState(["count"]);
|
如果组件自己有计算属性,state 的字段映射成计算属性
1 2 3 4 5 6
| computed: { myCount() { return 1; }, ...mapState(["count"]) }
|
mutations (修改数据)
常规写法
在store.js
文件下写入
1 2 3 4 5 6 7 8 9 10
| const store = new Vuex.Store({ ... mutations: { increment(state, payload) { state.count = state.count + payload.num; } } });
|
在要使用的组件
文件下写入
1 2 3 4 5 6 7
| methods: { fn() { this.$store.commit("increment", { num: 22 }); } }
|
mapMutations
在要使用的组件
文件下写入
函数要传的参数在调用处的括号
里传入
1
| <button @click="increment({num:123})">点我</button>
|
1 2 3
| methods: { ...mapMutations(["increment"]) }
|
actions (异步获取数据)
常规写法
在store.js
文件下写入
1 2 3 4 5 6 7 8 9
| actions: { getData({ commit }, num) { window.setTimeout(() => { const data = num; commit("add", data); }, 2000); } }
|
在要使用的组件
文件下写入
1 2 3
| getData() { this.$store.dispatch("getData", 10086); }
|
mapActions
在要使用的组件
文件下写入
函数要传的参数在调用处的括号
里传入
1
| <button @click="getData(123)">点我</button>
|
1 2 3
| methods: { ...mapActions(["getData"]) }
|
modules
在 store 全局数据 是可以分模块化管理的
1 2 3 4 5 6 7 8
| modules:{ m1:{ namespaced:true, state:{ count:1 } } }
|
1
| <h2>{{$store.state.m1.count}}</h2>
|