【什么是VueX?】

VueX是一个专门为Vue.js应用程序开发的状态管理模式,

采用集中式存储管理应用的所有组件状态,

以相应的规则保证按照一种可预测的方式发生改变。

即把多个组件的变量统一放到一个地方管理

在项目中安装Vuex

npm install vuex

新建store目录和一个index.js

并写入以下代码:

import Vue from 'vue';
import VueX from 'vuex'; Vue.use(VueX); const store = new VueX.Store({
state : {
count : 0
},
mutations : {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
}
}); export default store;

其次,我们要让所有的Vue组件,都能使用store,

就需要在main.js中引入,引入方式与router一样

import Vue from 'vue'
import App from './App.vue'
import router from "./router"; // ./router/index.js 因为是index.js,可以默认不写
import store from "./store"; Vue.config.productionTip = false new Vue({
render: h => h(App),
router,
store
}).$mount('#app');

在任意一个Vue组件中插值引入:

<template>
<div>
<h2>样本的标题</h2>
<p>样本的标签</p>
<p>{{$store.state.count}}</p>
</div>
</template> <script>
export default {
name: "sample"
}
</script> <style scoped> </style>

可以看到这里已经完全取出来了

然后再编写两个按钮和对应的事件:

<template>
<div>
<h2>样本的标题</h2>
<p>样本的标签</p>
<p> <button @click="decrease">减少</button> {{$store.state.count}} <button @click="increase">增加</button> </p>
</div>
</template> <script>
export default {
name: "sample",
methods : {
decrease() {
this.$store.commit("decrement");
},
increase() {
this.$store.commit("increment"
);
}
}

}
</script> <style scoped> </style>

查看效果:

然后再主页面也渲染这个变量:

可以发现,是一样的:

就是为了一些公共变量而存在的

【State】

Vuex提出使用单一状态树,(单一数据源),就是将一堆公共的数据放到一起去管理

state的意义类似Vue实例的data对象,所有的数据信息存放state中,但是访问不建议也像vue那样直接引用

【Gettter】

我们需要从state中获取一些经过改变后的数据,可以使用getter

store的index.js

import Vue from 'vue';
import VueX from 'vuex'; Vue.use(VueX); const store = new VueX.Store({
state : {
count : 0,
studentList : [
{ id :
1, name : "张三", age : 23, gender : true },
{ id : 2, name : "李四", age : 24, gender : true },
{ id : 3, name : "王五", age : 25, gender : true },
{ id : 4, name : "阿伟", age : 26, gender : true },
{ id : 5, name : "杰哥", age : 27, gender : true
},
]
},

mutations : {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
},
getters : {
getStudentByAge(state) {
return state.studentList.filter(e => e.age > 24);
}
}

}); export default store;

在组件中可以通过this.$store.getters.xxx获取

<p> {{$store.getters.getStudentByAge}} </p>

效果:

【Mutations】

用于对state中的数据进行修改,或者是传值,类似vue实例的methods

调用mutations中的方法,需要这样:

this.$store.commit('方法名称',参数列表)

【Actions】

需要注意的是,我们不会在mutations进行异步操作:【使用规范】

但是在某些特定需求的情况下必须使用:比如ajax异步请求

这时候我们就可以使用actions处理:

作用就是为了代替mutations来完成这种功能

context参数,是和Store对象具有相同方法和属性的对象

即我们可以使用context.commit调用mutations

import Vue from 'vue';
import VueX from 'vuex'; Vue.use(VueX); const store = new VueX.Store({
state : {
count : 0,
studentList : [
{ id : 1, name : "张三", age : 23, gender : true },
{ id : 2, name : "李四", age : 24, gender : true },
{ id : 3, name : "王五", age : 25, gender : true },
{ id : 4, name : "阿伟", age : 26, gender : true },
{ id : 5, name : "杰哥", age : 27, gender : true },
]
},
mutations : {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
},
getters : {
getStudentByAge(state) {
return state.studentList.filter(e => e.age > 24);
}
},
actions : {
increa(context) {
context.commit(
'increment');
}
}

}); export default store;

