- 目的:知道每个配置作用,根模块vue3.0的用法,带命名空间模块在vue3.0的用法
1.根模块的用法
定义
vue2.0 创建仓库 new Vuex.Store({})
vue3.0 创建仓库 createStore({})
export default createStore({
state: {
username: 'zs'
},
getters: {
newName (state) {
return state.username + '!!!'
}
},
mutations: {
updateName (state) {
state.username = 'ls'
}
},
actions: {
updateName (ctx) {
// 发请求
setTimeout(() => {
ctx.commit('updateName')
}, 1000)
}
},
modules: {
}
})
使用
<template>
<!-- vue2.0需要根元素,vue3.0可以是代码片段 Fragment -->
<div>
App
<!-- 1. 使用根模块state的数据 -->
<p>{{$store.state.username}}</p>
<!-- 2. 使用根模块getters的数据 -->
<p>{{$store.getters['newName']}}</p>
<button @click="mutationsFn">mutationsFn</button>
</div>
</template>
<script>
import { useStore } from 'vuex'
export default {
name: 'App',
setup () {
// 使用vuex仓库
const store = useStore()
// 1. 使用根模块state的数据
console.log(store.state.username)
// 2. 使用根模块getters的数据
console.log(store.getters.newName)
const mutationsFn = () => {
// 3. 提交根模块mutations函数
// store.commit('updateName')
// 4. 调用根模块actions函数
store.dispatch('updateName')
}
return { mutationsFn }
}
}
</script>
2.modules (分模块)
存在两种情况
- 默认的模块,state 区分模块,其他 getters mutations actions 都在全局。
- 带命名空间 namespaced: true 的模块,所有功能区分模块,更高封装度和复用。
import { createStore } from 'vuex'
const moduleA = {
// 子模块state建议写成函数
state: () => {
return {
username: '模块A'
}
},
getters: {
changeName (state) {
return state.username + 'AAAAAA'
}
}
}
const moduleB = {
// 带命名空间的模块
namespaced: true,
// 子模块state建议写成函数
state: () => {
return {
username: '模块B'
}
},
getters: {
changeName (state) {
return state.username + 'BBBBBB'
}
},
mutations: {
// 修改名字的mutation
update (state) {
state.username = 'BBBB' + state.username
}
},
actions: {
update ({ commit }) {
// 假设请求
setTimeout(() => {
commit('update')
}, 2000)
}
}
}
// 创建vuex仓库并导出
export default createStore({
state: {
// 数据
person: [
{ id: 1, name: 'tom', gender: '男' },
{ id: 2, name: 'lucy', gender: '女' },
{ id: 3, name: 'jack', gender: '男' }
]
},
mutations: {
// 改数据函数
},
actions: {
// 请求数据函数
},
modules: {
// 分模块
a: moduleA,
b: moduleB
},
getters: {
// vuex的计算属性
boys: (state) => {
return state.person.filter(p => p.gender === '男')
}
}
})
使用:
<template>
<div>APP组件</div>
<ul>
<li v-for="item in $store.getters.boys" :key="item.id">{{item.name}}</li>
</ul>
<!-- 使用模块A的username -->
<p>A的username --- {{$store.state.a.username}}</p>
<p>A的changeName --- {{$store.getters.changeName}}</p>
<hr>
<p>B的username --- {{$store.state.b.username}}</p>
<p>B的changeName --- {{$store.getters['b/changeName']}}</p>
<button @click="$store.commit('b/update')">修改username</button>
<button @click="$store.dispatch('b/update')">异步修改username</button>
</template>