vue开发:Vue的状态管理 - Vuex

news2025/1/14 1:12:16

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
我个人的理解是,如果有一些公共的数据需要在多个组件中共享或者某一个状态的改变会影响多个组件,那么这时候用vuex是非常合适的,比如我们经常会看到的中后台都有多风格的切换,这种全局的改变就可以用到vuex去完成!

vuex的基本使用

1、安装

npm install --save vuex

2、main.js中引入

import store from "./store";

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

3、在我们用vue/cli创建的项目的store/index.js中引入如下内容

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
  state: {},
  mutations: {},
  actions: {},
  modules: {}
});

vuex的四个核心

vuex中有四个核心,即以上代码中展示的 state、getter、 mutations、actions!
state
state: 定义了应用状态的数据结构,可以在这里设置默认的初始状态。

在store/index.js中的state中传入一个键值对 counter: 10,这个键值对就记录了一个counter的公共的数据初始状态!

export default new Vuex.Store({
  state: {
    counter: 10
  },
  ...
});

组件中通过 $store.state.counter 即可调用到conter的值,但一般我们会将这个状态放在计算属性当中!

以我们的项目为例,在src/components的路径下有一个HelloWorld.vue的组件,我们来通过封装一个count的计算属性来调用下counter的值:

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <p>{{ count }}:计算属性 </p>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  props: {
    msg: String
  },
  computed:{
    count(){
      return this.$store.state.counter
    }
  }
};
</script>

在这里插入图片描述
getters: 实际上是store的计算属性,类似于computed,对state里的数据进行一些过滤,改造等等,如果state中的值需要通过某种变换,才能传给用户查看,那么就可以在这里定义方法进行转换!

假设我们要在state.counter的基础上派生出一个新的状态powercount出来,这个状态需要counter相乘的结果, 我们就可以这样做!

getters 接受 state 作为其第一个参数:

export default new Vuex.Store({
  state: {
    counter: 10
  },
  getters: {
    pownercount(state){
      return state.counter * state.counter
    }
  },
});

在组件中可以通过$store.getters.pownercount获取新状态的值,继续在计算属性computed中构造一个powerconter方法,在组建中直接调用{{ powerconter }}即可!

<script>
export default {
  name: "HelloWorld",
  props: {
    msg: String
  },
  computed:{
    count(){
      return this.$store.state.counter
    },
    powerconter(){
      return this.$store.getters.pownercount
    },
  },
};
</script>

在这里插入图片描述
mutations: 提供修改 store中的状态的入口,必须是同步函数,也就是我们需要根据某些条件改变某个状态,即可在这里定义:

我们在 mutations 中定义了一个叫add的函数,函数体就是我们要进行更改的地方,会接受 state作为第一个参数,第二个是自定义传参,我们将状态counter的自增1:

export default new Vuex.Store({
  state: {
    counter: 10
  },
  getters: {
    pownercount(state){
      return state.counter * state.counter
    }
  },
  mutations: {
    add(state){
      return state.counter += 1
    }
  },
});

在组件中使用必须先声明一个方法,然后在methods中通过声明的方法加commit将这个方法传递过去:

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <p>{{ count }}:计算属性 </p>
    <!-- 点击count的值会自增1,调用的两种方式  -->
    <button @click="$store.commit('add')">add</button>
    <!-- 在methods中定义的方法  -->
    <button @click="addcount()">addcount</button>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  props: {
    msg: String
  },
  computed:{
    count(){
      return this.$store.state.counter
    },
    powerconter(){
      return this.$store.getters.pownercount
    },
  },
  methods:{
    addcount(){
      this.$store.commit('add');
    }
  }
};
</script>

为了方便随处调用我们一般在methods中定义一个方法使用!

<!-- 直接使用  -->
<button @click="$store.commit('add')">add</button>
<!-- 在methods中定义的方法  -->
<button @click="addcount()">addcount</button>

还可以通过在组件中引入vuex的mapMutations直接注册

<script>
// 引入mapMutations
import {mapMutations} from 'vuex'
export default {
  name: "HelloWorld",
  props: {
    msg: String
  },
  computed:{
    count(){
      return this.$store.state.counter
    },
    powerconter(){
      return this.$store.getters.pownercount
    },
  },
  methods:{
    ...mapMutations(['add'])
  }
};
</script>

调用:

<button @click="mutations中的方法名称('可带参数')">-</button>

actions:当需要异步更改数据时,通过 Action 提交的是 mutation,而不是直接变更状态。

Action 类似于 mutation,不同在于:

