Vuex 的使用
本教程源于官网 总结与官网 https://vuex.vuejs.org/zh/guide/mutations.html
基本使用
1 mapState
mapState 是对变量状态的动态改变
import {mapState} from 'vuex'
export default({
data(){
return {
add:1
}
}
computed:{
...mapState({
count, // 等价于store.state.count
aliasCount:state=>state.count // 关联store.state.count 使用就用 aliasCount
counter(state){
return state.count+this.add // 为了能使用this 要写成function 类型
}
})
}
})
2 getter的使用
import {mapState} from 'vuex'
export default({
data(){
return {
add:1
}
}
computed:{
...mapState({
count, // 等价于store.state.count
aliasCount:state=>state.count // 关联store.state.count 使用就用 aliasCount
counter(state){
return state.count+this.add // 为了能使用this 要写成function 类型
}
})
}
})
mapGetters
mapGetters 是在不改变变量下取值
也可以直接用 this.$store.state.xxx 简单粗暴取值
mapGetters 是一种高级的取值方法
store 文件里面
getters: {
// ...
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
在store 文件写一个getter 函数后 我们可以用
import { mapGetters } from 'vuex'
export default {
// ...
computed: {
// 使用对象展开运算符将 getter 混入 computed 对象中
...mapGetters([
'getTodoById', 直接取
aliasGetTodoById: 'getTodoById' // 重命名取值
])
}
}
3 Mutation 使用
注意事项:
- Mutation 必须是同步函数
2 最好提前在你的 store 中初始化好所有所需属性。
3 Vue.set(obj, 'newProp', 123)
mutation 一般代表变量的改变 类似于handle
在store 声明如下
const store = new Vuex.Store({
state: {
count: 1
},
mutations: {
add(state,n) { // 其中 n 为参数
state.count+=n
}
}
})
Vue调用如下
export default {
methods: {
...mapMutations([
'add' // 将 `this.add(n)` 映射为 `this.$store.commit('add', n)`
]),
...mapMutations({
add: 'increment' // 重命名 将 `this.add()` 映射为 `this.$store.commit('increment')`,
})
}
}
store.commit('increment',n) // n为参数
另外 有一中 使用常量替代 Mutation 事件类型 为大型团队用的 本人少用 列举
参考 点击进入 https://vuex.vuejs.org/zh/guide/mutations.html
4 Action
1 不用于Mutations 为异步调用
2 action 是context 对象
3 tore.dispatch 可以处理被触发的 action 的处理函数返回的 Promise,并且 store.dispatch 仍旧返回 Promise:
在store 声明如下
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
checkout ({ commit, state }, products) {
const savedCartItems = [...state.cart.added]
commit(types.CHECKOUT_REQUEST)\
// 利用action 多重分发mutations
shop.buyProducts(
products,
() => commit(types.CHECKOUT_SUCCESS),
() => commit(types.CHECKOUT_FAILURE, savedCartItems)
)
}
}
}
})
看出 actions 是context对象 可以解构context对象 {state,commit}
可以用commit 调用内部mutations方法
在Vue里使用如下
export default {
// ...
methods: {
...mapActions([
'increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`
// `mapActions` 也支持载荷:
'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`
]),
...mapActions({
increment: 'add' // 将 `this.increment()` 映射为 `this.$store.dispatch('add')`,
})
}
}
action 的Promise 形式
actions: {
actionA ({ commit }) {
return new Promise((resolve, reject) => {
setTimeout(() => {
commit('someMutation')
resolve() // 成功
}, 1000)
})
}
}
可以通过下面3 个方法调用
vue文件调用
store.dispatch('actionA').then(() => {} )
action 调用action
actions: {
actionB ({ dispatch, commit }) {
return dispatch('actionA').then(() => {
commit('someOtherMutation')
})
}
** async await**
actions: {
async actionA ({ commit }) {
commit('gotData', await getData())
},
async actionB ({ dispatch, commit }) {
await dispatch('actionA') // 等待 actionA 完成
commit('gotOtherData', await getOtherData())
}
}
基础写法完结
module 写法链接 https://www.jianshu.com/p/373fe7a59f3d
github 账号Theodore-Ritchie