加载中...
vuex
发表于:2022-12-02 | 更新于:2023-03-09 | 分类: vue

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,核心就是 store(仓库)用来储存东西的。

核心属性

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

state: 定义 vuex 的数据地方

actions:定义异步延迟的方法

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

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

modules:模块化管理 store(仓库),每个模块拥有自己的 state、mutation、action、getter
mutation中的方法用commit回调

actions中的方法用dispatch回调

state里的状态只能在mutation中更改

安装配置

下载依赖

npm i vuex -S

新建:src/stroe/index.js

// 初始化一个vuex的实例(数据仓库) 导出即可
import Vuex from 'vuex'
import Vue from 'vue'

// 使用安装
Vue.use(Vuex)

// 初始化
const store = new Vuex.Store({
  state: {},
  getters: {},
  mutations: {},
  actions: {},
  modules: {}
})

// 导出
export default store

main.js 挂载

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

使用方法

state

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

state: {
	// 定义vuex中的数据
	cartNum: 10,
}
获取数据可以通过 $store.state

可以使用计算属性优化模板中获取数据的方式

state中的数据是自定义的,但是state属性名是固定的

计算属性不可以使用箭头函数(箭头函数本身是没有this的,实际上用的是父级函数中的this

getters

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

//在组件中调用
$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 即可

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

mutations

唯一可以改变 state 数据的工具 (提交 mutations)
先定义(mutations),再出发 this.$store.commit(‘mutation 的名称,参数’)
Vuex 规定必须通过 mutation 修改数据,不可以直接通过 store 修改状态数据
为什么要用 mutation 方式修改数据?统一管理数据,便于监控数据变化

mutations: {
	// 修改state数据必须在mutations中的方法
	// 方法名建议大写
	SET_CART_NUM(state,data){
		// 修改cartNum的值
		state.cartNum = data;
	}
},
<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>

actions

定义异步延迟的方法 this.$store.dispatch(‘getCartNum’, context,data)
使用异步操作 devtools 将不能很好地追踪,如果确实有异步操作,要使用 Action 替代 mutation 完成

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