一篇搞定Vuex
1.简介
首先,你必须明显明白vuex到底是干啥的,主要解决开发中的哪些问题?
Vuex是一个专门为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式变化
说白了,就是:提供了那么一个公共存储的地方,存放各个组件的数据,组件访问数据和操作数据访问这个地方即可
所以,Vuex主要解决是组件间数据传递问题,尤其是嵌套组件,项目一大时,父子组件间的数据传递就非常麻烦了,而Vuex则提供了一种集中管理组件数据的方案,当然小型项目就没必要用Vuex了
2.Demo准备
- vue init webpack-simple vuex-demo
- cd vuex-demo
- npm install
- npm install vuex -S
3.访问store对象的两种方式
Vuex的核心是Store(仓库),相当于是一个容器,一个store实例中包含以下属性的方法:
- state 定义属性(状态、数据)
- getters 用来获取属性
- actions 定义方法(动作)
- commit 提交变化,修改数据的唯一方式就是显式的提交mutations
- mutations 定义变化
注:不能直接修改数据,必须显式提交变化,目的是为了追踪到状态的变化
创建store.js文件,在main.js中导入并配置store.选项
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex); //定义属性(数据)
var state = {
count: 6
} //创建store对象
const store = new Vuex.Store({
state,
}) //导出store对象
export default store;
import Vue from 'vue'
import App from './App.vue' import store from './store.js' //导入store对象 new Vue({
store,
el: '#app',
render: h => h(App)
})
方式一:通过this.$store访问
//方式1:通过this.$store访问
computed: {
count() {
return this.$store.state.count;
}
}
方式二:通过mapState、mapGetters、mapActions访问,vuex提供了两个方法
- mapState 获取state
- mapGetters 获取getters
- mapActions 获取actions
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex); //定义属性(数据)
var state = {
count: 6
} //定义getters
var getters = {
count(state) {
return state.count;
}
} //定义actions,要执行的操作,如流程判断、异步请求
const actions = {
increment(context) { //包含 commit dispatch state
context.commit('increment');
},
decrement(context) {
if (context.state.count > 10) {
context.commit('decrement');
}
}
} //定义mutations,处理状态(数据)的改变
const mutations = {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
} //创建store对象
const store = new Vuex.Store({
state,
getters,
actions,
mutations,
}) //导出store对象
export default store;
<template>
<div id="app">
<button @click="increment">增加</button>
<button @click="decrement">减小</button>
<p>当前数字为:{{count}}</p>
</div>
</template> <script>
import { mapState, mapGetters, mapActions } from "vuex"; export default {
name: "app",
data() {
return {
msg: "Welcome to Your Vue.js App"
};
},
//方式1:通过this.$store访问
/*computed: {
count() {
return this.$store.state.count;
}
}*/ /*computed:mapState([
'count'
])*/ computed: mapGetters(["count"]),
methods:mapActions([
'increment',
'decrement',
])
};
</script> <style>
</style>
分模块组织Vuex
上面那种方式,所有的都写在一个文件,项目大时,难免看起来显乱,所以需要分模块来组织,原则上就私有和公共的分开进行组织
其中modules存放每个模块的,actions.js,getters.js,mutations.js存放公共的,目录如下

