Vuex状态管理器

news2024/12/28 5:11:42

目录

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(content) {//异步操作:2秒后count加1
            setTimeout(() => {
                //触发mutations中的方法
                content.commit('addCount', { num: 1 });
            }, 2000);
        },
        subCountAsyn(content) {
            setTimeout(() => {
                content.commit('subCount', { num: 1 })
            }, 2000);
        },
        
        //异步操作:2秒年龄加减5
        addAgeAsyn(content) {
            setTimeout(()=>{
                content.commit('addAge',{ num: 5});
            },2000)
        },
        subAgeAsyn(content) {
            setTimeout(()=>{
                content.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,刷新组件

 

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

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

相关文章

2023.1.30 作业

一、TF-A的初步移植1、对tf-a源码进行解压tar -xvf tf-a-stm32mp-2.2.r2-r0.tar.gz2、进入tf-a源码顶层目录cd tf-a-stm32mp-2.2.r23、对tf-a源码进行打补丁操作for p in ls -1 ../*.patch; do patch -p1 < $p; done4、配置交叉编译工具链&#xff0c;打开../Makefile.sdk&a…

2023牛客寒假算法基础集训营4(7/13)

清楚姐姐学信息论数学&#xff0c;只需要求x的y次方和y的x次方那个大选哪个&#xff0c;除了2和3时是3多&#xff0c;其他情况都是数越小能代表的数越多AC代码&#xff1a;#include <bits/stdc.h> using namespace std; using LL long long; int main() {ios::sync_with…

ESP32 Arduino学习篇 (三) 蓝牙

简介&#xff1a;1.1蓝牙分类经典蓝牙我们一般说的是BT&#xff0c;低功耗蓝牙我们一般说成BLE。当设备支持蓝牙4.0时&#xff0c;还得进一步确认设备是支持BT单模、BLE单模还是BT和BLE都支持的双模。低功耗蓝牙 (BLE)&#xff1a; 支持蓝牙协议4.0或更高的模块。主打低功耗&am…

手上有了这些工具,明天争取6点下班!

一个优秀的开发者&#xff0c;一定是会利用各种工具来提升自己的开发效率。这段时间&#xff0c;我开始分享优质提升开发效率的工具&#xff0c;集成效率工具&#xff0c;开源集成网站等等&#xff0c;朋友们一直在催更&#xff0c;我知道你很急&#xff0c;但是你先别急&#…

最短路径算法刷题笔记

Dijkstra最短路算法 带负权则无法处理&#xff0c;不能使用Dijkstra算法 Dijkstra算法以 点 出发。D——点从剩下的点里的最短路dis最小的出发 SPFA单源最短路算法 算是bellman-ford算法 对于稀疏图来说&#xff0c;比Dijkstra算法快 SPFA算法可以用于有负权图有负环则不行 …

文档扫描OCR识别_积累

opecncv和python的积累cv2.resize()功能&#xff1a;对图像尺寸调整为指定大小dst cv2.resize(src, dsize, interpolationNone)各参数释义&#xff1a;scr&#xff1a; 输入图像dst: 输出图像dsize&#xff1a; 输出图像的尺寸&#xff0c;为元组格式(x, y)&#xff0c;(300, …

MySQL基础(2)—— 初识MySQL

文章目录客户端 - 服务器架构MySQL的可执行文件1、在命令行解释器中运行可执行文件2、服务器程序和客户端程序2.1 服务器程序 mysqld2.2 客户端程序 mysql注意事项1、客户端 - 服务器连接注意事项2、SQL语句使用注意事项客户端 - 服务器架构 MySQL当中存在客户端和服务器&…

不知道该学那一个语言?一文带你了解三门语言

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python。正在学习c 主页&#xff1a;阿玥的小东东 目录 粉丝留言&#xff0c;回答问题 1.首先&#xff0c;初步了解 2.再明确自己要拿编程做什么 3.详细介绍以及建议 4.劝告 5.总结 1.如果你是一个初学者 2.你是个老手 …

vulnhub之COFFEE ADDICTS: 1

1.信息收集 输入arp-scan 192.168.239.0/24发现192.168.239.168主机存活。 使用nmap对目标主机192.168.239.168进行端口收集,&#xff0c;发现存活端口&#xff1a;22、80。 访问http://192.168.239.168/&#xff0c;提示将coffeeaddicts.thm加入到/etc/hosts中 加入之后访…

docker 安装启动异常

问题现象1 yum install docker -y #安装docker后&#xff0c;在启动docker时出现 排查过程 查看系统日志下面软件运行日志messages日志&#xff0c;出现如下错误 在docker的配置文件种有异常的文件符号存在&#xff0c;那么接下来就百度一下正常的docker的配置文件是如何的…

【HBase——陌陌海量存储案例】6. 预分区表

6.5 预分区表 默认创建表的方式&#xff0c;则HBase顺序写入可能会受到RegionServer热点的影响。对行键进行加盐可以解决热点问题。在HBase中&#xff0c;可以使用两种方式&#xff1a; 1.ROWKEY预分区 2.加盐指定数量分区 6.5.1 ROWKEY预分区 按照用户ID来分区&#xff0c;一…

Docker 入门详解!新手也能看懂!

接下来通过4方面来初步了解docker docker介绍docker架构docker镜像操作docker容器操作 一、docker介绍 容器技术 计算机的世界中&#xff0c;容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化 &#xff08;hypervisor virtualization&#xff0c;HV&#xff09;有所不同…

postman断言使用总结

一、断言的概念一个完整的接口测试包括&#xff1a;请求——>获取响应结果——>断言断言&#xff1a;实际结果与预期结果的校验二、断言的作用通过实际结果与预期结果的对比&#xff0c;来判断接口测试用例是否通过&#xff1b;对比结果一致则通过&#xff0c;对比结果不…

webgl绘制图形API——drawArrays、drawElements

文章目录前言gl.drawArrays()——按顶点绘制可绘制基本类型绘制矩形和圆形gl.drawElements()——按索引绘制使用规范绘制矩形总结前言 gl.drawArrays()作为webgl中常用的函数图形绘制方法&#xff0c;可以在浏览器按照指定的模式绘制图形&#xff0c;与之相对的gl.drawElement…

字节跳动测试岗面试挂在2面,复盘后,我总结了失败原因,决定再战一次...

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

Java图形化界面---JSplitPane和JTabbedPane

目录 一、JSplitPane &#xff08;1&#xff09;JSplitPane的介绍 &#xff08;2&#xff09;JSplitPane的使用步骤 &#xff08;3&#xff09;案例 二、JTabbedPane &#xff08;1&#xff09;JTabbedPane的介绍 &#xff08;2&#xff09;JTabbedPane的使用步骤 &…

CSS样式基础内容6

目录 定位 为什么需要定位&#xff1f; 定位的四种方式 静态定位 相对定位 绝对定位&#xff08;脱标&#xff09; 子绝父相 固定定位&#xff08;脱标&#xff09; 固定定位---固定到版心右侧 粘性定位 定位的叠放顺序z-index 绝对定位盒子水平垂直居中 定位特殊特…

C#/WPF入门到多项目实战开发教程2——

登录界面 布局 右上角退出按钮 编辑图标和名称 用户名设置 布局 用户名框设置 密码框设置&#xff0c;使用模板进行设置 验证码框设置&#xff0c;使用模板进行设置 登录按钮 创建登录模板按钮 绑定模板 失败提醒 第三方登录设置 使用字体图标去替代一般图标&#xff0c;字体…

QThread的应用——在线程里面更新QProgressBar进度条

在线程里面更新QProgressBar进度条 编写QT软件的时候&#xff0c;经常会遇到点击某个按钮&#xff0c;进行一个比较耗时的计算。为了在计算过程中&#xff0c;软件界面就继续响应用户的点击&#xff0c;不会有卡死的感觉&#xff0c;一般会将这个耗时的计算放在另外一个线程里…

“打家劫舍”系列总结,偷不偷这个房间呢?(Java实现)

目录 前言 一、打家劫舍 ——>房子是线性的 1.1、dp定义 1.2、递推公式 1.3、初始化 1.4、遍历顺序 1.5、解题代码 二、打家劫舍II ——>房子是环型 2.1、分析 2.2、解题代码 三、打家劫舍III ——>房子是树形 3.1、dp含义 3.2、递推公式 3.3、解题代码…