VUEX

状态管理,多个组件有共享数据的时候,就叫状态管理

什么情况下会用到vuex ,  如果你不知道vuex的情况也能完成你的需求,就说你的项目中不需要用到状态管理。

组件层级比较复杂的时候,还是用组件传值的方式来传值,那么就会很不方便,给我们的开发造成一些不必要的麻烦,使用了vuex之后,提供统一的api, 管理起来也很放方便,提高了开发效率。

状态管理,可以看做是一个仓库。  这个仓库可以是所有的组件都可以去这个仓库里面去数据。(就消除了层级的问题)

官网:https://vuex.vuejs.org/zh/index.html

现在版本是vuex4.x,它是支持vue3的

如果是vue2的版本,使用是vuex3.x

但是4.x也不是最新的版本。 pinia是最新版(网称:大菠萝)

使用

因为我们使用脚手架创建项目的时候,已经选择vuex, 所以呢可以直接在项目中使用。

但是如果在创建项目的时候,没有选择上,就需要我们手工安装。

npm i vuex

vuex也是一个插件,所以需要在main.js  使用use()来加载插件。

1.使用方式

router/index.js //文档路径

// 1.从vuex导入了一个创建仓库的方法

import { createStore } from 'vuex'

// 2.然后使用了这个方法创建了一个仓库对象,然后导出

const store = createStore({

  state: {       //用来存放共享的数据的,类似全局的data

  },

  getters: {   //提供统一取数据的方法  // 如果取都有相同的操作就可以定义在这里(就像是以全局的computed)

  },

  mutations: {

  },

  actions: {

  },

  modules: {

  }

})

export default store

main.js

import { createApp } from 'vue'

import App from './App.vue'

import router from './router'

import store from './store'   //  ./store/index.js


const app = createApp(App)

app.use(store)  // 3.在vue实例中挂载了这个仓库.

app.use(router)

app.mount('#app')

state

用来存放共享的数据的,类似全局的data

store/index.js

const store = createStore({

  state: {  // 用来存放共享的数据的,类似全局的data

   count: 18,

   list: [2,3,3,4,5,88,22,33,11],

   age: 20,

   name: 'young'

  },

})

几种取的方式

直接取

<div>{{ $store.state.count }}</div>

通过计算属性取

computed:{

   // 当前页面要多次调用仓库的数据. 还用上面的方法的话,就重复的代码太多了,不方便维护

   // 可以结合计算属性来调用. 把仓库中要取的值,当做计算属性的依赖就可以了.

   // 虽然结合计算属性可以方便的一点的调用,但是还是有代码冗余,所以vuex中就提供了辅助函数给我们更方便的调用数据

   // 具体的使用方法看AboutView.vue

   count(){

     return this.$store.state.count

   },

   list(){

     return this.$store.state.list

   },

   age(){

     return this.$store.state.age

   },

   name(){

     return this.$store.state.name

   }

  },

通过辅助函数mapState取

<script>

  // 要在这个组件中取到多个共享数据

  // 可以使用mapState()来帮助我们生成计算属性

  // 1. 先导入mapState方法

  import { mapState } from 'vuex'

  export default {

   data(){

     return {

       count: 0

     }

   },

   computed:{

    // 2

     // mapState是一个函数

     // 可以接收一个数组参考

     // 数组里面的每一项就是要取仓库中字段

     ...mapState(['count','list','age','name'])

   }

  }

</script>

getters

提供统一取数据的方法  // 如果取都有相同的操作就可以定义在这里(就像是以全局的computed)

store/index.js

const store = createStore({

  state: {  // 用来存放共享的数据的,类似全局的data

   list: [2,3,3,4,5,88,22,33,11],

  },

  getters: {  // 提供统一取数据的方法  // 如果取都有相同的操作就可以定义在这里(就像是以全局的computed)

   // 把list过滤一遍里面呢只有偶数

   getevenList(state){

     const oulist = state.list.filter(item=>{

       return item%3 == 0

     })

     return oulist

   }

  }

})

在组件中使用

直接使用

this.$store.getters.getevenList

使用辅助函数 mapGetters

<script>

  // 导入 mapGetters 方法

  import { mapGetters } from 'vuex'

  export default {

   computed:{

     ...mapGetters(['getevenList']),

   }

  }

</script>

mutations

修改数据的方法 (只能写同步代码,不能写异步)

