Vuex状态管理器

2023-11-07

目录

1、什么是vuex

2、vuex的使用场景:

3、vuex的工作方式: 

4、vuex的核心API

​ (1)state:

(2)mutations

(3)actions:通过actions去触发mutations中的方法,实现对state的异步修改

(4)getters:用于获取state的属性值。类似于state的计算属性

(5)modules:在大型项目中用于管理多个子模块的state

5、应用

        注意版本:vuex3对应的vue2,vuex4对应的vue3

​ (1)安装vuex

(2)定义vuex的store(仓库)

​ (3)在main.js文件中进行配置

(4)在组件中使用

6、强调

A、在组件中触发mutations中定义的方法:触发同步方法

B、在组件中触发actions中定义的方法:触发异步方法

C、获取state中属性值的方法:

D、在定义vuex的Store实例时不能使用this

  7、vuex的工作流程总结

(1)在组件中通过commit直接向mutations提交修改state的请求、或者通过dispatch向actions派发请求

(2)mutations通过接收到的请求去修改state的状态

(3)当state的状态发生改变后,组件通过计算属性(computed)获取改变后state,刷新组件


1、什么是vuex

vue项目中的状态管理器(状态管理工具),vue项目的状态是通过vue实例(组件)绑定的变量来体现。所以也可以说vuex是用来管理vue项目中的各种变量(vue项目中的组件可以访问vuex中管理的变量—- 方便了组件的通信)。

2、vuex的使用场景:

​ (1)不适合:小型的简单应用

​ (2)适合:大型的单页面应用

​ A、多个视图(组件)依赖同一个状态:

​ B、不同的视图的行为需要改变同一个状态

3、vuex的工作方式: 

(1)在全局中定义一个state:state本质是一个对象,该对象的属性就是vue组件用到的变量(所有组件共享这些变量)

​ (2)在vue组件中若要更新state的值,必须通过mutation来进行(只能通过mutations去改变state的状态),只能同步修改(即mutations中的方法都是同步)

​ (3)若要异步的修改state的值,需要通过actions来进行(action不能直接修改state,但是它可以向mutation发起请求,由mutation来修改state的值,可以在action中定义异步方法)

4、vuex的核心API

  • state 相当于data
  • mutations 相当于 methods (只能写同步)
  • action 相当于 methods中的异步方法 (只能写异步)
  • getters 相当于 computed 计算属性
  • modules 模块化思想

(1)state

        ​ A、必须是唯一的

​         B、本质是一个对象,维护的是vue的状态

​         const state= {

        ​         属性名:初始化值

​         }

​ 或:

        ​ state: {

​                 属性名:初始化值

        ​ }

(2)mutations

        ​ A、作用:用来修改state

        ​ B、定义了多个用于修改state的方法

​         C、只能包含同步代码

        ​ D、定义方式:

​ const mutations = {

​         方法名1(state,[data]){

​         //更改state的属性值

        },

        ​ 方法名2(state,[data]){

​         //更改state的属性值

​         }

​ }

​         E、触发方式:

                ​ a、在actions中通过 commit(‘mutations的方法名’ ) 实现触发

                ​ b、在组件中通过 this.$store.commit(‘方法名’,params) 实现触发

(3)actions:通过actions去触发mutations中的方法,实现对state的异步修改

​         A、可以包含异步代码

​         B、通过commit触发mutations来间接修改state

​         C、触发方式(如何触发actions):

                在组件中通过 this.$store.dispatch(‘action 名称’,  data1) 进行触发

        ​ D、定义方式:

         const actions = {

​                 方法名({commit,state},data1){

​                 commit(‘mutations中的方法名’)

​                 }

        ​ }

(4)getters:用于获取state的属性值。类似于state的计算属性

         A、定义方法:

​         const getters= {

​                 方法名([参数]){

​                 return state.属性名

​                 }

​         }

        ​ B、在组件中的使用方式: this.$store.getters.方法名

(5)modules:在大型项目中用于管理多个子模块的state

5、应用

        注意版本:vuex3对应的vue2,vuex4对应的vue3

​ (1)安装vuex

        ​ npm install vuex@3 或 npm i vuex@3 -S

(2)定义vuex的store(仓库)

         A、 src/store/store.js

        ​ B、导入vue和vuex

代码如下:

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

//全局注册vuex
Vue.use(Vuex);

