Vuex的使用及知识点笔记

 更新时间:2022年12月07日 09:24:41   作者:键.  
这篇文章主要介绍了Vuex的使用及知识点笔记,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1 入门

vuex是为vue.js专门提供的状态管理模式

简单解释:将所有组件公用的数据、方法提取到指定的地方,进行统一管理

2 安装

下载vuex

npm i vuex --save

image-20211008165446298

在src根目录中新建一个store文件夹并新建一个index.js文件,并在index.js中引入vue和vuex

import Vue from 'vue'
//导入vuex插件
import Vuex from 'vuex'

//使用vuex插件
Vue.use(Vuex)

export default new Vuex.Store({
	state:{//state相当于普通组件中的data数据域
		
	},
	getters:{//getter相当于computed对象
		
	},
	mutations:{//mutations相当于methods对象
		
	},
	actions:{
		
	},
	modules:{//分割模块
		
	}
})

在main.js中导入index.js文件并挂载

image-20211008165749159

3 核心概念的使用

3.1 state

state为vuex中的公共状态,我们可以看成state为所有组件的data,用于保存所有组件的公共数据·。

export default new Vuex.Store({
	state:{//state相当于普通组件中的data数据域
		names:['胡桃','甘雨']
	}
})

在任意组件内可以使用this.$store.state.names来获取到state里面的数据

 <p>{{this.$store.state.names}}</p>

image-20211008170817020

3.2 getters

vuex的getters属性可以理解为所有组件的computed属性,也就是计算属性.getters的返回值会根据其依赖缓存起来的,只有当依赖的值发生改变,getters才会重新计算

export default new Vuex.Store({
	state:{//state相当于普通组件中的data数据域
		names:['胡桃','甘雨'],
		num:5
	},
	getters:{//getter相当于computed对象
		add(state){//state的数据会自动传入add的方法
			return state.num+5
		}
	}
})

在任意的组件内使用this.$store.getters.add调用计算的方法

<p>{{this.$store.state.names}}</p>
<p>{{this.$store.getters.add}}</p>

3.3 mutations

vuex中的mutations可以理解为所有组件的methods方法。

mutations对象中保存了更改数据的回调函数。

第一个参数为state,第二个参数为payload,相当于自定义参数

export default new Vuex.Store({
	state:{//state相当于普通组件中的data数据域
		names:['胡桃','甘雨'],
		num:5
	},
	getters:{//getter相当于computed对象
		add(state){
			return state.num+5
		}
	},
	mutations:{//mutations相当于methods对象
		add(state,payload){//注意:必须传入state参数,payload为自定义参数
			state.num+=payload;
		}
	}
})

在任意组件内通过this.$store.commit()触发mutations内的方法

<template>
	<div id='Home'>
        <p>{{this.$store.state.names}}</p>
        <p>{{this.$store.getters.add}}</p>
        <p><input type="text"  v-model="this.$store.state.num"/> <span @click="add()">+</span></p>
    </div>
</template>

<script>
export default{
	name:'Home',
	methods:{
		add(){
            // this.$store.commit('evnetName',自定义的参数)
			this.$store.commit('add',5)
		}
	}
}
</script>

每一次点击都会给state里面的num数据加5

3.4 actions

actions和mutations类似,不同点在于:

1、actions提交的是mutations,而不是直接变更状态

2、actions中包含异步,mutations中绝对不允许出现异步

3、actions中回调函数的第一个参数为context,得到一个与store具有相同属性和方法的对象

export default new Vuex.Store({
	state:{//state相当于普通组件中的data数据域
		names:['胡桃','甘雨'],
		num:5
	},
	getters:{//getter相当于computed对象
		add(state){
			return state.num+5
		}
	},
	mutations:{//mutations相当于methods对象
		add(state,payload){//注意:必须传入state参数,payload为自定义参数
			state.num+=payload;
		}
	},
	actions:{
		addSync(context,payload){
			setTimeout(()=>{
                //add为mutations内定义的函数
                //通过commit调用mutations内的函数
				context.commit('add',payload)
			},1000)
		}
	},
})