1、Action 提交的是 mutation,而不是直接变更状态。
2、Action 可以包含任意异步操作。

// store/index.js

export default new Vuex.Store({
  state: {
    counter: 10,
    // 新定义一个obj
    obj: {}
  },
  getters: {
    pownercount(state){
      return state.counter * state.counter
    }
  },
  mutations: {
    add(state){
      state.counter += 1;
    },
    // 修改state中的obj
    getparam(state, Object){
      state.obj = Object
    }
  },
  actions: {
    getparamsync(context, Object){
      // 模拟异步请求,延时3s
      setTimeout(()=>{
      	// 通过commit提交一个名为getparam的mutation
      	//action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation
        context.commit('getparam',Object)
      },3000)
    }
  },
});

在组建中通过$store.dispatch(‘increment’)触发调用

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <button @click="getVal()">getobj</button>
    <p>{{ $store.state.obj }}</p>
  </div>
<template>

 methods:{
    ...
    getVal() {
    	  let name= 'xia';
    	  let age= '26';
    	  let sex= 'man';
    	  //1.通过dispatch将方法getParamSync和多个参数{name,age,sex}传递给actions
    	  this.$store.dispatch('getparamsync',{name,age,sex})
       },
    ...
  }

在这里插入图片描述

modules

由于 Vuex 使用单一状态树,应用的所有状态会集中到一个比较大的对象。Vuex 允许将 store 分割成模块( module )。每个模块拥有自己的 state、mutation、action、getter 甚至是嵌套子模块——从上至下进行同样方式的分割。

modules: {
    // 如果有多个可以在这里独立分隔为多个模块
    a: {
    // App中调用{{ $store.state.a }}
      state: {
        name: 'vue'
      },
    // 其余组建中调用与外侧调用一致
      mutations: {},
      actions: {},
      getters: {}
    },
    b: {

    }
  }

在这里插入图片描述
在 Vuex 中说白了,任何的操作都是围绕 state 来进行的,Vuex 是状态管理器,作用就是管理 state 中的状态,其他提供的所有功能 Getter、Mutation、Action 都是为了能够更好的管理 state,而之所以设计成期望通过 Mutation 改变状态,是因为我们期望所有状态的变化都是有迹可循的!

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

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

相关文章

基础之linux常用命令精华

目录 第一章.shell 1.1查看内部命令 1.2外部命令存放于 echo $PATH 一个一个找&#xff0c;找到为止&#xff0c;找不到就报无命令 第二章.linux常用命令 2.1.编辑linux命令行的辅助操作 2.2命令帮助help和--help&#xff0c;man手册使用 2.3.目录和文件的管理命令 2.…

消失的她-InsCode Stable Diffusion 美图活动一期

一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; Model: Cute_Animals Version: v1.2.0 Size: 512x512 Model hash: 57bd734213 Steps: 20 Sampler: Heun CFG scale: 7 三、图…

操作系统中的线程进程和同步异步和并发并行

目录 一、进程和线程1.1 进程1.2 线程1.3 实现多任务的方法1.3.1 使用多进程实现多任务1.3.2 使用多线程(单个进程包含多个线程)实现多任务1.3.3 使用多进程多进程实现多任务 1.4 进程和线程的比较1.5 Java的多线程模型的应用 二、同步和异步2.1 同步2.2 异步 三、并发与并行3.…

QTday2

点击登录&#xff0c;登陆成功&#xff0c;跳转到新的界面 主函数 #include "widget.h" #include "second.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();Second s;QObject::connect…

MySQL数据库介绍流程(最新mysql)

版本介绍 第一步&#xff1a;下载MySQL数据库 1、下载地址&#xff1a;http://dev,mysql.com/downloads/windows/installer/8.0html 2、就是直接搜索&#xff1a;mysql官方 msyql官方网站 这里就安装成功 第二步&#xff1a;这么启动和停止mysql 第三步&#xff1a;这么快捷停…

B - Get an Even String

Get an Even String - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意&#xff1a;题目要使字符串变成偶字符串&#xff0c;对于每一个奇数i都和后面i1的位置字符相同。求给定字符串最少去掉几个字符能得到偶字符串。 解题思路&#xff1a;贪心&#xff0c;找每次第一对出现…

黑客(网安)自学

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…

5、Task_stat() always report used == size他两总是相等

1、今天想查看一下任务的堆栈使用情况&#xff0c;按官方手册加入下面调试下面代码 Task_Stat statbuf; /* declear buffer */ Task_stat(Task_self(),&statbuf); /*call func to get status */ If(statbuf.used > (statbuf.stackSize * 9 / 10)) { System_printf(“…

