用了好久vuex
没有记录过,重新再学一遍并做一下笔记。
1 Vuex概述
1.1 组件之间共享数据的方式
父向子传值:v-bind
属性绑定
子向父传值:v-on
事件绑定
兄弟组件传值: EventBus
$on
接收数据的组件$emit
发送数据的组件
1.2 Vuex是什么
Vuex
是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享。
1.3 使用Vuex的好处
- 能够在
vuex
中集中管理共享的数据,方便开发和维护 - 能够高效实现组件之间数据共享,提高开发效率
- 存储在
vuex
中的数据都是响应式的,能够实时保持数据与页面的同步
1.4 什么样的数据适合存储到Vuex中
一般情况向下,只有组件间共享的内容才存储到vuex
中,对于组件中的私有数据,依旧存储在组件自身的data
中
2 Vuex的基本使用
2.1 安装vuex依赖包
1 | npm install vuex --save |
2.2 导入vuex包
1 | import Vuex from 'vuex' |
2.3 创建store对象
1 | //创建VueX对象 |
2.4 将store对象挂载到vue实例中
在根目录底下的main.js
的文件中:1
2
3
4
5
6
7import store from './store'
new Vue({
el: '#app',
// 将创建的数据共享对象挂载到这个vue实例中
store,
render: h => h(App)
})
3 Vuex核心概念
3.1 State
State
提供唯一的公共数据源,所有共享的数据源都要统一放到Store
的State
中进行存储。
组件访问State
中数据方式:
方式一
1 | this.$store.state.全局数据名称 |
方式二
1 | // 从vuex中按需导入mapState |
通过导入的mapState
函数,将当前函数需要的全局数据,映射为当前组件的computed
计算属性:1
2
3computed: {
...mapState(['name'])
}
然后在当前组件就可以直接使用this.name
3.2 Mutation
Mutation
用于变更Store
中的数据。
- 只能通过
Mutation
变更Store
中的数据,不可以直接操作Store
中的数据。 - 操作虽然繁琐,但是可以集中监控所有数据的变化。
Mutations
中不能执行异步操作。mutations使用方法
mutations
方法都有默认的形参:
([state] [,payload])state
是当前vuex
对象中的state
payload
是该方法在被调用时传递参数使用的
定义Mutation
:1
2
3
4
5
6
7
8
9
10
11const store = new Vuex.Store({
state: {
name: 'helloVueX'
},
mutations: {
edit (state, name) {
// 变更状态
state.name = name
}
}
})
方法一
在组件中使用commit
函数调用这个mutation
:1
this.$store.commit('edit', '111')
方法二
1 | // 从vuex中按需导入mapMutitions |
通过导入的mapMutations
函数,将需要的mutations
函数映射为当前组件的methods
方法:1
2
3methods: {
...mapMutations(['edit'])
}
然后在当前组件可以直接调用方法this.edit('111')
3.3 Action
Action
用于处理异步任务。
如果通过异步操作变更数据,必须使用Action
,而不能使用Mutation
,但是在Action
中还是要通过触发Mutation
的方式间接变更数据。
actions使用方法
Actions
中的方法有两个默认参数:
([context] [,payload])
context
上下文对象payload
挂载参数
比如执行setTimeout
异步操作:1
2
3
4
5
6
7
8actions:{
aEdit(context, payload) {
setTimeout(() => {
// 只有mutations中定义的函数才有权利修改state中的数据
context.commit('edit', payload)
}, 1000)
}
}
方法一
在组件中调用异步方法,使用dispatch
函数来触发action
:1
this.$store.dispatch('aEdit', '111')
方法二
1 | // 从vuex中按需导入mapActions |
通过导入的mapActions
函数,将需要的actions
函数映射为当前组件的methods
方法:1
2
3methods: {
...mapActions(['aEdit'])
}
然后在当前组件可以直接调用方法this.aEdit('111')
3.4 Getter
Getter
用于对Store
中的数据进行加工处理形成新的数据。
Getter
可以对Store
中已有的数据进行加工处理之后形成新的数据,类似Vue
的计算属性。Store
中的数据发生变化,Getter
中的数据也会发生变化。Getter
中的数据处理不会修改State
中的数据,只起到包装的作用。Getters使用方法
Getters
中的方法有两个默认参数state
当前vuex
对象中的状态对象getters
当前getters
对象,用于将getters
下的其他getter
拿来用
定义Getter
:1
2
3
4
5
6
7
8getters:{
name1(state) {
return state.name
},
name2(state, getters) {
return getters.name1 + state.name
}
}
方法一
1 | this.$store.getters.名称 |
方法二
1 | // 从vuex中按需导入mapGetters |
通过导入的mapGetters
函数,将当前函数需要的全局数据,映射为当前组件的computed
计算属性:1
2
3computed: {
...mapGetters(['name1'])
}