vue全家桶进阶之路39:Vue3 状态管理
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 对象中,定义了修改状态的方法,这里定义了两个方法:increment 和 decrement。在 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 变量。然后,定义了三个方法:increment、decrement 和 incrementAsync,它们分别调用了 Vuex store 中定义的 increment、decrement 和 incrementAsync 方法。在组件的 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对象,用于存储计数器值,以及mutations、actions和getters对象,用于操作和派生计数器状态。
最后,我们将计数器模块添加到store中,以便在应用程序中访问它。现在我们已经设置好了Vuex 4 store,我们可以在Vue3应用程序中使用它来管理全局状态。
vue全家桶进阶之路39:Vue3 状态管理的更多相关文章
- Vue 全家桶 + Electron 开发的一个跨三端的应用
代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...
- Vue全家桶高仿小米商城
大家好,我是河畔一角,时隔半年再次给大家带来一门重量级的实战课程:<Vue全家桶高仿小米商城>,现在很多公司都在参与到商城的构建体系当中,因此掌握一套商城的标准开发体系非常重要:商城的开始 ...
- vue证明题一,vue全家桶的构成
简单说下vue的构成,当然是简单为主,网上这东西满天飞,简单说几句就ok 1.vue是什么 vue读作view,是一种js框架.只关注于视图层,操作内容包括js,html,css 2.vue全家桶是什 ...
- 用 Vue 全家桶二次开发 V2EX 社区
一.开发背景 为了全面的熟悉Vue+Vue-router+Vuex+axios技术栈,结合V2EX的开放API开发了这个简洁版的V2EX. 在线预览 (为了实现跨域,直接npm run dev部署的, ...
- Vue全家桶
简介 “简单却不失优雅,小巧而不乏大匠”. Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计. 为什么 ...
- 从零开始系列之vue全家桶(3)安装使用vuex
什么是vuex? vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象. 即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. ...
- 使用vue全家桶制作博客网站
前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...
- 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程
使用vue全家桶制作博客网站 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...
- Vue全家桶介绍
一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...
- 一个简单的假vue全家桶(vue+vue-router+require)
首先说明我觉得这是一个比较好理解的vue全家桶(虽然是假的),模块化也是用require来做的,而且如果后期有必要压缩我也会用gulp来做 1.依赖个个本地模块,require只是用来载入page,这 ...
随机推荐
- vue树形结构图
1.下载插件:cnpm i vue2-org-tree 2.下载less-loader不然报错(this.getOptions is not a function):npm install less- ...
- mfc edit只允许输入数字
1.给EDIT控件添加 EN_CHANGE 事件 2.事件中的代码如下: 1 CString strEditVidoe; 2 GetDlgItem( iId )->GetWindowText( ...
- 文件上传靶场 upload-labs Pass 5-10
Pass-5 .user.ini文件 根据我的观察,最新版的upload-labs第五关和旧版的不一样,这一关可以使用和Pass-10一样的方法通过,但是,其他所有的关卡都禁止了.ini文件的上传,就 ...
- 2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建
前言 去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容 ...
- 基于Kafka和Elasticsearch构建实时站内搜索功能的实践
作者:京东物流 纪卓志 目前我们在构建一个多租户多产品类网站,为了让用户更好的找到他们所需要的产品,我们需要构建站内搜索功能,并且它应该是实时更新的.本文将会讨论构建这一功能的核心基础设施,以及支持此 ...
- uniapp踩坑必备笔记
1.[配置]应用版本号名称有一个规则的字符串:1.0.0,规则是:大版本号,中版本号,小版本号. 2.[配置]应用版本号中的小版本号不能超过9,超过9的需要向上一个版本号进一(逢十进一). 3.[配置 ...
- 为什么HashMap查找比List快很多?
做两数之和这道题目时,引发了一个思考: 为什么两者运行时间相差如此之大???好残忍,我List比你HashMap到底差在哪**** 于是我一顿查资料.... 战犯哈希算法登场 哈希算法会根据你要存入的 ...
- 剑指 offer 第 3 天
第 3 天 字符串(简单) 剑指 Offer 05. 替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are h ...
- 动手造轮子自己实现人工智能神经网络(ANN),解决鸢尾花分类问题Golang1.18实现
人工智能神经网络( Artificial Neural Network,又称为ANN)是一种由人工神经元组成的网络结构,神经网络结构是所有机器学习的基本结构,换句话说,无论是深度学习还是强化学习都是基 ...
- crontab使用说明【一文搞懂Linux定时任务Crontab】
1.简介 cron是一个在后台运行调度的守护进程,而crontab是一个设置cron的工具.cron调度的是/etc/crontab文件. 2.centos安装crontab yum install ...