百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

5分钟让你掌握Vuex,深入浅出

ztj100 2025-03-06 22:08 31 浏览 0 评论

来源:
https://www.cnblogs.com/maoqian/p/15428820.html

一、什么是Vuex?

概念:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

简单点来说(说人话),就是实现任意组件中通信,并可以检测数据的变化。

二、Vuex原理

Vuex是集中于MVC模式中的Model层,规定所有的数据操作必须通过 action - mutation - state 的流程来进行,再结合Vue的数据视图v-moder等双向绑定特性来实现页面的展示更新。

下面看一张图来了解全过程。

简述主要方法详情:

  • Vue Components:Vue组件。展示页面,负责接收用户操作等交互行为,执行dispatch方法触发对应action进行回应。
  • dispatch:操作行为触发方法。是唯一能执行action的方法。
  • actions:操作行为处理模块。处理Vue Components接收到的所有交互行为。包含同步/异步操作,支持多个同名方法,按照注册的顺序依次触发。向后台API请求的操作就在这个模块中进行,包括触发其他action以及提交mutation的操作。该模块提供了Promise的封装,以支持action的链式触发。
  • commit:状态改变提交操作方法。对mutation进行提交,是唯一能执行mutation的方法。
  • mutations:状态改变操作方法。是Vuex修改state的唯一推荐方法,其他修改方式在严格模式下将会报错。该方法只能进行同步操作,且方法名只能全局唯一。操作之中会有一些hook暴露出来,以进行state的监控等。
  • state:页面状态管理容器对象。集中存储Vue components中data对象的零散数据,全局唯一,以进行统一的状态管理。页面显示所需的数据从该对象中进行读取,利用Vue的细粒度数据响应机制来进行高效的状态更新。

总的一句话简述就是:

Vue组件接收交互行为,调用dispatch方法触发action相关处理,若页面状态需要改变,则调用commit方法提交mutation修改state,通过getters获取到state新值,响应数据或状态给Vue 组件,界面随之更新。

三、Vuex的使用

1.安装

npm install vuex --save

2.新建一个文件夹store,创建inde.js

随便叫啥,随便建不建立文件夹。为了规范。

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

//准备actions---用于响应组件中的动作
const actions={
}
//准备mutations---用于操作数据(state)
const mutations={    
}
//准备state---相当于data,用于存储数据
const state={
    
}
//实例化创建并导出store
export default new Vuex.Store({
    namespaced: true,//解决模块命名冲突
    actions,
    mutations,
    state,
})

注意:

我们在这一步创建index.js文件的时候导入并引用Vuex,因为我们要实例化Vuex对象。如果在main引入,会导致在main.js导入store的时候报错。

3.在main.js中引入上一步的index.js,并在实例化 Vue对象时加入 store 对象 :

import store from './store/index' //引入写好的store
.....

new Vue({
 el: '#app',
 router,
 store,//使用store
 template: '',
 components: { App }
})

ok,环境搭好,开始操作。

4.简单使用:

先来一点简单的存放数据,取出查看。在一系列操作之后我们的VM(View Model)和VC(View component)身上都已经都有store这个数据源对象。所以我们可以从store身上使用this.$store.state.xxx获取数据。

在index.js中准备数据

const state={
    name:'浪漫主义码农',
    age:18,
}

在组件中获取数据


5.mutation、anction

在知道每一个vm和vc身上都有store就可以好好操作了。

mutation--更改store中状态的唯一方法

根据上面的原理图,我们能知道vuex中规定只能通过提交mutation的方式去更改store中的状态,包括action中的操作,也是通过提交mutation去修改。另外一点就是vuex中规定mutation中不能包含异步操作

我们来修改上面的name、age属性。

const mutations = {
    modify_age(state) {//不带参数修改age属性,state是默认的参数
        state.name = "张三";
        state.age = 20;
    },
    modify_age2(state,payload) {//带参数修改,payload是传入的对象,官网叫载荷(payload)
        state.name=payload.name;
        state.age=payload.age;
    }
}

在组件中,我们要使用this.$store.commit('xxx(方法名)', 参数;

参数可以是对象也可以是单一属性



<script>
export default {
  methods: {
    setDefault() {
      this.$store.commit("modify_age");
    },
    setparameter() {
    this.$store.commit("modify_age2",{name:"王五",age:100});//载荷形式,传入可以使对象或者单个属性
      // this.$store.commit({//对象形式,传入可以使对象或者单个属性
      //   type: "modify_age2",
      //   name: "王五",
      //   age: 100,
      // });
      });
    },
  },
};
</script>

anction--同步/异步更改状态

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。

后台API请求在这个模块进行请求。所有的操作最后都要到达mutation进行操作,更改state的状态。

还是上面一个例子,异步修改state的属性

先上代码

