• vuex4是vue3的兼容版本;关注兼容性,提供和vuex3相同的api,可以在vue3中复用之前的代码
  • 中文文档 https://next.vuex.vuejs.org/zh/index.html

    初始化vuex

  • 为了向vue3初始化方式看齐,vuex4初始化的方式醉了相应的变化:使用新的createStore函数创建新的实例

  • store/index.js
  1. import { createStore } from 'vuex'
  2. export default createStore({
  3. state: {
  4. },
  5. mutations: {
  6. },
  7. actions: {
  8. },
  9. modules: {
  10. }
  11. })
  • main.js全局注册
  1. import { createApp} from 'vue'
  2. import App from './App.vue'
  3. import store from './store'
  4. const app = createApp(App);
  5. app.use(store);

vuex中的数据响应式变化

vuex3的传统写法数据是响应式变化的

  1. <template>
  2. <div>
  3. <div >{{$store.state.count}}</div>
  4. <button @click="$store.commit('add')" style="margin-left: 15px">+</button>
  5. </div>
  6. </template>

…toRefs方式保留state数据响应式

  • let state = store.state;
  • return {…toRefs(state)} 在dom中直接写在state中声明的字段即可
  • {{count}}等同于store.state.count {{username}}等同于store.state.username
  1. <template>
  2. <div>
  3. <div >{{count}}</div>
  4. <button @click="add" style="margin-left: 15px">+</button>
  5. <button @click="handleupdateCount('100')" style="margin-left: 15px">更改值为100</button>
  6. </div>
  7. </template>
  1. <script>
  2. import { toRefs} from 'vue'
  3. import { useStore } from 'vuex'
  4. export default {
  5. //返回store的实例 响应式数据只有state
  6. var store = useStore();
  7. let state = store.state;
  8. //这种写法动态更改的时候数据丢失响应式特性
  9. // let count = store.state.count return count
  10. return{
  11. ...toRefs(state),
  12. }
  13. }
  14. </script>

computed方式保留state数据响应式

  1. <template>
  2. <div>
  3. <div >{{count}}</div>
  4. </div>
  5. </template>
  1. <script>
  2. import { computed } from 'vue'
  3. import { useStore } from 'vuex'
  4. export default {
  5. //返回store的实例 响应式数据只有state
  6. var store = useStore();
  7. let count = computed(() => {
  8. return store.state.count
  9. })
  10. return{
  11. count
  12. }
  13. }
  14. </script>

通过commit或者dispath进行数据更改

  1. <template>
  2. <div>
  3. <div style="display: flex;justify-content: center">
  4. <!-- 传统写法 -->
  5. <div >{{$store.state.count}}</div>
  6. <button @click="$store.commit('add')" style="margin-left: 15px">+</button>
  7. <!-- composition写法 -->
  8. <div >{{count}}</div>
  9. <button @click="add" style="margin-left: 15px">+</button>
  10. <button @click="handleupdateCount('100')" style="margin-left: 15px">更改值为100</button>
  11. </div>
  12. </div>
  13. </template>
  14. <script>
  15. import { toRefs ,computed} from 'vue'
  16. import { useStore } from 'vuex'
  17. export default {
  18. name: "18.vuex4",
  19. setup(){
  20. //返回store的实例 响应式数据只有state
  21. var store = useStore();
  22. let state = store.state;
  23. const add = (newVal) => {
  24. // 更改 Vuex store 中的状态的唯一方法是提交 mutation
  25. // 使用 store.commit 访问 mutation 来改变state
  26. // Vuex 中,mutation 都是同步事务
  27. // 通过 store.commit('mutation名称', 参数)
  28. store.commit('add', newVal)
  29. }
  30. // 定义函数
  31. const handleupdateCount = (newVal) => {
  32. // Action 提交的是 mutation,而不是直接变更状态。
  33. // Action 可以包含任意异步操作。
  34. // 通过 store.dispatch('action名称') 使用
  35. store.dispatch('updateCount', newVal)
  36. }
  37. return{
  38. ...toRefs(state),
  39. add,
  40. handleupdateCount
  41. }
  42. }
  43. }
  44. </script>
  • store.js
  1. import { createStore } from 'vuex'
  2. export default createStore({
  3. state(){
  4. return{
  5. count:1,
  6. aa:2
  7. }
  8. },
  9. mutations:{
  10. add(state){
  11. state.count++;
  12. },
  13. update(state,newVal){
  14. state.count = newVal;
  15. }
  16. },
  17. actions:{
  18. updateCount({commit}, newVal){
  19. commit('update', newVal)
  20. }
  21. }
  22. })

vuex 模块化 跟veux3写法一样

  1. <template>
  2. <div>
  3. <div >{{count}}</div>
  4. </div>
  5. </template>
  6. <script>
  7. import { toRefs ,computed} from 'vue'
  8. import { useStore } from 'vuex'
  9. export default {
  10. setup(){
  11. //返回store的实例 响应式数据只有state
  12. var store = useStore();
  13. let state = store.state.user;
  14. return{
  15. ...toRefs(state),
  16. }
  17. }
  18. }
  19. </script>
  • modules/user.js
  1. let user = {
  2. state(){
  3. return{
  4. count:1,
  5. aa:2
  6. }
  7. },
  8. mutations:{
  9. },
  10. actions:{
  11. }
  12. }
  13. export default user;
  1. import { createStore } from 'vuex'
  2. import user from './modules/user'
  3. export default createStore({
  4. modules: {
  5. user
  6. },
  7. })