Vuex基础

news2024/9/20 15:03:40

Vuex介绍

为什么会有Vuex?

https://v3.vuex.vuejs.org/zh/

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

Vue是采用集中式管理组件依赖的共享数据的一个工具,可以解决不同组件数据共享问题
在这里插入图片描述

在这里插入图片描述

①Actions执行异步操作获取数据
②Actions commit 到 Mutations中执行同步操作去修改State中数据
③组件从State中读取数据
④组件再调用Actions,最终将四部操作连接起来

总结:

  • 修改State状态必须通过Mutations
  • Mutations只能执行同步代码,类似ajax,定时器之类的代码不能在Mutations中执行
  • 执行异步代码,通过Actions,然后将数据提交给Mutations才可以完成
  • State的状态即共享数据,可以再组件中引用
  • 组件中可以调用Actions

Vuex使用

下载

yarn add vuex@3.5.1

src/store/index.js中创建vuex实例并对外暴露

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
    // ...
})

export default store

main.js中引入store并挂载到Vue实例上

import store from './store'

new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app')

vuex–state

state放置所有公共状态的属性,如果你有一个公共状态数据,你只需要定义在state对象中

定义state

store/index.js

// 初始化vuex对象
const store = new Vuex.Store({
    state: {
        // 管理数据
        count: 0
    }
})

如何在组件中获取count?

在组件中获取count的两种方式

原始形式–插值表达式

Goods.vue
组件中可以使用 this.$store 获取到 vuex 中的 store 对象实例,可通过state属性获取count

<div>
	state数据{{ $store.state.count }}
</div>
<script>
export default {
    created() {
        console.log(this.$store.state.count)
    }
}
</script>

辅助函数–mapState

mapState是辅助函数,帮助我们把store中的数据映射到组件的计算属性中,属于一种方便用法

List.vue
① 导入mapState
② 采用数组形式引入state属性
③ 利用展开运算符将导出的状态映射给计算属性

<template>
    <div>
        List
        {{ count }}
    </div>
</template>

<script>
import { mapState } from 'vuex';
export default {
    computed: {
    	// 当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组
    	// mapState 函数返回的是一个对象
    	// 使用对象展开运算符将此对象混入到外部对象中
        ...mapState(['count']),
        // 类似于
        // count() {
        //     return this.$store.state.count
        // }
    }
}
</script>

vuex-mutations

state数据的修改只能通过mutations,并且mutations必须是同步更新,目的是形成数据快照
数据快照:一次mutation的执行,立刻得到一种视图状态,所以必须是同步

定义mutations

store/index.js

// 初始化vuex对象
const store = new Vuex.Store({
    state: {
        // 管理数据
        count: 70,
    },
    // 定义mutations
    mutations: {

    }
})

mutations是一个对象,对象中存放修改state的方法

// 定义mutations
mutations: {
	// 方法里的参数 第一个参数是当前store的state属性
	// 第二个参数 payload 运输参数 调用mutations时,可以传递参数        
	addCount(state) {
            state.count += 1
    },
	addCountN(state, n) {
		state.count += n
	}
}

在组件中调用mutations的两种方式

原始形式 $store

Goods.vue

<template>
    <div>
        <button @click="addCount">+1</button>
    </div>
</template>

<script>
export default {
    methods: {
        addCount() {
            // 调用store中的mutations,提交给mutations
            // commit('mutations方法名',参数)
            this.$store.commit('addCount')
        }
    },
}
</script>

<style scoped></style>

带参数的传递

<button @click="addCountN(9)">+n</button>
methods: {
	addCountN(n) {
		this.$store.commit('addCountN', n)
	}
},

辅助函数–mapMutations

mapMutations和mapState很像,把位于mutations中的方法提取出来,可以将它导入到methods中

List.vue

<template>
    <div>
        List
        {{ count }}
        <button @click="addCount">+1</button>
        <button @click="addCountN(8)">+n</button>
    </div>
</template>

<script>
import { mapMutations, mapState } from 'vuex';
export default {
    computed: {
        ...mapState(['count']),
        // 类似于
        // count() {
        //     return this.$store.state.count
        // }
    },
    methods: {
        // 把位于mutations中的方法提取出来,可以将它导入到methods中
        ...mapMutations(['addCount', 'addCountN'])
    },
}
</script>

<style scoped></style>

vuex-actions

state是存放数据的,mutations是同步更新数据,actions是负责进行异步操作

定义actions

store/index.js

actions: {
        // 获取异步的数据 context 表示当前的store实例
        // 可以通过 context.state 获取状态
        // 也可以通过 context.commit 来提交 mutations
        // 也可以通过 context.dispatch 调用其他的action
        getAsyncCount(context) {
            setTimeout(() => {
                // 1秒后,要去修改state
                context.commit('addCount')
            }, 1000)
        }
    }

在组件中调用actions的两种方式