调用actions的方法需要使用dispatch分发

<template>
<div>
<h2>样本的标题</h2>
<p>样本的标签</p>
<p> <button @click="decrease">减少</button> {{$store.state.count}} <button @click="increase">增加</button></p>
</div>
</template> <script>
export default {
name: "sample",
methods : {
decrease() {
this.$store.commit("decrement");
},
increase() {
// this.$store.commit("increment");
this.$store.dispatch('increa'
);
}

}
}
</script> <style scoped> </style>

其实对比发现,就是多一个action处理:

actions可用于异步操作,即可以使用Promise,

在异步操作中放入Promise,成功或者失败后,调用对应函数

import Vue from 'vue';
import VueX from 'vuex'; Vue.use(VueX); const store = new VueX.Store({
state : {
count : 0,
studentList : [
{ id : 1, name : "张三", age : 23, gender : true },
{ id : 2, name : "李四", age : 24, gender : true },
{ id : 3, name : "王五", age : 25, gender : true },
{ id : 4, name : "阿伟", age : 26, gender : true },
{ id : 5, name : "杰哥", age : 27, gender : true },
]
},
mutations : {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
},
getters : {
getStudentByAge(state) {
return state.studentList.filter(e => e.age > 24);
}
},
actions : {
increa(context) {
context.commit('increment');
},
mp(context) {
return new Promise(resolve => {
setTimeout(() => {
context.commit("decrement");
resolve();
}, 1000
);
});
}

}
}); export default store;

组件这里:

<template>
<div>
<h2>样本的标题</h2>
<p>样本的标签</p>
<p> <button @click="decrease">减少</button> {{$store.state.count}} <button @click="increase">增加</button></p>
</div>
</template> <script>
export default {
name: "sample",
methods : {
decrease() {
// this.$store.commit("decrement");
this.$store.dispatch('mp').then(res => {
alert("数据跟新完毕"
);
});
},

increase() {
// this.$store.commit("increment");
this.$store.dispatch('increa');
}
}
}
</script> <style scoped> </style>

每次点击减少按钮就会晚一秒执行,然后再弹窗警告:

【Modules】

模块,vuex使用了单一状态树,当我们的状态过多时,使用store管理可能臃肿,这时候可以按照模块区划分vuex的store数据

当然,store还是可以统一管理module的

每个module即一个小的vuex,都具备上面的那些属性【getters,state,actions . . .】

import Vue from 'vue';
import VueX from 'vuex'; Vue.use(VueX); const user = {
state : {
studentList : [
{ id : 1, name : "张三", age : 23, gender : true },
{ id : 2, name : "李四", age : 24, gender : true },
{ id : 3, name : "王五", age : 25, gender : true },
{ id : 4, name : "阿伟", age : 26, gender : true },
{ id : 5, name : "杰哥", age : 27, gender : true },
],
token : "",
name : '',
header : '',
},
getters : {
getStudentByAge(state) {
return state.studentList.filter(e => e.age > 24);
}
}
} const baseData = {
state : {
count : 0,
},
mutations : {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
}
},
actions : {
increa(context) {
context.commit('increment');
},
mp(context) {
return new Promise(resolve => {
setTimeout(() => {
context.commit("decrement");
resolve();
}, 1000);
});
}
}
} const store = new
VueX.Store({
modules : {
user,
baseData
}
});
export default store;

组件中的调用也需要更改:

      <p> {{$store.state.baseData.count}} </p>
<p> {{$store.getters.getStudentByAge}} </p>

如果再index.js有太多的模块,可以抽取成文件,引入使用:

