vuex是一个专门为vuejs应用程序的设计的状态管理
集中式存储管理应用的所有组件的状态
多组件状态共享,不同的组件改变同一个状态
vuex知识点:state,getter,mutation,action
安装vuex
npm install vuex –save
或者
yarn add vuex
导入vuex包
import Vuex from “vuex”
创建vuex实例
new Vuex.store()
将vuex实例挂载在vue对象上
index.js
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
count: 0
}
})
export default store
main.js
new Vue({
store // 将store对象添加到vue实例上
})
可以通过this.$store.state.count获取到状态(官方推荐将获取装态的操作放到computed中)
使用解构获取状态: import { mapState } from ‘vuex’ export default { mounted() { console.log(this.count) }, computed: { …mapState([‘count’]) } }
Getter
getters: {
getCount(state) {
return state.count + 1
}
}
...
export default {
mounted() {
console.log(this.$store.state.count)
console.log(this.$store.getters.getCount)
}
}
mapGetters函数解构到计算属性(将store中的getter映射到局部计算属性)
computed: {
...mapGetters(['getCount'])
}
或者起别名(起别名是导入对象{})
computed: {
...mapGetters({mainData: 'getCount'})
// this.mainData为this.$store.getters.getCount
}
Mutation
在vuex中不能直接修改store的值,而是通过Mutation方法来修改,例如:
mutations: {
// setData(state) {
// state.count = 3
// }
setMain(state, intData) {
state.count = intData.count
// 通过传参的方式修改
}
}
App.vue
export default {
mounted() {
console.log(this.$store.state.count)
this.$store.commit('setMain',{count: 123})
console.log(this.$store.state.count)
},
}
注意:Mutation方法内部的函数必须是同步的,是不能处理异步的
在组件中也是可以使用Mutation解构的(Mutation)
导入并且解构
import { mapMutations } from 'vuex'
export default {
mounted() {
this.setMain({ count: 666 });
},
methods: {
// 通过mapMutations解构到methods里面,其别名也是一样的操作
...mapMutations(['setMain'])
},
}
Actions(异步操作,也支持mapActions解构起别名)
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
setMain(state, intData) {
state.count = intData.count
// 通过传参的方式修改
}
},
actions: {
intData (context, mainData) {
return new Promise(resolve => {
setTimeout(() => {
context.commit('setMain', {count: mainData:count})
resolve()
},3000)
})
}
}
})
App.vue
async mounted() {
console.log(this.$store.state.count)
await this.$store.dispatch('intData',{count: 123})
console.log(this.$store.state.count)
}
推荐使用pinia来代替vuex,pinia对ts的支持程度更好,更轻量 https://github.com/vuejs/pinia