原始调用–$store.dispatch

<template>
<div>
	<button @click="addAsyncCount">+1Async</button>
</div>
</template>
<script>
export default {
    methods: {
        addAsyncCount() {
            this.$store.dispatch('getAsyncCount')
        }
    },
}
</script>

传参函数

  • actions
actions: {
	getAsyncCountN(context, n) {
		setTimeout(() => {
			// 1秒后,要去修改state
			context.commit('addCountN', n)
		}, 1000)
	}
}
  • 调用
<template>
    <div>
        <button @click="addAsyncCountN(6)">+nAsync</button>
    </div>
</template>

<script>
export default {
    methods: {
        addAsyncCountN(m) {
            this.$store.dispatch('getAsyncCountN', m)
        }
    },
}
</script>

辅助函数–mapActions

actions也有辅助函数,可以讲action导入到组件中

<template>
    <div>
        List
        {{ count }}
        <button @click="getAsyncCount">+1Async</button>
        <button @click="getAsyncCountN(6)">+nAsync</button>
    </div>
</template>

<script>
import { mapState, mapActions } from 'vuex';
export default {
    computed: {
        ...mapState(['count']),
        // 类似于
        // count() {
        //     return this.$store.state.count
        // }
    },
    methods: {
        ...mapActions(['getAsyncCount', 'getAsyncCountN'])
    },
}
</script>

<style scoped></style>

vuex-getters

除了state之外,有时还需从state中派生出一些状态,这些状态是依赖state的,会用到getters

state中定义了list数组,是1-10的数组

state: {
	list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
}

组件中需要显示大于5的数据,正常的方式,是需要list在组件中进行再一步的处理,但是getters可以帮助我们实现它

定义getters

getters: {
        // getters函数第一个参数是state
        // getters必须要有返回值
        filterList: (state) => state.list.filter((item) => item > 5)
    }

调用getters的两种方式

原始方式–getters

<ul>
	<li v-for="(item, index) in $store.getters.filterList">{{ item }}</li>
</ul>

辅助函数–mapGetters

List.vue

<template>
    <div>
        List
        {{ count }}
        <ul>
            <li v-for="(item, index) in filterList" :key="index">{{ item }}</li>
        </ul>
    </div>
</template>

<script>
import { mapState, mapGetters } from 'vuex';
export default {
    computed: {
        ...mapState(['count']),
        ...mapGetters(['filterList'])
        // 类似于
        // count() {
        //     return this.$store.state.count
        // }
    },
    methods: {
    },
}
</script>

<style scoped></style>

总结

原始形式
在这里插入图片描述

简便形式
在这里插入图片描述

  • state辅助函数映射到computed
  • mutations辅助函数映射到methods
  • actions辅助函数映射到methods
  • getters辅助函数映射到computed

vuex-Module

为什么会有模块化

由于使用单一状态树,引用的所有状态会集中到一个比较大的对象,当应用变得非常复杂的时候,store对象就会变得非常臃肿
我们把所有的状态都放在state中,项目变得越来越大的时候,vuex会变得越来越难以维护,所以就需要Vuex模块化

在这里插入图片描述

模块化简单应用

  • 定义两个模块 countModule 和 arrModule
  • countModule 管理状态 count
  • arrModule 管理状态 arr

store/index.js

import Vue from "vue"
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
    modules: {
        countModule: {
            state: {
                count: 0,
            }
        },
        arrModule: {
            state: {
                list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
            }
        }
    }
})

export default store
<template>
    <div>
        引入state中的数据---{{ $store.state.countModule.count }}
        <hr>
        <ul>
            <li v-for="item in $store.state.arrModule.list">{{ item }}</li>
        </ul>
    </div>
</template>

注意:获取子模块的状态,通过 $store.state.模块名.属性名 来获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技嘉 B660M Gigabyte Aorus Pro DDR4 i7-12700F 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板B660M Gigabyte Aorus Pro DDR4 处理器Intel Core i7-12700F 2.10 GHz, 25M Cache, up to 4.90 GHz已驱动 内存4 x Corsair Vengeance LPX 8GB 3…

多个SecurityFilterChain执行顺序问题,/oauth2/authorization报404

正常要请求/oauth2/authorization/{regId}跳转到authorization-uri进行认证的&#xff0c;但是搭建好之后&#xff0c;请求这个地址竟然直接报404了&#xff0c;说明oauth2的相关filter并没有生效&#xff0c;直接打到了dispatchServlet。 那到底是哪里的问题呢&#xff1f;de…

人机交互技术复习提纲

认知心理学与人机工程学是人机交互技术的理论基础&#xff0c;而多媒体技术、虚拟现实技术与人机交互是相互交叉和渗透的。 图形用户界面的英文简称为GUI GUI的特点是桌面隐喻技术 直接操纵 所见即所得 自然和谐的人机交互阶段 多通道交互 情感计算 虚拟现实 智能用户界面 自…

