WEB前端16-Vuex状态管理模式

news2024/10/2 1:41:45

Vue2-Vuex基础

1.Vuex基本概念

在复杂的前端应用程序中,状态管理变得至关重要。Vuex 是 Vue.js 官方提供的状态管理模式和库,它能帮助我们更好地管理应用程序的状态并实现组件间的通信。本文将介绍 Vuex 的基本概念、核心概念和实际应用。

什么是 Vuex?

Vuex 是专为 Vue.js 应用程序开发的状态管理模式。它借鉴了 Flux 和 Redux 的理念,将应用程序的状态抽象出来,集中管理在一个全局的 store 中。这样做的好处是:

  • 集中化管理状态:将所有组件的共享状态抽取出来,单独管理,使得状态变化更加可控和可预测。
  • 更方便的状态共享:不需要通过 props 或事件来传递状态,任何组件都可以访问状态。
  • 易于调试:通过时间旅行工具(Vue Devtools)可以方便地查看状态的变化历史。

Vuex与localStorage,sessionStorage区别?

vuex 可以在多个组件之间共享数据,并且共享的数据是【响应式】的,即数据的变更能及时渲染到模板

与之对比 localStorage 与 sessionStorage 也能共享数据,但缺点是数据并非【响应式】

2.Vuex基本使用方式
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})
  • new Vuex.Store({}) 创建了一个新的 Vuex Store 实例,并导出这个实例作为默认的导出。
  • state, getters, mutations, actions, 和 modules 这些选项中,你可以定义应用程序的状态管理逻辑:
    • state: 定义应用的状态数据。可以在这里声明需要全局共享的数据。
    • getters: 类似于计算属性,用来从 store 中的 state 中派生出一些状态。
    • mutations: 定义同步修改 state 的方法。每个 mutation 都有一个字符串的事件类型 (type) 和 一个回调函数 (handler)。
    • actions: 类似于 mutations,但是 actions 提交的是 mutation,而不是直接变更状态。可以用来异步操作。
    • modules: 允许将 store 分割成模块。每个模块拥有自己的 state、mutations、actions、getters 等。
3.Vuex入门案例

动态显示修改后的用户名称

image-20240804165009868

  • 首页面基础代码
<template>
  <div class="index">
    <h1>首页面</h1>
    <el-container>
      <el-header>
        <div class="header1">
          欢迎你的登录, 尊敬的
        </div>

        <div class="header3">
          <el-button
            type="primary"
            icon="el-icon-edit"
            circle
            @click="jump('/c/p1')"
          ></el-button>
          <el-button
            type="success"
            icon="el-icon-check"
            circle
            @click="jump('/c/p2')"
          ></el-button>
          <el-button
            type="info"
            icon="el-icon-message"
            circle
            @click="jump('/c/p3')"
          ></el-button>
        </div>
      </el-header>
      <el-container>
        <el-aside width="200px">
          <el-menu
            router
            background-color="#545c64"
            text-color="#fff"
            active-text-color="#ffd04b"
          >
            <el-submenu index="">
              <span slot="title">
                <i class="el-icon-user-solid"></i>
                菜单一
              </span>
              <el-menu-item index="/c/p1">子项1</el-menu-item>
              <el-menu-item index="/c/p2">子项2</el-menu-item>
              <el-menu-item index="/c/p3">子项3</el-menu-item>
            </el-submenu>
            <el-menu-item>
              <span slot="title">
                <i class="el-icon-picture"></i>
                菜单二
              </span>
            </el-menu-item>
            <el-menu-item>
              <span slot="title">
                <i class="el-icon-s-platform"></i>
                菜单三
              </span>
            </el-menu-item>
          </el-menu>
        </el-aside>
        <el-main>
          <router-view></router-view>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>
  
  <script>
const options = {
  methods: {
    jump(url) {
      const currentPath = this.$route.path;
      if (currentPath !== url) {
        this.$router.push(url);
      }
    },
  },
};

export default options;
</script>
  
<style scoped>
.index {
  background: pink;
  text-align: center;
  width: auto;
  height: 100vh;
}

.el-header {
  background: rgb(121, 145, 231);
}

.el-aside {
  background: rgb(255, 183, 233);
  height: 100vh;
}

.el-main {
  background: rgb(128, 226, 246);
  height: 100vh;
}

.router-link {
  display: inline-block;
  padding: 10px 15px;
  margin-right: 10px;
  margin-top: 5px;
  width: 150px;
  text-decoration: none;
  color: #333; /* 链接文本颜色 */
  background-color: #f0f0f0; /* 背景色 */
  border: 1px solid #ccc; /* 边框 */
  border-radius: 5px; /* 圆角 */
  transition: background-color 0.3s, color 0.3s; /* 过渡效果 */

  /* 其他样式属性可以根据需要添加 */
}

/* 鼠标悬停时的样式 */
.router-link:hover {
  background-color: #e0e0e0;
  color: #555;
}

/* 激活状态的样式 */
.router-link.active {
  background-color: #007bff; /* 激活时的背景色 */
  color: #fff; /* 激活时的文本颜色 */
  border-color: #007bff; /* 激活时的边框颜色 */
}

.header1 {
  font-size: 30px;
  font-family: "腾讯体";
  color: white;
  float: left;
  margin-top: 10px;
}

.header3 {
  margin-top: 10px;
  float: right;
}
</style>
  • P1页面基础代码
<template>
  <div class="error">
    <h1>P1</h1>

    <el-input placeholder="请输入用户名" size="mini" v-model="name"></el-input>
    <el-button type="primary" round size="mini" @click="updateName">提交</el-button>
  </div>
</template>
    
  <script>
const options = {
  data() {
    return {
      name: "",
    };
  },
  methods: {
    updateName() {

    },
  },
  
};
export default options;
</script>
    
<style scoped>
.error {
  background: orange;
  text-align: center;
  border: 2px solid black;
  width: 80%;
  height: 700px;
  margin: 0px auto; /* 左右外边距设置为auto,实现水平居中 */
}

.el-input {
  width: 200px;
}
</style>
  • 编写store内容($store.commit(“方法名”, [方法参数列表]))

  • 显示store的内容($store.state.共享的属性名)

image-20240804165916950

4.mapState-优化共享属性的获取

mapState 是 Vuex 提供的一个辅助函数,用于在组件中获取 Vuex store 中的 state。它的作用是帮助简化从 Vuex store 中获取状态数据的过程,特别是在组件中需要使用多个状态时,可以减少代码的重复性和提高可读性。

//因为被共享的属性常常使用,需要每次从$store中获取,因此可以用计算属性优化这一操作
const options = {
  computed : {
    name() {
      return this.$store.state.name;
    }
  }
}
//因为每次获取属性均是此代码,因此可以使用Vuex提供的方法获取
const options = {
  computed : mapState(["name"])
}
//或者使用展开函数
const options = {
  computed : {
    ...mapState(["name"])
  },
}
5.mapMutations-优化修改函数的获取

mapMutations 是 Vuex 提供的一个辅助函数,用于在组件中映射 Vuex store 中的 mutations。它的作用是帮助简化在组件中提交 mutation 的过程,特别是在需要在组件中提交多个 mutation 时,可以减少代码的重复性和提高可读性。

//旧的获取修改函数的方法
const options = {
  data() {
    return {
      name: "",
    };
  },
  methods: {
    updateName() {
      this.$store.commit("updateName", this.name);
    },
  }, 
}

//通过mapMutations解决:通过展开函数将updateName作为methods对象的方法
import { mapMutations } from "vuex";
const options = {
  data() {
    return {
      name: "",
    };
  },
  methods: {
    ...mapMutations(["updateName"]),
  },
};
export default options;
6.Actions方法-处理异步请求的方法

在Vue.js中,特别是与Vuex一起使用时,Actions是Vuex中的一种核心概念。Actions用于处理异步操作,例如调用API、获取数据,然后提交(commit)mutation来修改状态。Actions是通过store.dispatch方法来触发的,而不是直接调用mutation来修改状态。