user.js
/**
* 用户模块
*/ import types from '../types.js' const state={
count:6
} var getters={
count(state){
return state.count;
}
} const actions = {
increment({commit,state}){
commit(types.INCREMENT); //提交一个名为increment的变化,名称可自定义,可以认为是类型名
},
decrement({commit,state}){
if(state.count>10){
commit(types.DECREMENT);
}
}
} const mutations={
[types.INCREMENT](state){
state.count++;
},
[types.DECREMENT](state){
state.count--;
}
} export default {
state,
getters,
actions,
mutations
}
actions.js
import types from './types.js'
const actions={
incrementAsync({commit,state}){
//异步操作
var p=new Promise((resolve,reject) => {
setTimeout(() => {
resolve();
},3000);
});
p.then(() => {
commit(types.INCREMENT);
}).catch(() => {
console.log('异步操作');
});
}
}
export default actions;
getters.js
const getters={
isEvenOrOdd(state){
return state.user.count%2==0?'偶数':'奇数';
}
}
export default getters;
types.js
/**
* 定义类型常量
*/ const INCREMENT='INCREMENT'
const DECREMENT='DECREMENT' export default {
INCREMENT,
DECREMENT
}
index.js
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex); import getters from './getters.js'
import actions from './actions.js'
import user from './modules/user.js' export default new Vuex.Store({
getters,
actions,
modules:{
user
}
});
main.js
import Vue from 'vue'
import App from './App.vue' import store from './store/index.js' new Vue({
store,
el: '#app',
render: h => h(App)
})
分模块组织的访问
console.log(this.$store);
console.log(this.$store.getters['dirTestcaseData']);
console.log(this.$store.getters['user/count']); console.log(this.$store.state['project']);
console.log(this.$store.state.user['count']); this.$store.dispatch("asset/changeCurrentFundIndex", index);
this.$store.dispatch('increment'); //导入
import { mapState, mapGetters } from "vuex"; //批量引入
...mapGetters("asset", {
assetDetailType: "assetDetailType",
tradeSelectVal: "tradeSelectVal",
totalAsset: "totalAsset"
}) //也支持数组
一篇搞定Vuex的更多相关文章
- 一篇搞定RSA加密与SHA签名|与Java完全同步
基础知识 什么是RSA?答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名. RSA加密中padding?答:padding即填充方式,由于RSA加密算法 ...
- 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...
- 一篇搞定微信分享和line分享
前言 在h5的页面开发中,分享是不可或缺的一部分,对于一些传播性比较强的页面,活动页之类的,分享功能极为重要.例如,京东等电商年末时会有一系列的总结h5在微信中传播,就不得不提到微信的分享机制. 微信 ...
- 一篇搞定MongoDB
MongoDB最基础的东西,我这边就不多说了,这提供罗兄三篇给大家热身 MongoDB初始 MongoDB逻辑与物理存储结构 MongoDB的基础操作 最后对上述内容和关系型数据做个对比 非关系型数据 ...
- 【java 数据结构】还不会二叉树?一篇搞定二叉树
二叉树是我们常见的数据结构之一,在学习二叉树之前我们需要知道什么是树,什么是二叉树,本篇主要讲述了二叉树,以及二叉树的遍历. 你能get到的知识点? 1.树的介绍 2.二叉树的介绍 3.二叉树遍历的四 ...
- 一篇搞定Python正则表达式
1. 正则表达式语法 1.1 字符与字符类 1 特殊字符:\.^$?+*{}[]()| 以上特殊字符要想使用字面值,必须使用\进行转义 2 字符类 1. 包含在[]中的一个或者多个字符被称为字符 ...
- python 一篇搞定所有的异常处理
一:什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在python无法正常处理程序时就会发生一个异常(异常是python对象,表示一个错误) 异常就是 ...
- 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句
参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html Druid数据连接池简介 Druid是Java语言中最好的数据库连接池.Druid能 ...
- 一篇搞定vue请求和跨域
vue本身不支持发送AJAX请求,需要使用vue-resource.axios等插件实现 axios是一个基本Promise的HTTP请求客户端,用来发送请求,也是vue2.0官方推荐的,同时不再对v ...
随机推荐
- Android错误之--activity_main cannot be resolved or is not a field
一般在copy别人的项目中会easy出现本错误,截图例如以下:
- Java中的四种引用类型,强引用,软引用,弱引用,虚引用
对于Java中的垃圾回收机制来说,对象是否被回收的标准在于该对象是否被引用.因此,引用也是JVM进行内存管理的一个重要概念. Java中对象的引用一般有以下4种类型: 1强引用 2软引用 3弱引用 ...
- socket failed:EACCES(Permission denied)
1. 权限问题 安卓端写的TCP协议软件报错原因是建立的套接字没有限权对外连接. 在AndroidManifest.xml中,加上这一句话,取得权限. <uses-permission andr ...
- ITDB系统搭建及实时备份
ITDB系统搭建及实时备份 ITDB简介 ITDB一款来自希腊的开源IT资产管理系统,它是基于Web的IT资产信息管理系统.对于那些IT设备较多而又缺少管理IT资产信息工具的公司,ITDB是一个不错的 ...
- MySql Int 类型和 varchar类型进行比较。
今天遇到个比较奇葩的问题,简单讲就是在Mysql中进行查询的时候 在Where语句中使用的int类型的字段和Varchar类型的字段进行对比. 例如:我这有一张表: 表中的数据如下: 当我进行查询的时 ...
- eclispe luna 安装subversive和svn connector插件
1. subversive安装 下载地址: http://www.eclipse.org/subversive/latest-releases.php 或者在eclipse luna的marketpl ...
- 解决linux下/etc/rc.local开机器不执行的原因
前不久因项目需要写了开机启动其他程序的shell脚本,因工作忙,调试完给了技术支持人员,也没去注意过. 到后来,有几台服务器突然被重启了,这时候领导问,怎么开机启动的脚本没起作用,还被批了一顿,哎,做 ...
- [Win10应用开发] 如何使用Windows通知
消息通知,是一个应用中必不可少的组成部分.Win10下提供了多种消息通知机制,Toast通知只是其中一种.这篇博文和大家分享一下,如何使用Toast通知. 上图是一个基本的Toast通知,那我们该如何 ...
- cocos html5 资讯
1.visual assistx vs 插件 http://www.cr173.com/soft/32656.html 2. Box2D物理引擎 3. csdnhttp://www.csdn. ...
- ubuntu14.04安装pycurl
一. 安装依赖项 sudo apt-get install libcurl4-gnutls-dev 二. 安装pycurl pip install pycurl 三. 检验是否安装成功 进入pytho ...