【Vue】15 VueX的更多相关文章

  1. 【VUE】8.VUEX核心概念

    1. Vuex核心概念主要如下 state : 存储共享数据 mutation: 变更store中的数据,方法,不能异步操作 action: 异步操作,通过触发mutation变更数据 getter: ...

  2. 【VUE】7.Vuex基本使用

    1. 安装Vuex npm install vuex --save 2. 导入Vuex包 import Vuex from 'vuex' Vue.use(Vuex) 3. 创建store对象 cons ...

  3. 【vue】生成接口模拟数据

    目录 方案一:自定义模拟数据 Step1 创建json文件 Step2 在 vue.config.js 中配置 Step3 在组件中使用 (方式一) Step3 封装api (方式二) Step4 在 ...

  4. 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据

    前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...

  5. 【vue】移动端demo资料

    http://imzjh.com/inew/#/(移动端demo) https://github.com/liangxiaojuan/eleme(饿了么git地址) https://github.co ...

  6. 【vue】MongoDB+Nodejs+express+Vue后台管理项目Demo

    ¶项目分析 一个完整的网站服务架构,包括:   1.web frame ---这里应用express框架   2.web server ---这里应用nodejs   3.Database ---这里 ...

  7. 【vue】本地开发mock数据支持

    项目离不开数据渲染的支持,为本地开发配置 数据  支持. (一)方式一:安装JSON Server搭建mock数据的服务器 json Server 是一个创建 伪RESTful服务器的工具. 配置流程 ...

  8. 【vue】npm run mock & npm run dev 无法同时运行的解决

    [关于系统,没注明的都是windows系统,若以后用的是mac系统则会另外备注] 当项目数据是通过mock搭建而成(参照:[vue]本地开发mock数据支持)时,运行mock服务器和项目的命令 就参照 ...

  9. 【VUE】自定义组件

    [VUE]自定义组件 转载: ============================================ ======================================== ...

  10. 【VUE】使用问题记录

    [VUE]使用问题记录 ===================================================================== 1.Vue.nextTick 修改数 ...

随机推荐

  1. react 数据请求分层

    封装一个接口请求类 数据模型 请求uri配置设置 数据统一存储于redux中,在本项目中创建一个store目录,此目录中就是redux仓库源 定义仓库入口 reducer methods方法 acti ...

  2. kettle从入门到精通 第三十六课 kettle carte 集群

    1.carte服务可以单体运行也可以集群方式运行,今天我们一起来学习下carte的集群模式部署和使用.本次示例用一个master和两个slave从节点演示. carte-config-master-8 ...

  3. 双网卡、多网卡指定IP分别访问网卡(windows添加静态路由)

    有两块网卡,网关分别是 128.0.100.198 和 192.168.10.2,128.0.100.198,网速10M.192.168.10.2,网速100M.平时上网用192.168.10.2,访 ...

  4. 《Android开发卷——自定义日期选择器(三)》

                 继 <Android开发卷--自定义日期选择器(一)>:http://blog.csdn.net/chillax_li/article/details/19047 ...

  5. 为什么https要使用证书

    为什么https要使用证书 什么是httpshttps不是一种新的协议,只是http的通信接口部分使用了ssl和tsl协议替代,加入了加密.证书.完整性保护的功能. 加密:共享密钥加密加密和解密公用一 ...

  6. injectionIII iOS代码注入工具(下)

    injectionIII iOS代码注入工具(下) 本文将解决如何使用injectionIII对主页热重载,如果对injectionIII不了解的同学请回到上篇查看 Vaccine 简单地说Vacci ...

  7. vc++6.0设置字体

    vc++6.0设置字体 如上图, 在注册表上找到这个位置. 自已设置FontFace和FontSize即可. 计算机\HKEY_CURRENT_USER\Software\Microsoft\Devs ...

  8. 千万别忽视基础!十张图带你一步步理解Java内存结构!

    作为一个Java程序员,在日常的开发中,不必像C/C++程序员那样,为每一个内存的分配而操心,JVM会替我们进行自动的内存分配和回收,方便我们开发.但是一旦发生内存泄漏或者内存溢出,如果对Java内存 ...

  9. 3.8折钜惠,瑞芯微RK3568J国产工业评估板“限时折扣”!

  10. mysql求同比环比

    -- 参考:SQL计算月环比.月同比_路易吃泡面的博客-CSDN博客 -- mysql同比环比 drop table if EXISTS ordertable; create table ordert ...