动态获取名字并展示到页面

image-20240804182516145

  • 通过dispatch方法获取actions中的方法

image-20240804182358217

  • 优化操作:通过mapActions获取actions中的方法

image-20240804182005840

  • 案例中服务器代码
package com.tyut.controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/getUserServlet")
public class GetUserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.addHeader("Access-Control-Allow-Origin", "http://localhost:7070");
        request.setCharacterEncoding("utf-8");

        PrintWriter out = response.getWriter();

        String[] nameList = {"张三", "李四", "王五", "赵六"};
        int index = (int) (Math.random() * 10) % 4;
        String name = nameList[index];

        String jsonString = "{\"name\":\"" + name + "\"}";

        out.write(jsonString);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

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

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

相关文章

Vue3炫酷的界面

Vanta.js - Animated 3D Backgrounds For Your Website3D & WebGL Background Animations For Your Websitehttps://www.vantajs.com/?effectbirds需要的安装包 npm install three npm install three0.13.4.0npm install vue3.2.37#Vanta JS 依赖 npm install vanta np…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)

1. 函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为&#xff0c;使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。 #include<iostream> u…

传知代码-半监督学习与数据增强(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文复现论文 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence[1] 提出的半监督学习方法。 半监督学习&#xff08;Semi-supervised Learning&#xff09;是一种机器学习…

使用Python库开发Markdown编辑器并将内容导出为图片

简介 在本文中&#xff0c;我们将探索如何使用Python的wxPython库开发一个Markdown编辑器应用程序。这个应用程序不仅能浏览和编辑Markdown文件&#xff0c;还可以将编辑的内容导出为PNG图片。 C:\pythoncode\new\markdowneditor.py 完整代码 import wx import markdown2 im…

前端实现下载word(多个word下载)-- docxtemplater

文章目录 &#x1f50e;什么是docxtemplater&#xff1f;&#x1f47b;docxtemplater语法&#x1f47b;普通插值for循环选择图片&#xff08;&#x1f330;代码&#xff09; &#x1f47b;实现下载&#x1f47b;安装依赖&#x1f330;完整代码关键逻辑解释 &#x1f47b;实现多…

CSP-J 复赛 模拟题 解析版

根据解析写代码1&#xff1a; #include <bits/stdc.h> using namespace std; long long a[101010]; long long b[101010]; int main(){bool flag0;long long t;cin>>t;while(t--){long long n,k;cin>>n>>k;for(int i1;i<n;i){cin>>a[i]>…

kickstart自动安装脚本

1、准备阶段 #开启图形 init 5 ​ #安装带GUI的服务器包组 yum -y groupinstall "Server with GUI" ​ #在xshell做需要加X ssh -Xl root 172.25.254.128 ​ #开启图形 gedit ​ 2、kickstart [rootpxe ~]# cat /root/anaconda-ks.cfg #此文件是在系统安装好后…

大数据Flink(一百零九):阿里云Flink的基本名称概念

文章目录 阿里云Flink的基本名称概念 一、层次结构 二、​​​​​​​​​​​​​​概念说明 1、工作空间&#xff08;Workspace&#xff09; 2、项目空间&#xff08;Namespace&#xff09; 3、资源&#xff08;Resource&#xff09; 4、草稿&#xff08;Draft&#…

将本地微服务发布到docker镜像二:

上一篇文章我们介绍了如何将一个简单的springboot服务发布到docker镜像中&#xff0c;这一篇我们将介绍如何将一个复杂的微服务&#xff08;关联mysql、redis&#xff09;发布到docker镜像。 我们将使用以下两种不同的方式来实现此功能。 redis、mysql、springboot微服务分开…

linux的自动检测的脚本:用于检测应用程序状态的linux脚本

目录 一、要求 1、需求内容 2、分析 二、脚本介绍 1、脚本代码 2、脚本解释 &#xff08;1&#xff09;脚本结构 &#xff08;2&#xff09;应用程序和服务列表 &#xff08;3&#xff09;日志文件路径 &#xff08;4&#xff09;测试 URL 列表 &#xff08;5&#…

智能小程序 Ray 开发面板 SDK —— 无线开关一键执行模板教程(一)

1. 准备工作 前提条件 已阅读 Ray 新手村任务&#xff0c;了解 Ray 框架的基础知识已阅读 使用 Ray 开发万能面板&#xff0c;了解 Ray 面板开发的基础知识 构建内容 在此 Codelab 中&#xff0c;您将利用面板小程序开发构建出一个支持一键执行及自动化的无线开关面板&…

HCIP----BGP综合实验

一、实验拓扑 二、实验要求 三、实验思路 1.基于172.16.0.0/16根据实验拓扑图进行IP地址规划&#xff0c;规划过程如下&#xff1a; 2.根据上述的IP地址的规划进行配置&#xff0c;配置完后在AS2中配置OSPF使其内部实现全网通&#xff08;互相建邻的条件&#xff09;。 3.在A…

keil编程中#pragma NOAREGS的作用和优点

参考 功能 不直接操作内存地址 #pragma NOAREGS在Keil中的使用含义是禁用自动分配寄存器&#xff0c;开发人员指定控制的寄存器。‌例如中断的执行使用的寄存器需要人为的指定&#xff0c;避免分配同样的寄存器导致数据错误。对寄存器R0到R7不直接操作寄存器地址&#xff0c…

C# 设计模式六大原则之依赖倒置原则

总目录 前言 1 基本介绍 1. 定义 依赖倒置原则 Dependence Inversion Principle&#xff0c;简称&#xff1a;DIP。 依赖倒置原则&#xff1a;高层模块不应该依赖低层模块&#xff0c;二者都应该依赖其抽象&#xff1b;抽象不应该依赖细节&#xff0c;细节应该依赖抽象。 2…

GO之基本语法

一、Golang变量 一&#xff09;变量的声明&#xff1a;使用var关键字 Go语言是静态类型语言 Go语言的基本类型有&#xff1a; boolstringint、int8、int16、int32、int64uint、uint8、uint16、uint32、uint64、uintptrbyte // uint8 的别名rune // int32 的别名 代表一个 Unic…

CTF-web 基础 网络协议

网络协议 OSI七层参考模型&#xff1a;一个标准的参考模型 物理层 网线&#xff0c;网线接口等。 数据链路层 可以处理物理层传入的信息。 网络层 比如IP地址 传输层 控制传输的内容的传输&#xff0c;在传输的过程中将要传输的信息分块传输完成之后再进行合并。 应用…

sql语句精讲

目录 一、MySql的细节知识 SQL语句的结束 SQL语句的大小写 SQL语句中的空格 SQL查询结果并排序 WHERE和ORDER BY的位置 常用数据类型 MYSQL比较运算符 MYSQL算术运算符​编辑 MYSQL逻辑运算符 运算符的优先级 二、MySql数据库的基本操作 1.创建数据库 2.选择数据…

kubenetes证书续签

转载&#xff1a;k8s证书续签 1 检查证书年限 kubeadm certs check-expiration 2 对现有证书进行备份 # 备份kubeadm cp -ra /usr/bin/kubeadm /usr/bin/kubeadm.bak # 备份证书 cp -ra /etc/kubernetes /etc/kubernetes.bak 3 重新编译kubeadm 拉取k8s仓库代码 git clone…

【数据分析--Pandas实战指南在真实世界数据中的应用】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索数据分析—基础介绍&#xff0c;本篇文章主要讲述了&#xff1a;数据分析的介绍&#xff0c;Python开源库&#xff0c;配置Jupyter&#xff0c;Pandas读取数据…

echarts 漏斗图 渐变金字塔

使用echarts实现金字塔效果&#xff0c;颜色渐变&#xff0c;左右显示其对应的值 效果&#xff1a; 如果要实现一个正三角的形状&#xff0c;需要在data数组中&#xff0c;将value赋值成有序递增&#xff0c;bl代表他的分值&#xff0c;显示在左侧。 var data [{name: "…