Vuex的核心概念及作用

核心概念

Store 有五个核心的概念,State、Getters、Mutations、Actions、Modules。你都必须要知道它们的作用是什么。

State 状态

我们每一个项目,基本上都是使用同一个 store 实例,所以 State 也是共用一个,State 是一个对象,也是唯一一个数据源,整个 Store 中的数据都从 State 中进行管理存储。State 其实就像是 Vue 实例中的选项 data。

基础案例

在组件中获取 State 数据

由于 State 是响应式的,所以能够结合计算属性将其返回。每当 state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。

<template><div class="home">{{ count }}</div>
</template><script>
export default {computed: {count() {return this.$store.state.count}}
}
</script>

通过 mapState 辅助函数获取 State 数据

当一个组件需要获取多个 State 状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,从而优化你的代码。

<template><div class="home">{{ count }}</div>
</template><script>
import { mapState } from 'vuex'export default {computed: {...mapState({count: (state) => state.count,name: (state) => state.name})}
}
</script>

Getters 计算属性

有时候我们需要从 store 中的 state 中派生出一些状态,这种情况就需要用到 getters。其实 getters 就是和计算属性 computed 一样的。因为有些情况你觉得 state 的数据不是你想要的格式,你想在其基础上加工进行处理,然后在进行使用,当然也不会影响原始 state 的值。

基础案例

定义 Getters ,在原始 State 基础上进行加工

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {name: 'xiaoming'},getters: {name(state) {return 'my name is ' + state.name}}
})export default store

在组件中获取 Getters 数据

<template><div class="home">{{ name }}</div>
</template><script>
export default {computed: {name() {return this.$store.getters.name}}
}
</script>

通过 mapGetters 辅助函数获取 Getters 数据

<template><div class="home">{{ myName }}</div>
</template><script>
import { mapGetters } from 'vuex'export default {computed: {// 把 `this.name` 映射为 `this.$store.getters.name`...mapGetters({myName: 'name'})}
}
</script>

Mutations 同步修改 State

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。mutations 非常类似 Vue 在调用子组件时,给子组件传递了数据,子组件通过 $emit 通知父组件修改数据。都采用单向数据流的方式。

基础案例

定义 mutations

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {count: 0},mutations: {increment(state, payload) {state.count += payload.num}}
})export default store

提交载荷(Payload)

通过 $store.commit 进行调用 mutations,并且可以传入额外的参数,即 mutation 的载荷(payload)。

<template><div class="home">{{ $store.state.count }}</div>
</template><script>
export default {mounted() {setTimeout(() => {this.$store.commit('increment', { num: 10 })}, 1000)}
}
</script>

通过 mapMutations 辅助函数获取 mutations 函数

你可以在组件中使用 this.$store.commit('$mutationsName') 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 $store.commit 调用。

<template><div class="home">{{ $store.state.count }}</div>
</template><script>
import { mapMutations } from 'vuex'
export default {methods: {// 将 `this.myIncrement()` 映射为 `this.$store.commit('increment')`...mapMutations({myIncrement: 'increment'})},mounted() {setTimeout(() => {this.myIncrement({ num: 10 })}, 1000)}
}
</script>

Mutation 需遵守 Vue 的响应式规则

既然 Vuex 的 store 中的状态是响应式的,那么当我们变更状态时,监视状态的 Vue 组件也会自动更新。这也意味着 Vuex 中的 mutation 也需要与使用 Vue 一样遵守一些注意事项:例如最好提前在你的 Store 中初始化好所有所需的状态 State。


Mutation 必须是同步函数

一条重要的原则就是要记住 mutation 必须是同步函数,并且内部的逻辑也是同步的。如果是异步的则导致状态无法被正常跟踪。

Actions 异步提交 Mutations

在 mutation 中混合异步调用会导致你的程序很难调试。例如,当你调用了两个包含异步回调的 mutation 来改变状态,你怎么知道什么时候回调和哪个先回调呢?这就是为什么我们要区分这两个概念。在 Vuex 中,mutation 都是同步事务,都必须是即刻修改当前状态。

Actions 类似于 mutation,它们之间不同的地方是,Actions 提交的是 mutation,而不是直接变更状态 state。Actions 是异步的,函数内可以包含任意异步操作。

基础案例

定义 actions

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {count: 0},mutations: {increment(state, payload) {state.count += payload.num}},actions: {incrementAsync({ commit }, payload) {setTimeout(() => {commit('increment', payload)}, 1000)}}
})export default store

分发 actions

actions 通过 $store.dispatch 方法触发。

<template><div class="home">{{ $store.state.count }}</div>
</template><script>
export default {mounted() {this.$store.dispatch('incrementAsync', {num: 10})}
}
</script>

通过 mapActions 辅助函数获取 actions 函数