//定义全局的store:即定义全局的状态管理器(数据仓库)
export default new Vuex.Store({
    state: {
        //定义状态属性并进行初始化,在组件中可以通过 this.$store.state.属性名 访问该属性
        count: 0,
        age: 25,
    
    },
    /**
     * (1)getters相当 组件中的计算属性
     * (2)作用:监听state中的状态值的改变
     * (3)用法: this.$store.getters.属性名
     */
    getters: {
        getAge(state) {//在组件中 通过this.$store.getters.getAge 获取state中的age值
            return state.age;
        },
        getCount(state){
            return state.count;
        }
    },
    /**
     * (1)mutations的作用:修改state的属性值
     * (2)要求:只能是同步
     * (3)定义方法时,要注意的问题
     *    A、方法的第一个参数默认是state
     *    B、方法的第二个参数: 表示调用该方法时传入的参数,本质为对象
     */
    mutations: {
        // 计数器加减(同步加减1)
        addCount(state, obj) {
            return state.count += obj.num;
        },
        subCount(state, obj) {
            return state.count -= obj.num;
        },
        //年龄组件 同步加减5
        addAge(state,obj){
            return state.age += obj.num;
        },
        subAge(state,obj){
            return state.age -= obj.num;
        }

    },
    /**
     * (1)actions的作用: 异步的方式来触发mutations,间接的实现state的修改
     * (2)定义方法: 在异步方法中带有一个参数content,该参数的作用是调用commit触发mutations
     */
    actions: {
        addCountAsyn(context) {//异步操作:2秒后count加1
            setTimeout(() => {
                //触发mutations中的方法
                context.commit('addCount', { num: 1 });
            }, 2000);
        },
        subCountAsyn(context) {
            setTimeout(() => {
                context.commit('subCount', { num: 1 })
            }, 2000);
        },
        
        //异步操作:2秒年龄加减5
        addAgeAsyn(context) {
            setTimeout(()=>{
                context.commit('addAge',{ num: 5});
            },2000)
        },
        subAgeAsyn(context) {
            setTimeout(()=>{
                context.commit('subAge',{num:5});
            },2000)
        }
    },

    module: {} //整合子store
})

​ (3)在main.js文件中进行配置

import Vue from 'vue'
import App from './App.vue'
import store from './store/store';//导入vuex的配置文件


new Vue({
  store,//在vue实例中引用
  render: h => h(App),
}).$mount('#app')

(4)在组件中使用

<template>
    <div>
        <h3>通过getters来获取vuex的count属性{{ getCount }}</h3>
        <p>通过$store.state.age获取年龄: {{ age }}</p>
        <button @click="handleAddAge()">年龄同步加5</button>
        <button @click="handleSubAge()">年龄同步减5</button>
        <button @click="handleAddAgeAsyn()">年龄异步加5</button>
        <button @click="handleSubAgeAsyn()">年龄异步减5</button>
    </div>
</template>

<script>
export default {
    name: 'Age',
    data() {
        return {

        }
    },
    computed: {
        getCount() {
            return this.$store.getters.getCount;
        },
        age() {
            return this.$store.state.age;
        },
    },
    methods: {
        // 同步处理
        handleAddAge() {
            return this.$store.commit('addAge', { num: 5 });
        },
        handleSubAge() {
            return this.$store.commit('subAge', { num: 5 });
        },
        //异步处理
        handleAddAgeAsyn() {
            return this.$store.dispatch('addAgeAsyn');
        },
        handleSubAgeAsyn() {
            return this.$store.dispatch('subAgeAsyn');
        }
    },
}
</script>

页面效果

6、强调

A、在组件中触发mutations中定义的方法:触发同步方法

​ this.$store.commit(‘mutations中定义的方法名’,参数)

B、在组件中触发actions中定义的方法:触发异步方法

​ this.$store.dispatch(‘actions中定义的方法名’)

C、获取state中属性值的方法:

(a)直接获取:this.$store.state.属性名

​ (b)通过getters: this.$store.getters.属性名

D、在定义vuex的Store实例时不能使用this

  7、vuex的工作流程总结

(1)在组件中通过commit直接向mutations提交修改state的请求、或者通过dispatch向actions派发请求

(2)mutations通过接收到的请求去修改state的状态

(3)当state的状态发生改变后,组件通过计算属性(computed)获取改变后state,刷新组件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vuex状态管理器 的相关文章