const actions = {
    asy_modify (context) {//无参
        setTimeout(() => {//异步操作
            context.commit("modify_age")
        }, 2000);
      },
      asy_modify2 (context,plyload) {//有参
        setTimeout(() => {
            context.commit("modify_age2",plyload);
        }, 2000);
      }
}
const mutations = {
    modify_age(state) {//不带参数修改age属性,state是默认的参数
        state.name = "张三";
        state.age = 20;
    },
    modify_age2(state,payload) {//带参数修改,payload是传入的对象,官网叫载荷(payload)
        state.name=payload.name;
        state.age=payload.age;
    }
}
const state = {
    name: '浪漫主义码农',
    age: 18,
}

在组件中使用this.$store.dispatch('xxx')



<script>
export default {
  methods: {
    setDefault() {
      this.$store.dispatch("asy_modify");
    },
    setparameter() {
      this.$store.dispatch("asy_modify2",{name:"王五",age:100});//载荷形式,传入可以使对象或者单个属性
      // this.$store.dispatch({//对象形式,传入可以使对象或者单个属性
      //   type: "asy_modify2",
      //   name: "王五",
      //   age: 100,
      // });
    },
  },
};
</script>

注意观察时间,2s后变化。

分析一波:

  1. Action 里面的函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.statecontext.getters 来获取 state 和 getters。
  2. action事件的触发同样可以使用载荷和对象两种方式

6. getter

getter,我们可以理解为是对store中state的一些派生状态,也可以理解为一种计算属性,它类似于计算属性一样,返回值会根据它的依赖被缓存起来,且依赖对象发生改变的时候它才会被重新计算。

getter属性相当于很多个组件需要对数据进行一样的处理,可以理解为公共的计算属性。

这样就很清晰了

Getter 接受 state 作为其第一个参数,也可以使用箭头函数。

const getters = {
    get_object: function (state) {//无参
        if (state.age < 18) {
            return state.name + '未成年'
        }
        return state.name + '已经成年了'
    },
    get_object2: function (state) {//有参数
        return function(value){
            return state.name + value;
        }
    }
}

组件中{this.$store.getters.xxx来获取


7.Modoules

Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。这里就不过多介绍了,看官方文档(Module | Vuex (vuejs.org))

8.辅助函数

vuex提供了几个的辅助函数,有mapState、mapGetter、mapMutation、mapAction。都是一些复杂语句的简写形式。

引入函数

import {mapState,mapGetters,mapMutation,mapAction} from 'vuex'

mapState

如果state中的数据很多,那我们要重复写很多这样的this.$store.state.XXX代码,我们就可以通过mapState来映射。

数组的写法

export default {
  computed:{
    ...mapState(['name','age'])//自动就添加到了计算属性中,此时就可以直接像访问计算属性一样访问它
  }
};

如果你想取名别名的话,就要写成对象的形式

    ...mapState(
      {
        myname: 'name',
        myage: "age",
      } 

mapGetters

mapGetters和mapState很相似,只不过是映射Getters。替代this.$store.getters.XXX

computed: {
...mapGetters(['get_object','get_object2']),//数组形式写法
    ...mapGetters({get1:'get_object',get2:'get_object2'})//可以取别名,对象形式写法
  },

mapMutation

替代this.$store.commit('XXX')

  methods: {
    ...mapMutations(['modify_age','modify_age2']),//数组形式写法
    ...mapMutations({modify:'modify_age',modify2:'modify_age2'}),//可以取别名,对象形式写法
  },

mapAction

替代this.$store.dispatch('XXX')

  methods: {
    ...mapActions(['asy_modify','asy_modify2']),//数组形式写法
...mapActions({act_modify:'asy_modify',act_modify2:'asy_modify2'})//对象形式写法
  },

以上这些辅助函数,涉及到传参都需在使用的计算属性的时候传入。

四、写在最后

更具体的请看官网文档,欢迎各位大佬指点江山。

https://vuex.vuejs.org/zh/#%E4%BB%80%E4%B9%88%E6%98%AF-%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86%E6%A8%A1%E5%BC%8F

看到最后点赞收藏吧!

相关推荐

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例...

强烈推荐!Python 这个宝藏库 re 正则匹配

Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

深入理解re模块:Python中的正则表达式神器解析

在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

如何使用正则表达式和 Python 匹配不以模式开头的字符串

需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python“三步”即可爬取,毋庸置疑

声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

简单学Python——re库(正则表达式)2(split、findall、和sub)

1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

Lavazza拉瓦萨再度牵手上海大师赛

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

ArkUI-X构建Android平台AAR及使用

本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

Deepseek写歌详细教程(怎样用deepseek写歌功能)

以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

“AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

AI音乐制作神器揭秘!3款工具让你秒变高手

在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

取消回复欢迎 发表评论: