【9 Vue全家桶 – Vuex状态管理】

news2025/1/2 0:09:07

1 什么是状态管理

其实是数据管理但是为了更好的指出是由于状态的变化导致数据的变化(响应式数据),我们称之为状态管理.
在这里插入图片描述

2 Vuex的状态管理

在这里插入图片描述

组件只能直接读取state,而不能直接修改state,必须通过mutation才能修改.(pinia可以直接读取和修改state)

在这里插入图片描述

3 Vuex的安装

npm install vuex

4 创建Store

在这里插入图片描述

文件结构

在这里插入图片描述

1 创建store,使用state(核心一)

import { createStore } from 'vuex'

const store = createStore({
  state: () => ({
    // 模拟数据
    // counter: 100,
    rootCounter: 100,

  }),
 
 //用于修改state的mutations
  mutations: {
    increment(state) {
      state.counter++
    }
   
  }
  
})

export default store

2 使用和修改state,解构state获取数据

<template>
  <div class="app">
  //模板中使用
    <h2>Home当前计数: {{ $store.state.counter }}</h2>
    //options API 使用
    <h2>Computed当前计数: {{ storeCounter }}</h2>
    //setUP API 使用
    <h2>Setup当前计数: {{ counter }}</h2>
    // 修改state
    <button @click="increment">+1</button>
  </div>
</template>

<script>
  export default {
    computed: {
      storeCounter() {
        return this.$store.state.counter
      }
    }
  }
</script>

<script setup>
  import { toRefs } from 'vue'
  import { useStore } from 'vuex'

  const store = useStore()
  //解构state获取数据,counter,可以是多个数据,起别名等(推荐)
  const { counter } = toRefs(store.state)
  
  function increment() {
    // store.state.counter++
    store.commit("increment")
  }
</script>

<style scoped>
</style>



5 getters的基本使用 对state数据进行加工(核心二)

inde.js代码