随机推荐

  • MIT6.824分布式系统lecture1笔记:Intro,MapReduce

    lecture1先对分布式系统的设计进行了概述 然后介绍了MapReduce的案例 Intro 为什么要使用分布式系统 1 追求高性能 通过分布式系统进行并行计算 2 使系统具有容错性 一台计算机计算错误 可以转移到另一台计算机 3 一些问
  • Docker部署Redis单机版

    1 拉取镜像 docker pull redis latest 2 创建挂载目录 mkdir r home egn redis conf mkdir r home egn redis data 3 修改配置文件 新建redis conf 节
  • 关于java.lang.NoClassDefFoundError: Could not initialize class xxx错误的原因和处理办法

    关于NoClassDefFoundError错误出现的原因有多种 网上其他博主也给出各种答案 但说的都比较广泛 这里博主说一下由于初始化失败而造成的NoClassDefFoundError错误 博主在一个Test这个类中使用了静态代码块 类
  • C#集合总结

    1 为什么引入集合 因为数组长度是固定的 为了建立一个动态的 数组 所以引入了集合 2 为什么引入ArrayList 非泛型集合 ArrayList可以填补数组的不足 进行元素的动态维护 数组的长度是固定的 而ArrayList的容量可以根
  • Android WebSocket状态管理框架 - WebSocketGo

    阅读本文需要 Integer MAX VALUE 分钟 故事背景 笔者所在的公司主营业务是智能家居 笔者在公司负责的Android端App的开发 关于智能家居 估计现在百分之八九十的童鞋都听过 但真正了解或者使用过的估计就不占多数了 本文不
  • 基于Python+WaveNet+CTC+Tensorflow智能语音识别与方言分类—深度学习算法应用(含全部工程源码)

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 Python 环境 Tensorflow 环境 模块实现 1 方言分类 数据下载及预处理 模型构建 模型训练及保存 2 语音识别 数据预处理 模型构建 模型训练及保存 3 模型测试
  • ESXI使用shell查看虚拟机

    1 按F2登录 选择Troubleleshooting Options 2 选择Enable ESXi Shell 回车启动Shell 3 返回登录界面 按Alt F1 进入Shell 4 输入用户名和密码登录 5 查看虚拟机清单 vim
  • SQL中 EXISTS 的用法简介

    EXISTS 作用是判断某个对象是否存在 常用于判断表或在WHERE子句等条件中使用 分别介绍如下 1 可以判断某个表或某对象是否存在 if exists select from sys tables where name xTable p
  • Eclipse设置:背景与字体大小和xml文件中字体大小调整

    Eclipse中代码编辑背景颜色修改 代码编辑界面默认颜色为白色 对于长期使用电脑编程的人来说 白色很刺激我们的眼睛 所以改变workspace的背景色 可以使眼睛舒服一些 设置方法如下 1 打开window Preference 弹出Pr
  • VMware虚拟机安装win10系统教程(超详细)

    VMware虚拟机安装win10系统教程 1 在VM中的安装与设置 1 1创建新的虚拟机 1 2典型 自定义 1 3选择客户机操作系统 1 4位置和命名 1 5指定磁盘容量 1 6确认界面 1 7虚拟机设置 2 win10系统界面的配置 2
  • 【深度学习】语义分割 PASCAL Context 数据集

    数据集介绍 PASCAL Context数据集 1 由两部分组成 PASCAL VOC 2010 语义分割数据集 Context 标注 PASCAL Context 总共有459个标注类别 包含 10103 张图像 其中 4998 用于训练
  • Java Swing实现美化版绘图工具

    美化版画图工具功能模块分析 gitee https gitee com Guo HongYan javaShape git github https github com 229976762 Java git aliyun https ww
  • R语言基础4 (R运算符)

    R运算符 算数运算符 算数算符 算符含义 乘幂 乘 除 加 减 模运算 取余数 整数除法 例子 gt a lt 10 gt b lt 2 gt c lt 3 gt a b 1 100 gt a b 1 20 gt a c 1 3 33333
  • pc端和移动端抓包工具

    客户端与服务器端 CydiaSubstrate框架 Frida Native层HOOK Frida hook Java层 需要相关资料的朋友 可以 加入此处即可打包获取 一 抓包工具概述 http https fiddler burpsui
  • ssl证书过期;申请以及Nginx配置。

    1 登录阿里云 工作台找SSL证书或者安全下找CA证书 2 点击创建证书 或购买证书 创建好以后点击证书申请 3 设置配置以及域名信息 仅填写圈住内容 其他默认即可 4 随后等待一会 查看状态 是否为 已签发 5 为已签发时 点击下载选择下
  • Linux — 【进程信号】

    目录 一 信号的概念 那么生活中的信号有哪些呢 如何把上面的概念迁徙到进程中呢 signal函数 二 信号的产生 1 通过终端按键产生信号 2 调用系统函数向进程发信号 kill函数 raise函数 abort函数 3 硬件异常产生的信号
  • Django Vue corsheaders跨域问题

    跨域问题 记录一下在我自己的django vue项目里面出现的跨域问题 我的项目之前一直是在本地跑的 因为需要上线测试 所以我就运行在同一个vlan里面 ip段 192 168 1 0 24 突然发现存在跨域问题 我django的接口访问被
  • CC2530定时器使用笔记

    最近在用2530的定时器做捕捉和生成pwm 其中一块2530负责捕捉 另一块2530负责生成pwm 整理下笔记 方便以后查阅 一 普通定时 使用定时器来定时将tick自加 获得更精确的时间 代码如下 在其他地方将系统的时钟配置了32M 此处
  • BES提示音修改实验

    加v hezkz17 进数字音频系统答疑群 1 普通提示音切换需要注意的 比如切换不同的音频信号源注意先要app audio list clear 然后再切换音频app audio manager sendrequest APP BT ST
  • Vuex状态管理器

    目录 1 什么是vuex 2 vuex的使用场景 3 vuex的工作方式 4 vuex的核心API 1 state 2 mutations 3 actions 通过actions去触发mutations中的方法 实现对state的异步修改