Vue3 的状态管理主要是通过 Vuex 4 来实现。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

在Vue3的状态管理中,以下是各个属性的作用:

  • state:存储应用程序中的状态数据。它可以包含任何类型的数据,包括基本类型、对象、数组等。可以通过commit和dispatch方法来修改state中的数据。
  • getters:允许你基于 store 中的 state 数据进行计算。类似于Vue组件中的计算属性。通过getters,我们可以将store中的状态数据进行加工、过滤、处理后再返回给组件使用,而无需在组件中手动操作state数据。
  • mutations:用于修改store中的状态数据。每个mutation都有一个字符串的类型和一个handler函数。在handler函数中,我们可以进行同步操作来修改state中的数据。需要注意的是,mutations中的函数必须是同步函数,否则会导致状态不可预测。
  • actions:用于处理异步任务以及提交mutations。在actions中,我们可以编写异步代码,例如向后端API发送请求获取数据等操作。然后通过commit方法提交mutation,以更新state中的数据。actions中的函数是可以是异步函数的,因此我们可以在其中执行异步操作。
  • modules:允许我们将store分割成模块,每个模块都有自己的state、mutations、actions、getters等,以便于管理和维护。每个模块都可以有自己的子模块,形成树状结构。

总的来说,状态管理的主要作用是将组件中的状态数据集中管理,从而避免了在不同组件之间传递大量的数据。同时,使用状态管理可以使我们更好地组织代码,将逻辑分离,提高代码的可维护性和可读性。

下面是一个简单的示例,演示了如何在 Vue3 中使用 Vuex 4 来实现状态管理。

首先,在项目中安装 Vuex 4:

npm install vuex@next --save

然后,在应用程序的入口文件中,创建一个 Vuex store 并导出它:

import { createStore } from 'vuex'

const store = createStore({
state() {
return {
count: 0
}
},
mutations: {
increment(state) {
state.count++
},
decrement(state) {
state.count--
}
},
actions: {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
},
getters: {
count(state) {
return state.count
}
}
}) export default store

在上面的示例中,createStore() 函数用于创建一个 Vuex store。在 state 对象中,定义了应用程序的状态,这里只定义了一个 count 属性,并初始化为 0。在 mutations 对象中,定义了修改状态的方法,这里定义了两个方法:incrementdecrement。在 actions 对象中,定义了异步操作的方法,这里定义了一个名为 incrementAsync 的方法,它在 1 秒后调用 increment 方法。在 getters 对象中,定义了计算属性的方法,这里定义了一个名为 count 的计算属性。

接着,在应用程序的入口组件中,使用 useStore() 函数来注入 Vuex store:

<template>
<div>
<h1>Count: {{ count }}</h1>
<button @click="increment">Increment</button>
<button @click="decrement">Decrement</button>
<button @click="incrementAsync">Increment Async</button>
</div>
</template> <script>
import { defineComponent, useStore } from 'vue' export default defineComponent({
setup() {
const store = useStore() const increment = () => {
store.commit('increment')
} const decrement = () => {
store.commit('decrement')
} const incrementAsync = () => {
store.dispatch('incrementAsync')
} return {
count: store.getters.count,
increment,
decrement,
incrementAsync
}
}
})
</script>

在上面的示例中,useStore() 函数用于注入 Vuex store,并将其赋值给 store 变量。然后,定义了三个方法:incrementdecrementincrementAsync,它们分别调用了 Vuex store 中定义的 incrementdecrementincrementAsync 方法。在组件的 return 语句中,使用 store.getters.count 访问了计算属性 count 的值,以供模块调用。

Vue3提供了一个新的状态管理工具,即Vuex 4。它与Vue3一起使用,可用于在应用程序中管理全局状态。Vuex 4的设计目标是在减少样板代码的同时提高开发人员的工作效率和开发速度。

与Vuex 3相比,Vuex 4的一个重要改变是将核心代码与Vue3的新响应式API集成在一起。这意味着你不需要使用getter和setter来声明状态或修改它们,而可以使用Vue3的新响应式API。

import { createStore } from 'vuex'

const counterModule = {
state() {
return {
count: 0
}
},
mutations: {
increment(state) {
state.count++
},
decrement(state) {
state.count--
}
},
actions: {
asyncIncrement(context) {
setTimeout(() => {
context.commit('increment')
}, 1000)
}
},
getters: {
doubledCount(state) {
return state.count * 2
}
}
} const store = createStore({
modules: {
counter: counterModule
}
}) export default store

