几分钟带你认识vuex的五个核心属性

目录

一、Vuex是什么?

二、什么数据可以储存在vuex中呢?

三、对于使用Vuex的理解是什么?

四、vuex由五部分组成(五种状态/五种属性)

五:安装配置

 六、详解五种状态

1.state:存放公共数据 

2.getters:计算属性,对state里的变量进行过滤。

3.mutations:唯一可以改变state数据的工具,相当于vue里的methods

4.actions:异步操作

5.modules:模块化


一、Vuex是什么?


介绍:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式

理解:核心就是 store(仓库),仓库是用来干什么的?你就当它用来储存东西的。

二、什么数据可以储存在vuex中呢?


a.如果一个数据,需要在多个组件中重复使用,可以把数据存放在vue的store中

b.用户数据,购物车数据

三、对于使用Vuex的理解是什么?


       由于Vue是单向数据流,子组件内部不能直接修改从父级传递过来的数据,子组件与子组件之间无法相互传递数据。如果我们想让两个子组件之间进行通信的话,可以借助子组件 A 向父组件传值,父组件接收子组件 A 的数据后再传给 B 组件这样的方式进行通信。

       但是这样会有一个问题,就是如果子组件 A 的父组件上面还有一层爷爷组件,或者还有更多祖父类型的层级,那么是不是会很麻烦。

       因此,我们会想到能不能我们将一个共有的数据存在一个特定的地方,用的时候自己去拿,这样就不需要一层层传值,于是乎 Vuex 就应运而生了。

四、vuex由五部分组成(五种状态/五种属性)

 VueX五个核心属性分别是state、getter,mutations、actions、module


state: 定义vuex的数据地方

actions:定义异步延迟的方法

mutations: 唯一可以修改state数据的方法

getters:从现有state数据计算出新的数据, 类似于vue组件中的计算属性,对state数据进行计算(会被缓存)

modules:模块化管理store(仓库),每个模块拥有自己的 state、mutation、action、getter

五:安装配置


第一步:npm i vuex --save/-S
第二步: 创建store.js 
第三步:挂载使用        Vue.use(vuex)
第四步:const store = new Vuex.Store({...配置项})
第五步:导出 export default store
第六步:导入main.js 在根实例配置 store 选项指向 store 实例对象

具体如下:

安装
 

npm install vuex

//简写npm i vuex

 创建store.js 

// 初始化一个vuex的实例(数据仓库) 导出即可
import Vuex from 'vuex'
import Vue from 'vue'
 
// 使用安装
Vue.use(Vuex)
 
// 初始化
const store = new Vuex.Store({
  // 配置(state|mutations|actions)
})
 
export default store

 把store对象挂载到Vue实例中

 

import store from '@/store'
new Vue({
  // 把store对象挂载到vue实例对象中,这样就可以在所有的组件中获取store中的数据了
  store,
  render: h => h(App),
}).$mount('#app')

 六、详解五种状态

1.state:存放公共数据 

状态state用于存储所有组件的数据。

state: {
		// 定义vuex中的数据
		cartNum: 10,
	},

 

总结:

  1. state中的数据是自定义的,但是state属性名是固定的
  2. 获取数据可以通过 $store.state
  3. 可以使用计算属性优化模板中获取数据的方式
  4. 计算属性不可以使用箭头函数(箭头函数本身是没有this的,实际上用的是父级函数中的this)

2.getters:计算属性,对state里的变量进行过滤。

getters:从现有state数据计算出新的数据

  • 先定义getters

//在组件中调用
$store.getters.fee
// 相当于state的计算属性(基于State处理成另外一份数据)
// getters的主要应用场景:模板中需要的数据和State中的数据不完全一样
// 需要基于state中的数据进行加工处理,形成一份新的的数据,给模板使用
getters: {
		// 从现有数据计算新的数据 每个商品佣金是0.5元
		// fee佣金会跟随cartNum变化而变化
		fee:function(state){
			return state.cartNum*0.5;
		}
	},

 

在调用时,使用$store.getters.方法名,如$store.getters.powerCounter即可

  • 再使用getters
caleList () {
  // 注意:获取getters的值,不需要加括号(当属性使用)
  return this.$store.getters.getPartList
},

总结:

  1. getters相当于在State和组件之间添加一个环节(对state中的数据进行加工处理后再提供给组件)
  2. getters不要修改state中的数据
  3. getters类似之前的计算属性(基于state中的数据进行计算)

 

3.mutations:唯一可以改变state数据的工具,相当于vue里的methods

mutations:定义修改数据的方法

目标:Vuex规定必须通过mutation修改数据,不可以直接通过store修改状态数据。

为什么要用mutation方式修改数据?Vuex的规定

为什么要有这样的规定?统一管理数据,便于监控数据变化

1.vuex的store状态的唯一更新方式:

提交mutations
mutations主要包括两部分:

  • 字符串的事件类型
  • 一个回调函数,该回调函数的第一个参数就是state
mutations: {
		// 修改state数据必须在mutations中的方法
		// 方法名建议大写
		SET_CART_NUM(state,data){
			// 修改cartNum的值
			state.cartNum = data;
		}
	},

2.在组件中访问mutations的方法


$store.commit('SET_CART_NUM',100)

<p>购物车数量:{{$store.state.cartNum}}</p>
<button @click="$store.commit('SET_CART_NUM',100)">修改为100</button>
<button @click="$store.commit('SET_CART_NUM',$store.state.cartNum+1)">修改+1</button><br>

总结:

先定义(mutations),再出发 this.$store.commit(‘mutation的名称,参数’)
mutation的本质就是方法,方法名称自定义,mutation函数内部负责处理的变更操作。
一种操作就是一个mutation,不同的mutation处理不同的场景。
 

4.actions:异步操作

actions:定义异步延迟的方法

  • 通常情况下,Vuex要求我们的mutation中的方法必须是同步方法
  • 如果使用异步操作,那么devtools将不能很好地追踪
  • 如果确实有异步操作,要使用Action替代mutation完成

先安装axios的包

npm i axios
//导入包
import axios from 'axios'

再定义获取数据方法

 

actions: {

    // actions是固定的,用于定义异步,网络延迟等方法
	// 只能调用mutations,不能直接修改state
		getCartNum(context,data){
			// 可以执行网络请求,等待延迟
			setTimeout(()=>{
				// 等待4秒后执行mutations的 SET_CART_NUM方法
				context.commit("SET_CART_NUM",data);//修改了cartNum的值为1
			},4000)
		}
	
	},

  • mutation中的方法用commit回调
  • actions中的方法用dispatch回调
  • state里的状态只能在mutation中更改

总结:

  1. 原始方式:this.$store.dispatch(‘queryData’, num)
  2. 简化方式一:对象
  3. 简化方式二:数组

 

5.modules:模块化

modules: 模块化vuex,可以让每一个模块拥有自己的 state、mutation、action、 getters,使得结构非常清晰,方便管理。

注意style上加scoped属性的原理
在 Vue 组件中,为了使样式模块化,不对全局造成污染,可以在style 标签上添加 scoped 属性以表示它的只属于当下的模块,局部有效。
结合实际:我们做的后管系统设置头像图片样式的时候,不加scoped属性就会影响全局样式