详解vue中vuex的用法

news2024/12/25 12:44:24

前言

说到 vuex 相信大家都不陌生,vuex 是一个专为 vue.js 应用程序开发的状态管理模式。vuex 背后的基本思想,就是单向数据流。今天我们就来好好聊聊 vuex

在这里插入图片描述


vuex?

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


状态管理?

状态就是数据。状态管理可以简单理解为把需要多个组件共享的变量全部存储在一个对象里面。然后将这个对象放在顶层的 vue 实例中,让其他组件可以使用。通过使用 vuex 可集中管理组件之间的数据(状态),使组件之间的数据共享变得简单。


如何安装 vuex?

1. 通过 npm 方式安装。

npm i vuex --save
npm i vuex@3.6.2 --save //安装特定版本
yarn add vuex //yarn安装方式

2. 在 main.js 中引入,然后挂载到 Vue 实例里。

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

3. 在 scr 目录下创建一个 store/index.js 文件,写入以下内容。

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {}
const getters = {}
const mutations = {}
const actions = {}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
})

vuex 的核心

一、state

state 简单来说就是一个状态,用户界面会随着 state 变化而变化。


栗子:

store/index.js 文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
  name: "金闯",
  age: 18,
  count: 0
}
const getters = {}
const mutations = {}
const actions = {}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
})

任意 .vue 文件中使用

<template>
  <div>
    <h5>姓名:{{$store.state.name}}</h5>
    <h5>年龄:{{$store.state.age}}</h5>
    <h5>工龄:{{$store.state.count}}</h5>
  </div>
</template>

页面效果

在这里插入图片描述

使用语法糖辅助函数(mapState)⤵


二、getter

getter 就是一个计算属性。对 state 数据进行计算(会被缓存),类似于 vue 组件中的 computed,对 state 里的数据进行一些过滤、改造等等,例如我们要在 state.count 的基础上派生出一个新的状态 newCount 出来,就适合使用 getter 属性。


栗子:

store/index.js 文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
  count: 5
}
const getters = {
  newCount: state => state.count * 6
}
const mutation = {}
const actions = {}

export default new Vuex.Store({
  state,
  getters,
  mutation,
  actions,
})

任意 .vue 文件中使用

<template>
  <div>{{newCount}}</div>
</template>
<script>
export default {
  computed: {
    newCount() {
      return this.$store.getters.newCount;
    },
  },
};
</script>

页面效果

在这里插入图片描述

使用语法糖辅助函数(mapGetters)⤵


三、mutation

mutation 就是改变状态,唯一可修改 state 数据的场所。


栗子:

store/index.js 文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
  count: 0
}
const getters = {}
const mutations = {
  addWay(state, num) {
    state.count = state.count + num;
    console.log(state.count);
  },
  minusWay(state) {
    state.count--;
    console.log(state.count);
  },
}
const actions = {}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
})

任意 .vue 文件中使用

<template>
  <div>
    <el-button @click="addOn"></el-button>
    <el-button @click="minusOn"></el-button>
  </div>
</template>

<script>
export default {
  methods: {
    addOn() {
      this.$store.commit("addWay", 1); //每次+1
    },
    minusOn() {
      this.$store.commit("minusWay");
    },
  },
};
</script>

页面效果

在这里插入图片描述

使用语法糖辅助函数(mapMutations)⤵


四、action

action 就是一个异步操作,提交 mutation 执行异步操作(不是直接变更状态)。主要是用来解决异步流程来改变 state 数据。因为 mutation 是同步操作,如果你在 mutation 里进行异步操作,你会发现并不会起任何效果,故只能通过 action=>mutation=>state 流程修改。


栗子:

store/index.js 文件


import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
  count: 0
}
const getters = {}
const mutations = {
  minusWay(state) {
    state.count--;
    console.log(state.count);
  },
}
const actions = {
  asyncAdd(context) {
    setTimeout(() => {
      context.commit("minusWay")
    }, 500)
  }
}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
})

任意 .vue 文件中使用

<template>
  <div>
    <el-button @click="minusOn"></el-button>
  </div>
</template>

<script>
export default {
  methods: {
    minusOn() {
      this.$store.dispatch("asyncAdd"); //dispatch触发action函数
    },
  },
};
</script>

页面效果

在这里插入图片描述

使用语法糖辅助函数(mapActions)⤵


五、modules

vuex 允许我们将 store 分割到模块。目的是为了让代码更好维护,让多种数据分类更加明确,每个模块都拥有独立的 state、mutation、action、getter ,甚至是嵌套子模块从上至下进行类似下面的拆分:

const moduleA = {
  state: {},
  mutations: {},
  actions: {},
  getters: {},
}

const moduleB = {
  state: {},
  mutations: {},
  actions: {},
  getters: {},
}

const store = new Vue.store({
  modules: {
    moduleA,
    moduleB
  }
})