为了实现上网自由,我做了一个多功能串口服务器

项目作者&#xff1a;小华的物联网嵌入式之旅 介绍&#xff1a;从事电气自动化行业&#xff0c;多次获得物联网设计竞赛&#xff0c;爱好嵌入式设计开发&#xff0c;物联网开发。 设计方案思路的由来&#xff0c;是因为我们现在的开发板基本需要通过串口与WIFI模组或以太网模…

「2024」预备研究生mem-利润与利润率增长率问题

一、利润与利润率 二、增长率问题 易错题&#xff1a; 三、课后题 每日一练&#xff1a;

BC SAP ECC与 S4 pfcg不同

ECC PFCG 这里的账户咯&#xff0c;可以从Excel编辑好后&#xff0c;直接copy进去 但是在S4里里面&#xff0c;一次只能copy 这个页面范围内的行数&#xff0c;我的是14行&#xff0c;这个根电脑的分辨率有干系 &#xff0c;但是一定是不全的

ForkJoinPool的使用以及基本原理

文章目录 一、ForkJoinPool简介二、ForkJoinPool的基本原理1. 分治法2. 工作窃取 三、ForkJoinPool的使用场景1. 递归式的任务分解&#xff1a;2. 数据并行处理&#xff1a;3. 合并结果&#xff1a;4. 并行递归算法&#xff1a;5. 小结&#xff1a; 四、ForkJoinPool的基本使用…

第13节:特色数据——把握宏观经济脉搏

文章目录 中国主要宏观经济指标相关接口本节课任务 中国主要宏观经济指标 GDP&#xff08;国内生产总值&#xff09;&#xff1a;GDP是衡量一个国家或地区经济活动总量的指标&#xff0c;代表了一定时期内该国或地区所有最终产品和服务的市场价值总和。它反映了一个经济体的整体…

【花雕】青少年机器人教育等级评测模拟题_20200715(一级)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

分布式主键ID生成策略

小程序搜索“ 源码轻舟 ”后续将推出算法和面试模块 坚持学习&#xff0c;好文每日送达&#xff01; 业务系统对分布式ID的要求 唯一性&#xff1a;在分布式系统中&#xff0c;每个节点都需要生成唯一的标识符来确保数据的唯一性。传统的单点生成ID方式无法满足分布式环境下的…

音视频技术开发周刊 | 300

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 著名数据和AI企业Databricks&#xff0c;收购类ChatGPT开源平台MosaicML 6月27日&#xff0c;Databricks在官网宣布&#xff0c;以13亿美元&#xff08;约94亿元&#xff…

浅析便捷生活的新选择——抖音本地服务

抖音是一款风靡全球的短视频分享平台&#xff0c;其本地服务功能的发展也逐渐引起了广泛关注。本地服务是指抖音平台上的用户可以通过平台直接查找并使用周边的各种服务&#xff0c;比如美食外卖、快递配送、家政服务等。本地服务的发展对用户和商家都带来了很多便利和机遇。 首…

Spring Boot 中的 Spring Cloud Hystrix 是什么,原理,如何使用

Spring Boot 中的 Spring Cloud Hystrix 是什么&#xff0c;原理&#xff0c;如何使用 简介 在分布式系统中&#xff0c;服务之间的调用是不可避免的。但是&#xff0c;当一个服务调用另一个服务时&#xff0c;如果被调用的服务出现了故障或者延迟&#xff0c;那么调用者也会…

发布/上传Jar包到Maven中央仓库

1.注册Sonatype账号 2.项目申请&#xff0c;创建工单 2.1回复 groupId 域名 可以使用github&#xff0c; io.github.账号 创建工单根据评论回复&#xff0c;需要创建临时仓库&#xff0c;验证账户所有权。 3.gpg4win 地址&#xff1a;https://www.gpg4win.org/download.html &…

电子时钟制作(瑞萨RA)(5)----定时器驱动数码管

概述 要想让每个数码管显示不同的数字&#xff0c;但是数码管必须依次地被持续驱动&#xff0c;数码管之间的刷新速度应该足够快&#xff0c;这样就看不出来数码管之间在闪烁。刷新频率可以设置为2ms刷新一次&#xff0c;这样人眼就看不出闪烁了。 硬件准备 首先需要准备一个…

2011年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展

近年来&#xff0c;国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究&#xff0c;他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合&#xff0c;评价不同类型研究区的生态脆弱特征&#xff0c;其研究内容…

C++ STL --List

1. list的介绍及使用 1.1 list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指…

云原生之深入解析MySQL在K8S环境中部署与监控

一、准备工作 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL 是最好的 RDBMS (Relational Database Management System&am…

Spring Boot的Maven插件Spring Boot Maven plugin详解

1.Spring Boot的Maven插件Spring Boot Maven plugin详解 2.Maven插件之git-commit-id-plugin