Vuex 状态管理学习

Vuex 是一个专为 Vue.js 设计的状态管理模式

vuex解决了组件之间同一状态的共享问题。当我们的应用遇到多个组件共享状态时,会需要:

多个组件依赖于同一状态。传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。这需要你去学习下,vue编码中多个组件之间的通讯的做法。
来自不同组件的行为需要变更同一状态。我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。

以上的这些模式非常脆弱,通常会导致无法维护的代码。来自官网的一句话:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。

它采用集中式存储管理应用的所有组件的状态。这里的关键在于集中式存储管理。这意味着本来需要共享状态的更新是需要组件之间通讯的,而现在有了vuex,就组件就都和store通讯了。问题就自然解决了。

这就是为什么官网再次会提到Vuex构建大型应用的价值。如果您不打算开发大型单页应用,使用 Vuex
可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。

官方文档讲了很多,都是些概念性的东西,云里雾里,但总结下来就以下几点:
  • 1.vuex解决了组件之间同一状态的共享问题 (解决了不同组件之间的数据共享)
  • 2.组件里面数据的持久化。
  • 3.小项目不部建议用vuex

vuex的使用:

1、src目录下面新建一个vuex的文件夹

2、vuex 文件夹里面新建一个store.js
3、安装vuex
cnpm install vuex --save
4、在刚才创建的store.js引入vue 引入vuex 并且use vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
5、state 定义数据
/*1.state在vuex中用于存储数据*/
		var state={
		    count:1
		}	
6、mutations

在vuex 中,只有mutation 才能改变state. mutation
类似事件,每一个mutation都有一个类型和一个处理函数,因为只有mutation 才能改变state,
所以处理函数自动会获得一个默认参数 state. 所谓的类型其实就是名字,action去commit 一个mutation,
它要指定去commit哪个mutation, 所以mutation至少需要一个名字,commit mutation 之后,
要做什么事情,那就需要给它指定一个处理函数, 类型(名字) + 处理函数就构成了mutation.

var mutations={
/* ncCount--->事件类型 (type)*/
/* {	++state.count; }----> 回调函数 (handler) 默认接受 state 作为第一个参数 */
	    incCount(){
		++state.count;
	    }
	}
提交载荷(Payload)

你可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload):

mutations: {
  increment (state, n) {
    state.count += n
  }
}
store.commit('increment', 10)
在大多数情况下,载荷应该是一个对象,这样可以包含多个字段并且记录的 mutation 会更易读:
mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}
store.commit('increment', {amount: 10})
对象风格的提交方式

提交 mutation 的另一种方式是直接使用包含 type 属性的对象:

store.commit({
  type: 'increment',
  amount: 10
})

当使用对象风格的提交方式,整个对象都作为载荷传给 mutation 函数,因此 handler 保持不变:

mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}
7、优点类似计算属性 , 改变state里面的count数据的时候会触发 getters里面的方法 获取新的值 (基本用不到)
var getters= {   
    computedCount: (state) => {
	return state.count*2
    }
}
8、 Action 基本没有用 ,action去commit mutations (异步,方法中还可同时调用其他的mutations)
Action 类似于 mutation,不同在于:
- Action 提交的是 mutation,而不是直接变更状态。
- 提交一个 mutation    context.commit        		
- Action 可以包含任意异步操作。
var actions= {
	incMutationsCount(context) {    /*因此你可以调用 context.commit 提交一个 mutation*/           
		context.commit('incCount');    /*执行 mutations 里面的incCount方法 改变state里面的数据*/
	}
}
其实actions 还可以简写一下, 因为函数的参数是一个对象,函数中用的是对象中一个方法,我们可以通过对象的解构赋值直接获取到该方法。修改一下 actions
actions: {
	increment({commit}){
    	commit("INCREMENT")
    },
    decrement({commit}){
    	commit("DECREMENT")
    }
}
所有在actions中定义的方法,他们的第一个参数是约定好的:要么是store的对象context,这样在方法体中可以使用context的所有方法;
var actions= {
	incMutationsCount(context) {    /*因此你可以调用 context.commit 提交一个 mutation*/           
		context.commit('incCount');    /*执行 mutations 里面的incCount方法 改变state里面的数据*/
	}
}
或者像官方api一样,参数是context的options,用{}的形式列举出需要的options方法或者属性,这样在方法体中只能使用{}中列举出来的属性和方法,而不能使用context的其他方法和属性。而且在使用的使用不能使用context对象来调用这些options:
var actions= {
	incMutationsCount({commit,state}) {   /* 解构store.context 对象 */
		context.commit('incCount');    /*执行 mutations 里面的incCount方法 改变state里面的数据*/
	}
}
还有一点需要注意:在actions中的方法只有第一个参数才是约定的参数,从第二个参数以后的参数被称为‘荷载’,通常是一个对象(也有可能是变量)
var actions= {
	incMutationsCount({commit,state},context) {   /* context 属于普通载荷 */
		context.commit('incCount');    /*执行 mutations 里面的incCount方法 改变state里面的数据*/
	}
}
9、 Action 与 mutation 比较
action的功能和mutation是类似的,都是去变更store里的state,不过action和mutation有两点不同:
- 1、action主要处理的是异步的操作,mutation必须同步执行,而action就不受这样的限制,也就是说action中我们既可以处理同步,也可以处理异步的操作
- 2、action改变状态,最后是通过提交mutation
10.暴露
const store = new Vuex.Store({
    state,
    mutations,
    getters,
    actions
})
export default store;

组件里面使用vuex:

1.引入 store
 import store from '../vuex/store.js';
2、注册
 export default{
	data(){
		return {               
			msg:'我是一个home组件',
			value1: null,
		}
	},
	store,
	methods:{
		incCount(){
			this.$store.commit('incCount');   /*触发 state里面的数据*/
		}
	}
}
3、获取state里面的数据
this.$store.state.数据
4、触发 mutations 改变 state里面的数据
this.$store.commit('incCount');
5、触发 actions里面的方法
this.$store.dispatch('incCount');
6、{{this.$store.getters.computedCount}} 获取 getters里面方法返回的的数据
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值