vuex 辅助函数(语法糖)

辅助函数可以把 vuex 中的数据和方法映射到 vue 组件中。达到简化操作的目的。


一、mapState(state)

栗子:

<template>
  <div>
    <!-- 直接使用 -->
    <h5>姓名:{{name}}</h5>
    <h5>年龄:{{age}}</h5>
    <h5>工龄:{{count}}</h5>
  </div>
</template>
<script>
import { mapState } from "vuex"; //从vuex中按需导入mapstate函数
export default {
  // 辅助函数使用
  computed: {
    ...mapState(["name", "age", "count"]),
  },
};
</script>

二、mapGetters(getter)

栗子:

<template>
  <div>{{newCount}}</div>
</template>
<script>
import { mapGetters } from "vuex"; //从vuex中按需导入mapGetters函数
export default {
  computed: {
    ...mapGetters(["newCount"]),
  },
};
</script>

三、mapMutations(mutation)

栗子:

<template>
  <div>
    <el-button @click="addOn"></el-button>
    <el-button @click="minusOn"></el-button>
  </div>
</template>
<script>
import { mapMutations } from "vuex"; //从vuex中按需导入mapMutations函数
export default {
  methods: {
    ...mapMutations(["addWay", "minusWay"]),
    addOn() {
      this.addWay(1); //直接调用
    },
    minusOn() {
      this.minusWay();// 直接调用
    },
  },
};
</script>

四、mapActions(action)

栗子:

<template>
  <div>
    <el-button @click="minusOn"></el-button>
  </div>
</template>
<script>
import { mapActions } from "vuex"; //从vuex中按需导入mapActions函数
export default {
  methods: {
    ...mapActions(["asyncAdd"]),
    minusOn() {
      this.asyncAdd(); // 直接调用
    },
  },
};
</script>

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

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

相关文章

【Linux】进程间通信之共享内存与信号量初识

目录&#x1f308;前言&#x1f338;1、System V共享内存&#x1f361;1.1、概念&#x1f362;1.2、原理&#x1f33a;2、共享内存相关函数和指令&#x1f361;2.1、shmget函数&#xff08;创建&#xff09;&#x1f362;2.2、shmctl函数&#xff08;控制&#xff09;&#x1f…

使用 DataAnnotations(数据注解)实现模型的通用数据校验

DataAnnotations 实现数据模型的通用校验参数校验的意义常用参数的校验.NET 中内置 DataAnnotations 提供的特性校验关于 DataAnnotations 中的特性介绍基于 DataAnnotations 的通用模型校验封装基于 DataAnnotations 的特性校验助手实现步骤如何使用 DataAnnotations 封装的特…

某农业学校 算法设计与分析-第五次实验-回溯算法

1. 罗密欧与朱丽叶的迷宫问题 问题描述 罗密欧与朱丽叶的迷宫。罗密欧与朱丽叶身处一个mn的迷宫中&#xff0c;如图所示。每一个方格表示迷宫中的一个房间。这mn个房间中有一些房间是封闭的&#xff0c;不允许任何人进入。在迷宫中任何位置均可沿8 个方向进入未封闭的房间。罗…

第二章:关系数据库

一、关系数据库结构及形式化定义 1、【单选题】 下图中&#xff0c;关系D1、D2、D3笛卡尔积的目和基数分别为 正确答案&#xff1a; B 2、【多选题】下图中能够作为候选码的属性组为 正确答案&#xff1a; ABD 3、【多选题】关于关系数据库&#xff0c;说法正确的是 正确答…

二、栈和队列

二、栈和队列 栈——后进先出 应用&#xff1a;数制转换、括号匹配、行编辑程序、迷宫求解、表达式求值、八皇后问题、函数调用、递归调用的实现 队列——先进先出 应用&#xff1a;脱机打印输出 多用户系统用户排队分时循环使用CPU和主存 按用户优先级排队&#xff0c;每…

编译gtest报错‘is_trivially_copy_constructible’ is not a member of ‘std’

编译gtest报错‘is_trivially_copy_constructible’ is not a member of ‘std’一、问题描述二、原因分析三、升级gcc版本四、验证一、问题描述 在一个新的Redhat7.6 linux虚拟机上&#xff0c;将gtest clone下来之后编译&#xff0c;一堆报错&#xff1a; /opt/googletest/…

多线程问题(二)(安全问题)

目录 一、多线程不安全引例 二、线程不安全的原因 1、线程是抢占式执行 2、多线程共享同一变量 3、对变量的操作不是原子性 4、内存可见性 5、指令重排序 三、线程不安全问题的解决方案 1、使用synchronized关键字进行加锁 a、 synchronized修饰普通方法 b、sy…

Maleimide-PEG-Biotin,Biotin-PEG-MAL,生物素PEG马来酰亚胺用于生物分子检测

