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

相关文章
|
2天前
|
JavaScript
Vue 中如何模块化使用 Vuex
Vue 中如何模块化使用 Vuex
5 0
|
4天前
|
存储 资源调度 JavaScript
vue引入vuex
vue引入vuex
25 7
|
11天前
|
JavaScript
Vue 中如何模块化使用 Vuex
Vue 中如何模块化使用 Vuex
|
15天前
|
JavaScript 测试技术 开发者
Vue 3 Vuex:构建更强大的状态管理系统
Vue 3 Vuex:构建更强大的状态管理系统
23 1
|
16天前
|
存储 JavaScript
报错permission.js:41 [Vue warn]: Property “showClose“ must be accessed with “$data.showClose“ because
报错permission.js:41 [Vue warn]: Property “showClose“ must be accessed with “$data.showClose“ because
|
17天前
|
存储 JavaScript
Vue的状态管理:Vuex的使用和最佳实践
【4月更文挑战第24天】Vue状态管理库Vuex用于集中管理组件状态,包括State(全局状态)、Getters(计算属性)、Mutations(同步状态变更)和Actions(异步操作)。Vuex还支持Modules,用于拆分大型状态树。使用Vuex时,需安装并创建Store,定义状态、getter、mutation和action,然后在Vue实例中注入Store。遵循最佳实践,如保持状态树简洁、使用常量定义Mutation类型、避免直接修改状态、在Actions中处理异步操作、合理划分Modules,以及利用Vuex提供的插件和工具,能提升Vue应用的稳定性和可维护性。
|
18天前
|
JavaScript
Vue与原生JS中方法调用
Vue与原生JS中方法调用
7 0
|
23天前
|
JavaScript 前端开发 UED
Vue工具和生态系统: Vue.js和服务器端渲染(SSR)有关系吗?请解释。
Vue.js是一个渐进式JavaScript框架,常用于开发单页面应用,但其首屏加载较慢影响用户体验和SEO。为解决此问题,Vue.js支持服务器端渲染(SSR),在服务器预生成HTML,加快首屏速度。Vue.js的SSR可手动实现或借助如Nuxt.js的第三方库简化流程。Nuxt.js是基于Vue.js的服务器端渲染框架,整合核心库并提供额外功能,帮助构建高效的应用,改善用户体验。
20 0
|
23天前
|
JavaScript 前端开发 开发者
Vue工具和生态系统: Vue.js和TypeScript可以一起使用吗?
【4月更文挑战第18天】Vue.js与TypeScript兼容,官方文档支持在Vue项目中集成TypeScript。TypeScript作为JavaScript超集,提供静态类型检查和面向对象编程,增强代码准确性和健壮性。使用TypeScript能提前发现潜在错误,提升代码可读性,支持接口和泛型,使数据结构和函数更灵活。然而,不是所有Vue插件都兼容TypeScript,可能需额外配置。推荐尝试在Vue项目中使用TypeScript以提升项目质量。
16 0
|
23天前
|
资源调度 JavaScript 前端开发
Vue工具和生态系统: 如何使用Vue.js实现服务端渲染(SSR)?不少于500字
Vue.js框架用于构建用户界面,而服务端渲染(SSR)能提升首屏加载速度和SEO。以下是使用Vue.js实现SSR的简要步骤:1) 安装vue、vue-server-renderer和express依赖;2) 创建Vue应用如`vue create my-ssr-app`;3) 使用express创建服务器;4) 在Express应用中设定路由处理所有请求;5) 创建渲染器将Vue应用转为HTML;6) 运行服务器如`node my-ssr-app/server.js`。实际应用可能涉及动态内容、状态管理和错误处理等复杂情况。
26 1