const store = createStore({

  state: {  // 用来存放共享的数据的,类似全局的data

   count: 18,

   age: 20,

  },

  mutations: { // 修改数据的方法

   changeCount(state){   // 提供了一个修改state.count的方法

     state.count++

   },

   changeAge(state){

     state.age++

   }

  },

})

直接通过$store.commit()调用

methods:{

   changecount(){

     // 虽然可以这么改,但是不建议这么做, (不好追踪的修改)

     // 既然是仓库中的数据,就要使用仓库中的方法去修改

     // this.$store.state.count = 100      

     // console.log(this.$store.state.count)

     // 要使用$store的commit() 来触发mutations

     this.$store.commit('changeCount')

   },

   changeage(){

     this.$store.commit('changeAge')

   }

  },

通过mapMutations 辅助函数生成对应的方法来调用

<div>

  <button @click="changeCount">修改count</button>

  <button @click="changeAge">修改age</button>

</div>


<script>

  import { mapGetters } from 'vuex'

  // 导入 mapMutations 的方法

  import { mapMutations } from 'vuex'

  export default {

   methods:{

     ...mapMutations(['changeCount','changeAge'])

     // 就相当于是在方法中定义了这两个方法来触发mutations

   },

  }

</script>

actions  异步修改数据的方法

虽然是异步,但是也要通过mutations去修改

import myaxios from '@/utils/axios'

// 1.从vuex导入了一个创建仓库的方法

import { createStore } from 'vuex'

const store = createStore({

  state: {  // 用来存放共享的数据的,类似全局的data

   age: 20,

   mylist: []   // 定义数组保存数据

  },

  mutations: { // 修改数据的方法  (同步)

   changeAge(state){

     state.age++

   },

   setList(state,list){  

     // 定义一个mutations 来修改数组, 转进来什么就修改什么

     state.mylist = list

   }

  },

  actions: {   // 异步修改数据的方法

   // 虽然是异步,但是也要通过mutations去修改

   asyncChangeAge(context){    // context就是相当于仓库对象 , $store  

     console.log(context)

     // 3秒后再修改age

     setTimeout(()=>{

       context.commit('changeAge')

     },3000)

   },

   asyncSetList(context){

     // 需求: 要请求接口拿到数据后,再给state, 这个请求是异步, 所以就要写在actions中

     myaxios.get('city').then(res=>{

       // console.log(res)

       if(res.status==0){

         context.commit('setList', res.data.cities)

       }

     })

   }

  },

})

通过$store.dispatch() 调用

this.$store.dispatch('asyncChangeAge')

this.$store.dispatch('asyncSetList')

modules 

把仓库分成一个一个小仓库(模块化)

小仓库都可以写vuex特有的4个属性: state getters mutations action

state 得是函数然后返回一个对象

store/user.js    专门用于存放用户信息的仓库

const user = {   // 用来保存用户的一个小仓库

  namespaced: true,    // 命名空间, 调用里面的方法就要通过仓库名称

  state(){

   return {

     name:'young',

     age: 18

   }

  },

  mutations: {

   changName(state){

     state.name = 'yyds'

   },

   changeAge(state){

     state.age++

   }

  }

}

export default user

store/index.js    挂载这个user仓库

import { createStore } from 'vuex'

import user from './user'


const store = createStore({

  modules: {    // 仓库模块化

   // 在这个modules中加载一个小仓库

   user:user

  },

})

export default store

在 组件中使用小仓库的数据

要通过小仓库的名称

{{this.$store.state.user.name}}--{{ this.$store.state.user.age}}

小仓库有命名空间,调用方法的时候也要加上小仓库的名称

this.$store.commit('user/changName')

this.$store.commit('user/changeAge')

plugins

插件: 就是一个函数

仓库初始化好了之后会调用一次,修改的时候也会调用subscribe()

import { createStore } from 'vuex'

const store = createStore({

  state: {

   count: 0

  },

  mutations:{

   changeCount(state){

     state.count++

   },

   setCount(state,num){

     state.count = num

   }

  },

  plugins: [(store)=>{  

   /*

     1.先判断再storage中没有存的值

       有 - 赋值给state.count

       没有  -  把默认值存在storage中

     2. 修改的时候同步更新到storage

   */

   // vuex 初始化好了之后就会触发这个方法

   // console.log(store.state.count)

   const local = localStorage.getItem('vuex')

   // console.log(local)

   if(local){

     const s  = JSON.parse(local)

     // console.log(s)

     // store.state = s

     store.commit('setCount',s.count)

   }else{

     localStorage.setItem('vuex',JSON.stringify(store.state))  

   }

   store.subscribe((mutation, state)=>{

     // 只要有修改了就会触发这个方法

     // console.log(state)

     localStorage.setItem('vuex',JSON.stringify(state))

   })

  }]

})