化学试剂生物素聚乙二醇马来酰亚胺&#xff0c;其英文名为Maleimide-PEG-Biotin&#xff0c;Biotin-PEG-MAL&#xff0c;它所属分类为Biotin PEG Multi-arm PEGs。 该试剂质量控制为95%&#xff0c;试剂的储存条件为&#xff1a; -20℃长期保存&#xff0c;避光&#xff0c;干…

数据结构---图

&#xff08;一&#xff09; 相关知识点 图&#xff08;graph&#xff09;&#xff1a;图是由顶点的有穷非空集合和顶点之间边的集合组成&#xff0c;通常表示为&#xff1a;G(V,E)&#xff0c;其中&#xff0c;G表示一个图&#xff0c;V是图G中的顶点的集合&#xff0c;E是图G…

SpringBoot系列之自动装配原理详解

文章目录前言一、SpringBoot自动配置-Condition-11、观察spring自动创建bean过程2、创建自定义bean对象3、根据条件创建自定义bean二、 SpringBoot自动配置-Condition-2三、SpringBoot自动配置-切换内置web服务器1、查看继承关系图2、shiftdelete 排除Tomcat四、SpringBoot自动…

Win10启动Pycharm报错

Win10启动Pycharm报错报错信息解决方法报错信息 Internal error. Please report to http://jb.gg/ide/critical-startup-errors java.net.BindException: Address already in use: bind at java.base/sun.nio.ch.Net.bind0(Native Method) at java.base/sun.nio.ch.Net.bind(U…

如何在3个月内写出博士论文

在阅读本文之前&#xff0c;请注意&#xff1a;我花了三年半的时间进行全职研究&#xff0c;为我的博士论文收集数据&#xff1b;这三个月只涉及写作&#xff0c;我在最后很快就完成了。我并不是说每个人都能写得那么快&#xff0c;如果你没有做过研究&#xff0c;那是不可能的…

全国各省368个地级市河流密度数据(工具变量)

数据来源&#xff1a;国家基础地理信息中心 时间跨度&#xff1a;-- 区域范围&#xff1a;全国各省市 指标说明&#xff1a; 根据河流矢量和中国城市行政边界矢量地理信息&#xff0c;计算每个城市河流的总长度&#xff1b;根据各城市的行政区划面积&#xff0c;计算中国各城…

第三章:关系数据库标准语言SQL

一、sql概述和数据定义 1、【单选题】 create user A identified by B default tablespace C temporary tablespace D&#xff1b; 上述oracle数据库查询语句中A、B、C、D分别代表&#xff1a; 正确答案&#xff1a; A 2、【单选题】下表为患者缴费记录&#xff0c;现需…

2023跨年烟花3D最炫烟花,html最酷炫动态烟花源码分享,点击即可直接运行

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2022/12/25&#x1f4c5; 最近更新时间&#xff1a;2022/12/25&#x1f935; 此马非凡马&#xff0c;房星本是星。向前…

lambda表达式,函数式接口,链式编程,Stream流式计算

新时代的程序员&#xff1a;lambda表达式&#xff0c;函数式接口&#xff0c;链式编程&#xff0c;Stream流式计算 函数式接口 函数式接口&#xff1a;只有一个方法的接口(简化编程模型&#xff0c;在新版本框架底层中大量应用&#xff01;) 只要是 函数型接口 就可以使用lambd…

iOS 16.2 在 SwiftUI 子视图中无法关闭弹出的(sheet)导航视图(NavigationView)之解决

问题现象 iOS 16.2 中,若在 SwiftUI 4.0 里弹出(sheet)一个导航视图 A,则不能在 A 的子视图中将 A 关闭(dismiss): 如上图所示:上面的按钮直接放在导航视图 A 中,点击它可以直接关闭 A;而下面的按钮放在一个子视图中,点击它想要关闭 A 却没有任何反应。 那么,该如…

可转债网格交易策略回测

什么是网格交易策略&#xff1a;基于股票波动高抛低吸策略&#xff0c;自动化反复买卖赚取差价。投资者借助条件单&#xff0c;把资金分成多份&#xff0c;从基准价开始&#xff0c;每跌x%就自动买入一份&#xff0c;每涨y%就自动卖掉一份。股价越波动高抛低吸的机会越多 什么…

Java项目:springboot基于java+mysql+springboot的社区养老医疗综合服务平台

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为管理员、医生、病人三种角色&#xff0c; 管理员的功能包含如下&#xff1a; 个人信息&#xff1a;个人资料、修改密码 系统管理&…

Python入门学习之字符串与比较运算符

Python字符串 字符串或串(String)是由数字、字母、下划线组成的一串字符。 一般记为 : 1 s"a1a2an"(n>0) 它是编程语言中表示文本的数据类型。 python的字串列表有2种取值顺序: 从左到右索引默认0开始的&#xff0c;最大范围是字符串长度少1从右到左索引默认-1开…