目录
1.创建vue3的应用
2.创建store
3.以简单的计数器为例
3.1 创建组件
3.2 state
3.3 mutation更新coutn的值
3.4 action
3.5 getter
Vue应该是在复杂的应用中常用的vue核心插件,下面是官网中对Vuex的介绍,其中红色的字体是需要着重注意的:
每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:
Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。
示例代码地址vuex温故知新
这里使用命令行创建,命令行创建要求node版本要改与v15,执行命令
npm init vue@latest
这一指令将会安装并执行 create-vue,它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示。
创建完成后,npm install 安装依赖,npm run dev运行程序
在src目录下创建store文件夹,在store文件下创建index.js
import { createStore } from 'vuex'
export default createStore({
state: {
},
mutations: {
},
actions: {
},
modules: {
}
})
在main.js中引入store
import store from './store'
createApp(App)
.use(store)
.mount('#app')
创建组件Addition
当前最新的count值为:
创建组件Subtraction
当前最新的count值为:
在App.vue中引入这两个子组件
-----------------------------
在store/index.js中定义count
state: {
count: 0
},
并在子组件中获取count的值,有两种方式
一种是直接通过store来获取
当前最新的count值为:$store.state.count
一种是通过引入mapState来获取
当前最新的count值为:{{count}}
import {mapState} from 'vuex'
export default {
data(){
return{
}
},
computed: {
...mapState(['count'])
}
}
在store/index.js中定义操作count值的方法
export default createStore({
state: {
count: 0
},
mutations: {
add(state) {
state.count ++
},
addN(state,step) {
state.count += step
},
sub(state){
state.count --
},
subN(state,step){
state.count -= step
}
},
actions: {
},
modules: {
}
})
在组件中调用时有两种方式
一种是通过store直接调用
this.$store.commit('add')
//携带参数
this.$store.commit('addN',2)
一种是通过引入mapMutations来进行调用
import {mapState , mapMutations} from 'vuex'
...mapMutations(['sub']),
btnHandle(){
this.sub()
},
btnHandleN(){
this.subN(2)
}
Action 类似于 mutation,不同在于:
在store/Index.js的actions中定义异步操作count的方法:
actions: {
addAsync(context){
setTimeout(()=>{
context.commit('add')
},1000)
},
addNAsync(context,step){
setTimeout(()=>{
context.commit('addN',step)
},1000)
},
subAsync(context){
setTimeout(()=>{
context.commit('sub')
},1000)
},
subNAsync(context,step){
setTimeout(()=>{
context.commit('subN',step)
},1000)
}
引用异步操作count的方法有两种:
一种是通过直接引用
// 异步更新count的值
btnHandleAsync(){
// dispatch触发action
this.$store.dispatch('addAsync')
},
btnHandleNAsync(){
this.$store.dispatch('addNAsync',5)
}
一种是引入mapActions后调用
import {mapActions} from 'vuex'
有时候我们需要从 store 中的 state 中派生出一些状态,后者是进行一些运算
在store/index.js中添加getters属性
getters: {
showNum(state){
return '当前最新的数量是【'+state.count+'】'
}
}
调用方式
{{$store.getters.showNum}}
{{showNum}}
import {mapGetters} from 'vuex'
computed: {
...mapGetters(['showNum'])
},