Python——— 函数大全

&#xff08;一&#xff09;初识函数 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;更能实现代码的一致性。一致性指的是&#xff0c;只要修改函数的 代码&#xff0c;则所有调用该函数的地方都能得到体现。 在编写函数时&#xff0…

LabVIEW开发空气动力学实验室的采集和控制系统

LabVIEW开发空气动力学实验室的采集和控制系统 在航空航天模拟设施中&#xff0c;通常的做法是准备一种针对当前正在进行的实验的数据采集和控制软件。该软件通常是根据当前要求编辑的更通用程序的修订版&#xff0c;或者可能是专门为该测试编写的自定义程序&#xff0c;具体取…

iview-admin前后台分离管理系统

加油&#xff0c;新时代打工人&#xff01; layui已淘汰&#xff0c;下面介绍vue管理后台系统&#xff0c;当然市场上不止下面一种框架。 layuimini后台管理系统的简单使用 iview-admin是iview生态圈的成员之一。是一套基于 Vue.js&#xff0c;搭配ivew UI(https://www.iviewu…

【LeetCode周赛】2022上半年题目精选集——二分

文章目录 2141. 同时运行 N 台电脑的最长时间解法1——二分答案补充&#xff1a;求一个int数组的和&#xff0c;但数组和会超int 解法2——贪心解法 2251. 花期内花的数目解法1——二分答案代码1——朴素二分写法代码2——精简二分⭐ 解法2——差分⭐⭐⭐ 2258. 逃离火灾解法1—…

在VSCode中导出安装的所有插件并在其他计算机进行导入

插件导出&#xff1a; 1、切换要导出的文件路径 cd D:\桌面文件\DownLoads2、导出到extensions文本 code --list-extensions > extensions.txt如图所示&#xff1a; 插件导入&#xff1a; 当您在另一台计算机上导出了 Visual Studio Code 编辑器已安装的扩展程序列表…

MySQL为什么选择B+树创建索引

不同方式查找数据 1. 全表遍历2. 哈希结构2.1 使用哈希结构创建索引的缺点2.2 哈希索引的适用性 3. 二叉搜索树4. AVL树5. B树6. B树6.1 B 树和 B 树的差异6.2 采用B树创建索引的优势6.3 一些需要注意的问题 1. 全表遍历 将磁盘中存储的所有数据记录依次加载&#xff0c;与给定…

linux下的mosquitto服务安装及使用(避坑指南)

Mosquitto是一个开源的MQTT消息代理服务器。MQTT是一个轻量级的、基于发布/订阅模式的消息传输协议。 mosquitto的安装使用比较简单&#xff0c;可以方便的来进行一些测试。 mosquitto介绍 Mosquitto的特点&#xff1a; 1. 轻量级&#xff1a;Mosquitto是一个轻量级的MQTT代理…

Git学习(mac)

Git基础 1.安装与配置 下载与安装&#xff1a;git官网 使用入口&#xff1a; win&#xff1a;右键菜单 git bash Mac: 终端 查看git版本&#xff1a; git --version使用Git工作之前&#xff0c;我们需要做个一次性的配置。方便后续Git能跟踪到谁做了修改&#xff0c;我们需…

第四章——复合类型

数组 数组&#xff08;array&#xff09;是一种数据格式&#xff0c;能够存储多个同类型的值。例如30个int类型的值&#xff0c;12个float类型的值。每个值都存储在一个独立的数组元素中&#xff0c;计算机在内存中依次存储数组的各个元素。 创建数组时应指出以下三点&#x…

10.1UEC++/UObject

1. 1.new出的对象&#xff0c;不用自己管理内存释放&#xff1b; 2.比如两个类对象指针a,b同时指向一个苹果&#xff0c;若苹果消亡&#xff0c;会将a,b同时指向空。 3.保存时&#xff0c;将工程中的actor&#xff0c;属性等能够保存在本地就是uob在发挥作用。 4.不管在ue&…

自然语言处理实战项目12-基于注意力机制的CNN-BiGRU模型的情感分析任务的实践

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目12-基于注意力机制的CNN-BiGRU模型的情感分析任务的实践&#xff0c;本文将介绍一种基于注意力机制的CNN-BiGRU模型&#xff0c;并将其应用于实际项目中。我们将使用多条CSV数据样例&#xff0…

虚拟机ubuntu系统IP地址变成127.0.0.1了

使用sudo dhclient -v指令动态获取IP地址 注意要把电脑网线拔掉&#xff0c;如果WIFI和有线同时连着设备就会出现如下情况 拔掉网线后正常