Vue | Vue.js 全家桶 Vuex状态管理(二)

简介: Vue | Vue.js 全家桶 Vuex状态管理(二)

五、核心概念Mutations

Mutation基本使用

更改Vuex的store中的状态的唯一方式就是提交muattion:

JavaScript
mutations:{
    increment(state){
        state.counter++
    },
    decrement(state){
        state.counter--
    }
}

Mutation携带数据

很多时候我们在提交mutation的时候,会携带一些数据,这个时候我们可以使用参数:

JavaScript
mutations:{
    // 普通的值  payload
    changeName(state,payload){
        state.name = payload
    },
    // payload为 对象类型
    changeInfo(state,payload){
        state.level = payload.level
        state.name = payload.name
    }
}
=====================================
changeInfo(){
    this.$store.commit("changeInfo",{
      name:"xxwn",
      level:999
     })
  }

对象风格的提交方式

JavaScript

$store.commit({

    type:"addNumber",

    count:100

})

Mutation常量类型

定义常量:mutation-type.js

JavaScript

export const ADD_NUMBER = "ADD_NUMBER"


定义mutation

JavaScript

[ADD_NUMBER](state,payload){

    state.counter += payload.count

}


提交mutation

JavaScript

$store.commit({

    type: ADD_NUMBER,

    count: 100

})

mapMutations辅助函数

我们也可以借助于辅助函数,帮助我们快速映射到对应的方法中:

a9751334c1974022b05b867c8cb6f3da.png

在setup中使用也是一样的

ccf2d6f1a4284d42970d64aa7280f2f9.png

a2bf70ce10014ad8ac34e6507886969c.png

mutation重要原则

mutation必须是同步函数


       因为devtool工具会记录mutation的日记


       每一条 mutation被记录,devtool都需要捕捉到前一状态和后一状态的快照;


       但是在 mutation中执行异步操作,就无法追踪到数据的变化

六、核心概念Actions

actions的基本使用

Action类似于mutation,不同在于:


Action提交的是mutation,而不是直接变更状态


Action可以包含任意异步操作;

c40fd2acbd9e4ec89b9ffa8b17dfa63c.png

这里有一个非常重要的参数context:


       context是一个和store实例均有相同方法和属性的context对象


       所以我们可以从其中获取到commit方法来提交一个mutation,或者通过context.state和context.getters来获取state和getters


为什么它不是store对象?  ==> 等说Modules再具体说

actions的分发操作

使用action => 进行action的分发:


       分别使用store上的dispatch函数;

JavaScript

add() {

    this.$store.dispatch("increment")

}


它可以携带参数:

JavaScript

add(){

    this.$store.dispatch("increment",{ count:100 })

}

// ===========================================

JavaScript
nameBtnClick(){
    this.$store.dispatch("changeNameActions","xiaoxiong")
  }
  // 传递给 下面的
// ====================================================
changeNameActions(context,payload){
    // console.log(payload); // payload就是 传递过来的值
    context.commit("changeName",payload)
}

也可以以对象的形式进行分发(了解)

JavaScript
add(){
    this.$store.dispatch({
        type:"increment",
        count:100
    })
}

actions的辅助函数

action也有对应的辅助函数:


       对象类型的写法;


       数组类型的写法

JavaScript
methods:{
    ...mapActions(["increment","decrement"]),
    ...mapActions({
        add:"increment",
        sub:"decrement"
    })
}

13512d42f8474fb497f7c04860a75adc.png

Options API

JavaScript
methods:{
      // actionBtnClick(){
      //   // 点击按钮 就派发
      //   this.$store.dispatch("incrementAction")
      // },
      // nameBtnClick(){
      //   this.$store.dispatch("changeNameActions","xiaoxiong")
      // }
      // Options API写法
      ...mapActions(["incrementAction","changeNameActions"])
    }

Setup写法:

JavaScript
<script setup>
  import { useStore,mapActions } from 'vuex'
  const store = useStore()
  // 在setup中使用mapActions辅助函数
  const actions = mapActions(["incrementAction","changeNameActions"])
  const newActions = {}
  Object.keys(actions).forEach(key => {
    newActions[key] = actions[key].bind({$store:store})
  })
  const { incrementAction,changeNameActions } = newActions
  // 2 使用默认的做法
  function increment(){
    store.dispatch("incrementAction")
  }
</script>

actions的异步操作

Action通常是异步的,怎么知道action什么时候结束?


       可以通过action返回Promise,在Promise的then中来处理完成后的操作;

image.png


image.png

七、核心概念Modules

module的基本使用

什么是Module?


       由于使用单一状态树,应用的所有状态会集中到一个比较大的对象,当应用变得非常复杂时,store对象就有可能变得臃肿;


       为了解决以上问题,Vuex允许我们将store分割成 模块(module)


       每个模块拥有自己的state,mutation,action,getter,甚至是嵌套子模块

932d8a64c1bc43f58d6ffa8bc60e1f1a.png     fff8fb182c58480abef27bc9ac625458.png

module的局部状态

对于模块内部的mutation和getter,接收的第一个参数是 模块的局部状态对象

88cdd237940446d8ac038c21fac6f3d5.png

57c08ac22d79415d8377e3b96043bf98.png

module的命名空间

默认情况下,模块内部的action和mutation仍然是注册在全局的命名空间中的,


       这样使得多个模块能够对同一个action或mutation作出响应


       Getter同样也默认注册在全局命名空间


如果我们希望模块具有更高的封装性和复用性,可以添加namespaced:true的方式使其成为带命名空间的模块;


       当模块被注册后,他的所有getter  action 及 mutation 都会自动根据模块注册的路径调整命名;

acc1dc6f6a4248cebef6cd7acae50578.png     62191d2bd81a4624bcbbb353521914f1.png

module修改或派发根组件

如果我们希望在action中修改root中的state,有以下的方式:

820689c2568f49d1ab591fd25ae46533.png

相关文章
|
12天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
28 1
vue学习第四章
|
12天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
25 1
vue学习第九章(v-model)
|
12天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
27 1
vue学习第十章(组件开发)
|
18天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
18天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
18天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
18天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
17天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
26 3
|
19天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
17天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
36 2