组件内绑定事件

<p><input type="text"  v-model="this.$store.state.num"/> <span @click="addSync()">+</span></p>

通过 this.$store.dispatch调用actions内的异步方法

methods:{
		addSync(){
			this.$store.dispatch('addSync',2)
		}
	}

测试的效果就是每次点击之后,要过1s才会改变state里面的数值num

3.5 modules

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。

当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。

每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

在组件内分模块进行访问

<h2>{{this.$store.state.a.count}}</h2>
<h2>{{this.$store.state.b.msg}}</h2>

4 辅助函数的使用

mapState、mapGetters、mapMutations、mapActions

引入

import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'

在computed中使用扩展运算符进行定义

export default {
  name: 'list',
  data () {
    return {
    }
  },
  computed:{
    	  ...mapState({
		  //Index则代表state的num属性
		index:'num'
	  }),
	  ...mapGetters({
		  // 属性值add则代表getters内的add方法
		  add:'add'
	  }) 
  },
  methods:{
     ...mapMutation({
		  addNum:'addNum'
	  }),
	  ...mapActions({
		  
	  }) 
  }
}

vuex好文档推荐 参考资料:https://vuex.vuejs.org/zh/

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Element Plus 日期选择器获取选中的日期格式(当前日期/时间戳格式)

    Element Plus 日期选择器获取选中的日期格式(当前日期/时间戳格式)

    如果想要获取选中的日期时间就需要通过,Element Plus 日期选择器 format属性和value-format属性,format指定输入框的格式,value-format 指定绑定值的格式,本篇文章就给大家介绍Element Plus 日期选择器获取选中的日期格式(当前日期/时间戳格式),感兴趣的朋友一起看看吧
    2023-10-10
  • IE9 elementUI文件上传的问题解决

    IE9 elementUI文件上传的问题解决

    这篇文章主要介绍了IE9 elementUI文件上传的问题解决,有需要了解IE9 elementUI文件上传的朋友可参考。希望此文章对各位有所帮助
    2018-10-10
  • vue如何实现清空this.$route.query的值

    vue如何实现清空this.$route.query的值

    这篇文章主要介绍了vue如何实现清空this.$route.query的值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • vue中关于v-for循环key值问题的研究

    vue中关于v-for循环key值问题的研究

    这篇文章主要介绍了vue中关于v-for循环key值问题的研究,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • vuex的使用及持久化state的方式详解

    vuex的使用及持久化state的方式详解

    这篇文章主要介绍了vuex的使用及持久化state的方式详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 详解mpvue scroll-view自动回弹bug解决方案

    详解mpvue scroll-view自动回弹bug解决方案

    设置了scroll-top的scroll-view组件,在组件所在vue实例data发生改变时会自动回弹到最上方,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • Vue.js自定义事件的表单输入组件方法

    Vue.js自定义事件的表单输入组件方法

    下面小编就为大家分享一篇Vue.js自定义事件的表单输入组件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 通过命令行生成vue项目框架的方法

    通过命令行生成vue项目框架的方法

    本篇文章主要介绍了通过命令行生成vue项目框架的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Vue router动态路由实现过程

    Vue router动态路由实现过程

    Vue动态路由(约定路由),听起来好像很玄乎的样子,但是你要是理解了实现思路,你会发现没有想象中的那么难,下面这篇文章主要给大家介绍了关于vue实现动态路由添加功能的简单方法,需要的朋友可以参考下
    2023-03-03
  • vue el-date-picker 开始日期不能大于结束日期的实现代码

    vue el-date-picker 开始日期不能大于结束日期的实现代码

    这篇文章主要介绍了vue el-date-picker 开始日期不能大于结束日期的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01

最新评论