const store = createStore({
  state: () => ({
    // 模拟数据
    // counter: 100,
    rootCounter: 100,
    name: "coderwhy",
    level: 100,
    avatarURL: "http://xxxxxx",
    friends: [
      { id: 111, name: "why", age: 20 },
      { id: 112, name: "kobe", age: 30 },
      { id: 113, name: "james", age: 25 }
    ],

  }),
  getters: {
    // 1.基本使用
    doubleCounter(state) {
      return state.counter * 2
    },
    totalAge(state) {
      return state.friends.reduce((preValue, item) => {
        return preValue + item.age
      }, 0)
    },
    // 2.在该getters属性中, 获取其他的getters
    message(state, getters) {
      return `name:${state.name} level:${state.level} friendTotalAge:${getters.totalAge}`
    },
    // 3.getters是可以返回一个函数的, 调用这个函数可以传入参数(了解)
    getFriendById(state) {
      return function(id) {
        const friend = state.friends.find(item => item.id === id)
        return friend
      }
    }
  },

vue代码

 <template>
 <div class="app">
   <!-- <button @click="incrementLevel">修改level</button> -->
   <h2>doubleCounter: {{ $store.getters.doubleCounter }}</h2>
   <h2>friendsTotalAge: {{ $store.getters.totalAge }}</h2>
   <h2>message: {{ $store.getters.message }}</h2>

   <!-- 根据id获取某一个朋友的信息 -->
   <h2>id-111的朋友信息: {{ $store.getters.getFriendById(111) }}</h2>
   <h2>id-112的朋友信息: {{ $store.getters.getFriendById(112) }}</h2>
 </div>
</template>

6 Mutation基本使用,state的修改(核心三)

重要的原则: 不要在mutation方法中执行异步操作

mutations: {
    increment(state) {
      state.counter++
    },
    changeName(state, payload) {
      state.name = payload
    },
    incrementLevel(state) {
      state.level++
    },
    changeInfo(state, newInfo) {
      state.level = newInfo.level
      state.name = newInfo.name

      // 重要的原则: 不要在mutation方法中执行异步操作

    },

methods: {
      changeName() {
        // this.$store.state.name = "李银河"
        //带外部参数的修改
        this.$store.commit("changeName", "王小波")
      },
      incrementLevel() {
        this.$store.commit("incrementLevel")
      },
      changeInfo() {
      //外部参数是一个对象
        this.$store.commit("changeInfo", {
          name: "王二",
          level: 200
        })
      }
    }
  }
</script>

7 actions的基本使用 ,异步派发(核心四)

使用dispatch函数进行分发
在这里插入图片描述

actions: {
    incrementAction(context) {
      // console.log(context.commit) // 用于提交mutation
      // console.log(context.getters) // getters
      // console.log(context.state) // state
      context.commit("increment")
    },
    changeNameAction(context, payload) {
      context.commit("changeName", payload)
    },

  },
<template>
<div class="home">
  <h2>当前计数: {{ $store.state.counter }}</h2>
  <button @click="counterBtnClick">发起action修改counter</button>
  <h2>name: {{ $store.state.name }}</h2>
  <button @click="nameBtnClick">发起action修改name</button>
</div>
</template>

<script>

export default {
  methods: {
    counterBtnClick() {
      this.$store.dispatch("incrementAction")
    },
    nameBtnClick() {
      this.$store.dispatch("changeNameAction", "aaa")
    }
  }
}
</script>

<script setup>

</script>

<style scoped>
</style>


actions的异步操作

在这里插入图片描述

8 module的基本使用,抽出模块(核心五)

在这里插入图片描述
定义一个单独的home.js文件

export default {
  state: () => ({
    // 服务器数据
    banners: [],
    recommends: []
  }),
  mutations: {
    changeBanners(state, banners) {
      state.banners = banners
    },
    changeRecommends(state, recommends) {
      state.recommends = recommends
    }
  },
  actions: {
    fetchHomeMultidataAction(context) {
      return new Promise(async (resolve, reject) => {
        // 3.await/async
        const res = await fetch("http://123.207.32.32:8000/home/multidata")
        const data = await res.json()
        
        // 修改state数据
        context.commit("changeBanners", data.data.banner.list)
        context.commit("changeRecommends", data.data.recommend.list)

        resolve("aaaaa")
      })
    }
  }
}

导入index.js

//导入模块对象
import homeModule from './modules/home'
//导入模块
modules: {
    home: homeModule,
  }

使用xxx.vue文件

<template>
  <div class="home">
    <h2>Home Page</h2>
    <ul>
      <!-- 使用数据时需要模块名 state.modulename.xxx -->
      <template v-for="item in $store.state.home.banners" :key="item.acm">
        <li>{{ item.title }}</li>
      </template>
    </ul>
  </div>
</template>

<script>
</script>

<script setup>

  import { useStore } from 'vuex'

  // 调用方法时,不需要模块名
  const store = useStore()
  store.dispatch("fetchHomeMultidataAction").then(res => {
    console.log("home中的then被回调:", res)
  })

</script>


<style scoped>
</style>

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

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

相关文章

ModDrop++:一种具有受试者内部协同训练的动态滤波网络,用于具有缺失模态的多发性硬化病变分割

文章目录 ModDrop: A Dynamic Filter Network with Intra-subject Co-training for Multiple Sclerosis Lesion Segmentation with Missing Modalities摘要本文方法Dynamic Head with Filter ScalingIntra-subject Co-training 实验结果 ModDrop: A Dynamic Filter Network wit…

1:面向对象

文章目录 1&#xff1a;与equals的区别2&#xff1a;写算法题的时候边界条件最后考虑3&#xff1a;高内聚低耦合4&#xff1a;父类引用指向子类对象5&#xff1a;如何重写equals方法6&#xff1a;java是如果实现跨平台的7&#xff1a;HashMap中的重点注意事项8&#xff1a;局部…

快速入门Python语言:人生苦短,我用Python~~Python语言经验分享

⭐方向一&#xff1a;“你是如何学习/自学 Python 的&#xff1f;” 我通过自学的方式学习Python。我的自学方法具有良好的灵活性和自控力&#xff0c;在这个过程中&#xff0c;我注重打下坚实的基础&#xff0c;确保学习的深度与广度&#xff0c;以提高对Python语言和编程的认…

[答疑]UMLChina的Logo是不是不对劲

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> Lynn 2023-4-6 13:55 潘老师&#xff0c;咱umlchina的标记是不是不太对劲&#xff0c;火柴人指向用例的箭头是三角形似乎不合uml的标准。 UMLChina潘加宇 是的。如果按U…

张驰咨询:六西格玛绿带培训如何帮助酒店降低成本和提高客户满意度?

六西格玛是一种质量管理方法&#xff0c;旨在通过减少缺陷和提高效率来提高客户满意度。在酒店行业中&#xff0c;六西格玛可以帮助酒店降低成本和提高客户满意度的方法有&#xff1a;减少浪费、提高效率、优化客户体验、降低维护成本等等。下面张驰咨询给大家分享两个真实案例…

免改造数据安全技术,实现企业关键数据资产保护落地

4月26日&#xff0c;腾讯安全联合中国信通院“数据安全推进计划”共同在深圳举办了数据安全研讨会。炼石网络创始人兼CEO白小勇受邀出席&#xff0c;分享了“免改造数据安全的实践与思考”的议题&#xff0c;与中国信息通信研究院云计算与大数据研究所高级业务主管龚诗然、腾讯…

SpringMvc源码分析

概述 用户的请求&#xff0c;是如何被 DispatcherServlet 处理的 先看图 从图中可以看到请求首先是被 DispatcherServlet 所处理&#xff0c;但是实际上&#xff0c;FrameworkServlet 先被触发 我们看下处理各种请求的方法 Overrideprotected final void doGet(HttpServletR…

JavaEE进阶(5/28)SpringMVC

目录 1.什么是SpringMVC&#xff1f; 2.学习SpringMVC学习了什么&#xff1f; 3.SpringMVC核心1 4.SpringBoot传递参数 5.SpringBoot传递对象参数 6.SpringBoot传递表单 7.SpringBoot后端参数重命名 8.SpringBoot后端用来接收json对象 1.什么是SpringMVC&#xff1f; 1.…

如何在手机和平板中浏览三维实景模型?

对于数据量庞大的三维实景模型&#xff0c;想要在手机和平板中进行在线浏览并实现实时交互&#xff0c;一般平台很难实现这些功能。 四维轻云是一款操作简单、支持在线协作、在线展示及在线分享的三维实景模型在线浏览平台。在四维轻云平台中&#xff0c;用户可以创建项目&…

人生苦短,我用Python:如何入门Python的世界

人生苦短&#xff0c;我用Python&#xff1a;如何入门Python的世界 Python是一门非常简洁、易读、高效的编程语言&#xff0c;适合初学者入门。自从1991年问世以来&#xff0c;Python已经在全球范围内成为了众多工程师、科研人员、数据分析师等人群的首选编程语言。本文将详细…

数据库DBMS并发控制

pgsql&#xff08;PostgreSQL&#xff09;常用命令行操作_pgsql常用命令_石头wang的博客-CSDN博客 事务的操作和事务的性质 操作演示 三种典型数据不一致现象: 串行调度和可串行调度 串行调度 顾名思义 就是可以进行调度的意思 可串行调度 就是 一种和串行调度等价的并行调…

Quest 3初体验,或是苹果MR最大竞争对手

随着苹果MR临近&#xff0c;我们从彭博Mark Gurman了解到更多消息。昨日&#xff0c;Mark Gurman发布了Quest 3上手体验文章&#xff0c;并认为Quest 3可能是苹果MR头显最大的竞争对手。 1&#xff0c;Meta是XR头显领导者 尽管WWDC 23苹果MR将会成为最大的主角&#xff0c;但…

Android音视频开发2:So库适配总结

名词解析 Android NDK 是在SDK前⾯⼜加上了原⽣⼆字&#xff0c;即Native Development Kit&#xff0c;因此⼜被Google称为 NDK。C/C编写代码。so 为共享库,是shared object。 前⾔ ⽇常开发我们经常会使⽤到第三库&#xff0c;涉及到底层的语⾳&#xff0c;视频等都需要…

【虚拟机】VMware虚拟机安装Windows 10系统 详细教程

大家好&#xff0c;我是雷工&#xff01; 由于购买的电脑自带系统为windows11家庭版&#xff0c;而有些软件无法在家庭版中安装&#xff0c;所以考虑用虚拟机再装个Windows10专业版系统。 前一段时间在Windows11 家庭版上安装的KingSCADA软件运行时总反应很慢&#xff0c;准备…

【MLC】 TensorIR 练习

文章目录 前言TensorIR 练习TensorIR: 张量程序抽象案例研究练习 1&#xff1a;广播加法练习 2&#xff1a;二维卷积练习 3&#xff1a;变换批量矩阵乘法程序 总结 前言 这两天重新看了一下天奇的mlc课程文档&#xff0c;把里边儿的TensorIR 练习写了一下&#xff0c;顺便推广…

ubuntu循环登录,无法进入桌面

现象 在用户登录界面输入用户名和密码后无法正常登录&#xff0c;并且一直循环提示输入登录信息。 问题定位 1. 键入&#xff1a;ctrlaltF1&#xff0c; 进入命令行登录界面 2. 输入当前的用户名和密码&#xff08;也可以是root&#xff0c;操作需谨慎&#xff09; 3.…

【SonarQube】下载、安装、配置、使用介绍

文章目录 SonarQube安装运行使用root启动问题处理修改文件数限制JDK版本问题创建Project创建token扫描代码数据持久化在线文档 SonarQube安装 官网下载地址: http://www.sonarqube.org/downloads/9.9.1.69595下载地址: https://binaries.sonarsource.com/Distribution/sonarqu…

chatgpt赋能python:Python下载之后怎么用:详细教程

Python下载之后怎么用&#xff1a;详细教程 Python作为一种著名的编程语言&#xff0c;已经成为众多程序员和开发者的首选。因此&#xff0c;如果您也想开始使用 Python 来进行编程&#xff0c;那么下一步应该是下载和安装Python。但是&#xff0c;下载完 Python 之后&#xf…

范式迁移 | Squids DBMotion支持Oracle迁移到GaussDB

Squids DBMotion 2304发版成功&#xff0c;再添重量级数据同步功能——支持Oracle迁移到GaussDB。 GaussDB是华为自主创新研发的分布式关系型数据库。该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&…

企业使用WordPress网站的6个理由

WordPress 为超过三分之一的网络和超过 38%的顶级 10K 网站提供支持。它最初是一个博客平台&#xff0c;现在是世界上使用最广泛的内容管理系统&#xff0c;对于希望在未来几年扩大规模的网站所有者来说&#xff0c;是一个明智的选择。 除了使用开源软件的好处之外&#xff0c…