<template><div class="home">{{ $store.state.count }}</div>
</template><script>
import { mapActions } from 'vuex'export default {methods: {// 将 `this.myIncrementAsync()` 映射为 `this.$store.dispatch('incrementAsync')`...mapActions({myIncrementAsync: 'incrementAsync'})},mounted() {this.myIncrementAsync({ num: 10 })}
}
</script>

Module 模块

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

为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、getters、mutations、actions、module。

基础案例

定义 module

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const moduleA = {namespaced: true,state: {count: 0,name: 'xiaoming'},getters: {name(state) {return 'my name is ' + state.name}},mutations: {increment(state, payload) {state.count += payload.num}},actions: {incrementAsync({ commit }, payload) {setTimeout(() => {commit('increment', payload)}, 1000)}}
}const store = new Vuex.Store({modules: {a: moduleA}
})export default store

通过 mapState 辅助函数获取 State 数据

<template><div class="home">{{ name }}</div>
</template><script>
import { mapState } from 'vuex'export default {computed: {// 把 `this.name` 映射为 `this.$store.state.a.name`...mapState({name: (state) => state.a.name})}
}
</script>

通过 mapGetters 辅助函数获取 Getters 数据

<template><div class="home">{{ myName }}</div>
</template><script>
import { mapGetters } from 'vuex'export default {computed: {// 把 `this.myName` 映射为 `this.$store.getters['a/name']`...mapGetters({myName: 'a/name'})}
}
</script>

通过 mapMutations 辅助函数获取 mutations 函数

<template><div class="home">{{ $store.state.a.count }}</div>
</template><script>
import { mapMutations } from 'vuex'
export default {methods: {// 将 `this.myIncrement()` 映射为 `this.$store.commit('a/increment')`...mapMutations({myIncrement: 'a/increment'})},mounted() {setTimeout(() => {this.myIncrement({ num: 10 })}, 1000)}
}
</script>

通过 mapActions 辅助函数获取 actions 函数

<template><div class="home">{{ $store.state.a.count }}</div>
</template><script>
import { mapActions } from 'vuex'export default {methods: {// 将 `this.myIncrementAsync()` 映射为 `this.$store.dispatch('a/incrementAsync')`...mapActions({myIncrementAsync: 'a/incrementAsync'})},mounted() {this.myIncrementAsync({ num: 10 })}
}
</script>

原文链接:菜园前端

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

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

相关文章

聊聊2023年怎么入局小游戏赛道?

一、微信小游戏赛道发展史 第一阶段&#xff1a;轻度试水期&#xff0c;2017&#xff5e;2019年 微信小游戏于2017年底上线&#xff0c;初期以轻度休闲为主&#xff0c;例如棋牌、合成消除以及益智相关游戏类型。一是开发门槛不高&#xff0c;产品可以快速上线; 二是大部分厂…

虹科方案 | 汽车CAN/LIN总线数据采集解决方案

全文导读&#xff1a;现代汽车配备了复杂的电子系统&#xff0c;CAN和LIN总线已成为这些系统之间实现通信的标准协议&#xff0c;为了开发和优化汽车的电子功能&#xff0c;汽车制造商和工程师需要可靠的数据采集解决方案。基于PCAN和PLIN设备&#xff0c;虹科提供了一种高效、…

mac(M1)卸载miniconda3

参考https://stackoverflow.com/questions/29596350/how-to-uninstall-mini-conda-python step1 因为我目前只有一个base环境&#xff0c;所以直接在这个环境中安装 anaconda-clean即可 conda install anaconda-clean然后继续输入 anaconda-clean如果不加–yes&#xff0c;那…

[nltk_data] Error loading stopwords: <urlopen error [WinError 10054]

报错提示&#xff1a; >>> import nltk >>> nltk.download(stopwords) 按照提示执行后 [nltk_data] Error loading stopwords: <urlopen error [WinError 10054] 找到路径C:\\Users\\EDY\\nltk_data&#xff0c;如果没有nltk_data文件夹&#xff0c;在…

《安富莱嵌入式周报》第324期:单对以太网技术实战,IROS2023迪士尼逼真机器人展示,数百万模具CAD文件下载,闭环步进电机驱动器,CANopen全解析

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; 第8期ThreadX视频教程&#xff1a;应用实战&#xff0c;将裸机工程移植到RTOS的任务划分…

黑马点评-05缓存穿透问题及其解决方案,缓存空字符串或使用布隆过滤器

缓存穿透问题(缓存空) 缓存穿透的解决方案 缓存穿透(数据穿透缓存直击数据库): 缓存穿透是指客户端请求访问缓存中和数据库中都不存在的数据,此时缓存永远不会生效并且用户的请求都会打到数据库 数据库能够承载的并发不如Redis这么高&#xff0c;如果大量的请求同时访问这种…

【nginx】nginx部署升级htpp+websocket访问

关注todo-step1和todo-step2就行了&#xff1a; user root; …… http {### Basic Settings##sendfile on;tcp_nopush on;types_hash_max_size 2048;client_max_body_size 10240m;include /etc/nginx/mime.types;default_type application/octet-stream;# 配置websocket访问 *…

基于YOLOv5、YOLOv8的火灾检测(超实用项目)

目录 1.简介 2.YOLO算法 3.基于YOLOv5、YOLOv8的火灾检测 视频已上传b站 YOLOv5/YOLOv8的火灾检测&#xff08;超实用项目&#xff09;_哔哩哔哩_bilibili 本文为系列专栏&#xff0c;包括各种YOLO检测算法项目、追踪算法项目、双目视觉、深度结构光相机测距测速三维测量项…

[鹏城杯 2022]简单的php - 无数字字母RCE(取反)【*】

[鹏城杯 2022]简单的php 一、解题流程二、思考总结 题目代码&#xff1a; <?php show_source(__FILE__);$code $_GET[code];if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello);}e…

epoll 定时器

参考&#xff1a; Linux下使用epoll监听定时器-CSDN博客 但是这个用的是gettimeofday。 本人使用的是 #include <stdlib.h> #include<stdio.h> #include <sys/timerfd.h> #include <sys/epoll.h> #include <unistd.h> #include <sys/time.…

hbba网站下载国家标准/行业标准的方法

hbba网站是不提供下载按钮并且不支持右键的&#xff0c;那么如何下载呢&#xff1f; 1、首先看一下pdf有多少页&#xff0c;一般标准介绍上有写。 2、使用edge或google浏览器打开pdf预览页面&#xff0c;打开开发者模式&#xff0c;用小箭头指向第一页&#xff0c;这样就获取到…

短视频矩阵源码开发部署---技术解析

一、短视频SEO源码搜索技术需要考虑以下几点&#xff1a; 1. 关键词优化&#xff1a;通过研究目标受众的搜索习惯&#xff0c;选择合适的关键词&#xff0c;并在标题、描述、标签等元素中进行优化&#xff0c;提高视频的搜索排名。 2. 内容质量&#xff1a;优质、有吸引力的内…

Qt QGridLayout和QFormLayout案例分析

QGridLayout和QFormLayout是Qt中常用的布局管理器&#xff0c;可以用于在应用程序中设置控件的位置和大小。 QGridLayout网格布局(栅格布局) QGridLayout是一个网格布局管理器&#xff0c;可以将控件放置在一个二维网格中。在QGridLayout中&#xff0c;控件可以跨越多个行和列…

在原生html中使用less

引入less <link rel"stylesheet/less" href"./lessDemo.less" /><script src"./js/less.min.js"></script> less.min.js文件下载地址:https://github.com/less/less.js 注意&#xff1a;less文件在前&#xff0c;js文件在后…

LabVIEW玩转魔方

LabVIEW玩转魔方 使用LabVIEW创建一个3D魔方&#xff0c;并找出解谜题的秘密&#xff0c;给朋友留下深刻深刻的印象。游戏中内置的机制使每张脸都能独立转动&#xff0c;从而混合颜色。要解决难题&#xff0c;每个面必须是相同的纯色 魔方的奥秘在于它的简单性和不可解性。这是…

阶段六-Day02-Maven

一、学习Maven 使用Maven创建Web项目&#xff0c;并部署到服务器。 二、Maven介绍及加载原理 1. 介绍 Maven是使用Java语言编写的基于项目对象模型&#xff08;POM&#xff09;的项目管理工具。开发者可以通过一小段描述信息来管理项目的构建、报告和文档。 使用Maven可以…

day31

今日内容概要 组合 反射(通过字符串来操作属性) getattr setattr hasattr delattr 魔术方法(内置方法&#xff0c;双下滑线开头的方法) 异常(剩余一部分) 元类 组合 在一个类中以另外一个类的对象作为数据属性&#xff0c;称为类的组合 组合与继承都是用来解决代码的…

【已解决】Python打包文件执行报错:ModuleNotFoundError: No module named ‘pymssql‘

【已解决】Python打包文件执行报错&#xff1a;ModuleNotFoundError: No module named pymssql 1、问题2、原因3、解决 1、问题 今天打包一个 tkinter pymssql 的项目的时候&#xff0c;打包过程很顺利&#xff0c;但是打开软件的时候&#xff0c;报错 ModuleNotFoundError: …

unity操作_刚体 c#

刚体Rigidbody 首先在场景中创建一个Plane 位置重置一下 再创建一个Cube 充值 y0.5 我们可以看出创建的Cube 和 Plane都自带碰撞器 Plane用的是网格碰撞器 我们可以通过网格世界看到不同的网格碰撞器 发生碰撞&#xff08;条件&#xff09;&#xff1a; 两个物体都有碰撞器 …

CentOS Integration SIG 正式成立

导读CentOS 董事会已批准成立 CentOS Integration Special Interest Group (SIG)。该小组旨在帮助那些在 Red Hat Enterprise Linux (RHEL) 或特别是其上游 CentOS Stream 上构建产品和服务的人员&#xff0c;验证其能否在未来版本中继续运行。 红帽 RHEL CI 工程师 Aleksandr…