在这个例子中,我们使用createStore函数创建一个新的Vuex store。counterModule是一个包含计数器状态的模块,其中包含一个state对象,用于存储计数器值,以及mutationsactionsgetters对象,用于操作和派生计数器状态。

最后,我们将计数器模块添加到store中,以便在应用程序中访问它。现在我们已经设置好了Vuex 4 store,我们可以在Vue3应用程序中使用它来管理全局状态。

vue全家桶进阶之路39:Vue3 状态管理的更多相关文章

  1. Vue 全家桶 + Electron 开发的一个跨三端的应用

    代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...

  2. Vue全家桶高仿小米商城

    大家好,我是河畔一角,时隔半年再次给大家带来一门重量级的实战课程:<Vue全家桶高仿小米商城>,现在很多公司都在参与到商城的构建体系当中,因此掌握一套商城的标准开发体系非常重要:商城的开始 ...

  3. vue证明题一,vue全家桶的构成

    简单说下vue的构成,当然是简单为主,网上这东西满天飞,简单说几句就ok 1.vue是什么 vue读作view,是一种js框架.只关注于视图层,操作内容包括js,html,css 2.vue全家桶是什 ...

  4. 用 Vue 全家桶二次开发 V2EX 社区

    一.开发背景 为了全面的熟悉Vue+Vue-router+Vuex+axios技术栈,结合V2EX的开放API开发了这个简洁版的V2EX. 在线预览 (为了实现跨域,直接npm run dev部署的, ...

  5. Vue全家桶

    简介 “简单却不失优雅,小巧而不乏大匠”. Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计. 为什么 ...

  6. 从零开始系列之vue全家桶(3)安装使用vuex

    什么是vuex? vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象. 即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. ...

  7. 使用vue全家桶制作博客网站

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...

  8. 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程

    使用vue全家桶制作博客网站   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...

  9. Vue全家桶介绍

    一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...

  10. 一个简单的假vue全家桶(vue+vue-router+require)

    首先说明我觉得这是一个比较好理解的vue全家桶(虽然是假的),模块化也是用require来做的,而且如果后期有必要压缩我也会用gulp来做 1.依赖个个本地模块,require只是用来载入page,这 ...

随机推荐

  1. Grafana Dashboard

    Grafana Dashboard jvm micrometer (4701) jmx_export (8563) https://grafana.com/grafana/dashboards/856 ...

  2. lua脚本概述

    1.lua脚本非常简单,轻量级,易于c/c++调用 2. 协程 是什么,与线程有啥区别 ??

  3. 痞子衡嵌入式:盘点国内RISC-V内核MCU厂商(2021年发布产品)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内RISC-V内核MCU厂商(2021). 虽然RISC-V风潮已经吹了好几年,但2019年才是其真正进入主流市场的元年,最近国内大量 ...

  4. 详解AQS的7个同步组件

    摘要:AQS的全称为Abstract Queued Synchronizer,是在J.U.C(java.util.concurrent)下子包中的类. 本文分享自华为云社区<[高并发]AQS案例 ...

  5. graphviz 简单入门

    上一位负责画图的选手 CS Academy 由于不明原因暂时不能继续工作,所以本俱乐部招收了新选手 graphviz. 在 Linux 上,你可以这么下载: sudo apt install grap ...

  6. Linux防火墙与端口操作命令

    CentOS 7系统 目录 1. 防火墙操作命令 2. 端口操作命令 3. CentOS 7 下安装firewall 1. 防火墙操作命令 序号 作用 命令 1 查看防火墙状态 systemctl s ...

  7. Django笔记十之values_list指定字段取值及distinct去重处理

    这篇笔记将介绍 reverse.distinct.values 和 values_list 的用法. 本篇笔记目录如下: reverse() values() values_list() distin ...

  8. 解决vue中滚轮事件报错 Added non-passive event listener to a scroll-blocking 'mousewheel' event.告警

    参考:https://www.jianshu.com/p/23850d4cade8 参考:让页面滑动流畅得飞起的新特性:Passive Event Listeners

  9. scp上传文件No such file or directory 问题

        问题描述 window使用scp复制文件到linux时报 No such file or directory 错误 解决办法 本地复制到Linux,win环境必须用绝对路径 上传成功

  10. -O1 -O2 -O3 优化的原理是什么?

    一般来说,如果不指定优化标识的话,gcc就会产生可调试代码,每条指令之间将是独立的:可以在指令之间设置断点,使用gdb中的 p命令查看变量的值,改变变量的值等.并且把获取最快的编译速度作为它的目标. ...