export default store


vuex持久化插件

vuex-persist

1.安装

npm i vuex-persist

2.使用插件

import { createStore } from 'vuex'// 1. 导入vuex-persist的插件

import VuexPersistence from 'vuex-persist'// 2. 创建vuex-persist插件的实例

const vuexLocal = new VuexPersistence({  storage: window.localStorage  // 指定用那种储存方式})

const store = createStore({  state: {    count: 0,    name: 'young'  },  

mutations:{    changeCount(state){      state.count++    },   

 setCount(state,num){      state.count = num    }  },  // 3. 使用插件  

plugins: [vuexLocal.plugin]})

export default store




喜欢的朋友记得点赞、收藏、关注哦!!!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025.6.24总结

今天发生了两件事&#xff0c;这每件事情都足以影响我的工作状态。 1.团队中有人要转岗 这算是最让我有些小震惊的事件了。我不明白&#xff0c;那个同事干得好好的&#xff0c;为啥会转岗&#xff0c;为啥会被调到其他团队。虽然团队有正编&#xff0c;有od,但我自始自终觉得…

状态模式详解

概述 结构设计类似责任链模式&#xff0c;但是在各个状态进行遍历的过程中&#xff0c;更注重的是条件的判断&#xff0c;只有符合条件的状态才能正常匹配进行处理。条件不成功的会立即切换到下一个状态。 有限状态机 状态机一般指的是有限状态机&#xff08;FSM&#xff1a…

Lua 调试(Debug)

Lua 调试(Debug) 引言 Lua 是一种轻量级的编程语言&#xff0c;广泛应用于游戏开发、嵌入式系统、脚本编写等领域。在 Lua 开发过程中&#xff0c;调试是确保程序正确运行的重要环节。本文将详细介绍 Lua 调试的基本方法、常用工具以及调试技巧&#xff0c;帮助开发者提高编程…

Windows安装Emscripten‌/emsdk(成功)

安装git安装python 不要自行下载版本&#xff0c;先卸载其他版本的python。 使用管理员打开cmd&#xff0c;输入python3&#xff0c;直接跳转到应用商店&#xff0c;安装即可。 为什么一定要这么安装&#xff1f;好像是跟路径有关。 下载emsdk git clone https://github.c…

AI网页部署在本地_windows

用bolt.new写了一个网页&#xff0c;下载ZIP至本地 以下是在 Windows 上本地运行你用 Node.js 搭建的网页服务&#xff0c;并在浏览器中访问的常见流程&#xff1a; 1、安装 Node.js 访问官网 Node.js — Run JavaScript Everywhere &#xff0c;下载适合 Windows 的 LTS 版本…

Linux sudo命令

sudo是一个常用的Linux命令&#xff0c;用于以超级用户的权限执行命令。下面是对sudo命令的介绍&#xff1a; sudo命令的作用&#xff1a; sudo允许普通用户以超级用户&#xff08;root&#xff09;的身份执行特定命令或访问特定文件。它提供了一种安全且可控制的方式&#xf…

邮件合并----批量从excel表中导出数据到word中

文章目录 前言一、操作流程1. 打开word&#xff0c;开始邮件合并->邮件合并分布向导2. 开始邮件合并&#xff0c;一共6步3. 选择全部&#xff0c;点击确认&#xff0c;即可生成Excel表中244条记录&#xff0c;也就是244页。 总结 前言 涉及到将学生的姓名、学号、档案编号、…

活动安排贪心算法

输入说明 n      —— 活动数量 s[1…n]  — 第 i 个活动的开始时间 (start) f[1…n]  — 第 i 个活动的结束时间 (finish) 前置要求&#xff1a;数组已按 f 从小到大排好序 &#xff08;若没排&#xff0c;先调用 sortByFinishTime()&#xff0c;复杂度 O(n log …

Mysql8启用日志审计插件

概述 等保要求&#xff0c;数据库启用日志审计。Mysql8上面使用开源插件audit-plugin-for-mysql&#xff08;MariaDB的审计插件不用折腾了&#xff0c;无论直接使用还是编译使用&#xff0c;在Mysql8上都不行&#xff09; 插件下载 日志审计插件下载地址&#xff1a; https:…

机器学习-线性模型

目录 线性模型 1、线性回归&#xff1a; 2、对数几率回归&#xff1a; 3、线性判别分析&#xff1a; 4、多分类学习&#xff1a; 5、类别不平衡问题&#xff1a; 基本数理知识补充&#xff1a; 损失函数&#xff1a; 凹凸函数 梯度下降 线性模型 线性模型形式简单、易…

Git上传代码如何解决Merge冲突

示例 解决方案 1、第一步切到本地的主分支 git checkout master2、拉取线上最新的代码 git pull3、切到本地自己的分支 gco feat-xx4、将代码从master变基&#xff08;移动/合并&#xff09;过来 git rebase master5、手动解决冲突 <<<<<<< HEAD 本…

fluentd + elasticsearch + grafana 不能显示问题

fluentd中配置log 源文件后&#xff0c;再配置elasticsearch后&#xff0c; elasticsearch pod中查询日志记录正常。 修改log 文件 后&#xff0c; elasticsearch pod中查询日志记录更新也正常。 但是在grafana中添加elasticsearch data source后&#xff0c; 连接正常&#…

《分布式事务新形态:AT模式如何被Seata TCC击穿》的深度解析,包含AT死锁原理/TCC原子性保障/Service Mesh深度集成三大硬核模块

一、AT模式的死刑判决&#xff1a;全局锁引发的血案 1.1 死锁现场还原&#xff08;支付宝真实案例&#xff09; 1.2 全局锁原理与缺陷 二、TCC模式的绝地反击&#xff1a;原子性保障三板斧 2.1 TCC核心架构设计 2.2 幂等控制原子防护网 三、Service Mesh深度集成&#xf…

【Elasticsearch】es初识,在项目架构中的用途,与mysql和kafka的配合使用,

ES是一个开源的高扩展的分布式全文检索引擎 在项目已有mysql增删改查的情况下&#xff0c;新增kafka&#xff0c;es流程 用户新增/修改商家&#xff08;写MySQL&#xff09; ↓ Kafka 生产者发送商家数据消息 ↓ Kafka 消费者监听消息 → 写入 Elasticsearch ↓ 前端搜索商家时…

【DataWhale组队学习】AI办公实践与应用-数据分析

AI办公&#xff1a;数据分析 1. 使用大模型进行数据分析的常见流程 把数据扔给AI让AI自动分析&#xff0c;并告诉你结果 下面我们对上面两个步骤进行详细说明 2. 使用大模型进行数据分析 2.1 将数据扔给大模型 2.1.1 选择合适的办公大模型 要使用大模型进行数据分析时&a…

5G 浪潮:发展全景、困境突围与未来航向

在当今数字化浪潮中&#xff0c;5G 技术宛如一颗璀璨的明星&#xff0c;照亮了各个行业前行的道路。自 5G 正式商用以来&#xff0c;它不仅深刻改变了人们的生活方式&#xff0c;更在工业、农业、交通等领域掀起了一场数字化转型的革命。本文将深入探讨 5G 技术的原理、发展现状…

理论加案例,一文读懂数据分析中的分类建模

一、什么是分类 分类&#xff0c;是数据建模领域的重要分支&#xff0c;你每天也都会接触。 手机垃圾短信过滤&#xff0c;就是分类算法给短信打的标签&#xff0c;比如0代表正常短信&#xff0c;1代表垃圾短信。 在医学领域&#xff0c;根据影像检查判断肿瘤是良性还是恶性。…

数组题解——二分查找【LeetCode】

704. 二分查找 算法逻辑分析 初始化边界 left 设为0&#xff0c;right 设为len(nums)&#xff0c;表示左闭右开区间 [left, right)。这意味着搜索区间包含下标left&#xff0c;但不包含下标right。 循环条件 while left < right:&#xff0c;只要left小于right&#xff0c…

Function AI 工作流发布:以 AI 重塑企业流程自动化

作者&#xff1a;寒斜 在 AI 技术飞速发展的今天&#xff0c;企业的流程自动化方式也正在发生深刻变革。过去&#xff0c;流程自动化往往依赖于人工配置和固定规则&#xff0c;难以适应复杂、多变的业务场景。而如今&#xff0c;随着 LLM&#xff0c;Agent&#xff0c;MCP 等节…

【单元测试】单元测试的定义和作用

介绍 ‌单元测试不仅是对函数进行测试&#xff0c;还包括对类、组件等最小可测试单元的测试‌。单元测试是对软件中的最小可测试单元进行验证的过程&#xff0c;这些单元可以是函数、方法、类或组件等。单元测试的主要目的是确保这些最小单元在隔离的环境中能够正确地实现其功…