【什么是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. 使用edge浏览器时,怎么让alt+tab不切换他的子标签页而只在程序间切换?

    使用搜索按钮(WIN+Q),搜索"多任务设置",在弹出的窗口中看到"alt+tab"相关设置.选择"仅打开的窗口",ok搞定.

  2. ElasticSearch服务Java内存异常分析和排查解决

    ElasticSearch服务Java内存异常分析和排查解决 1.ElasticSearch业务微服务日志排查java.lang.IllegalStateException: Request cann ...

  3. 将静态文件打包进nuget里 Net Core

    我之前写了一个.net core 生成验证码的小工具 需要使用者先单独下载字体文件到本地在 install-package 感觉这样很捞也很不方便,但当时忙着做其他需求现在更新下. 其实很简单 vis ...

  4. K8s高可用集群二进制部署-V1.20

    一.前置知识点 1.1 生产环境部署K8s集群的两种方式 kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集 ...

  5. Windows下Qt5程序打包发布

    Windows下Qt5程序打包发布与图标设置 原文(有删改):https://blog.csdn.net/qq_39105333/article/details/114779650 设置程序图标 默认 ...

  6. supervisor 安装和基本使用

    安装 yum install supervisor touch /var/run/supervisor/supervisor.sock chmod 777 /var/run/supervisor/su ...

  7. Python使用Argparse读取命令参数

    python编写的脚本需要通过命令参数来做一些参数配置.本文将介绍如何使用argparse来解析命令行参数.这种方法相对于sys.args的方式会简单很多. 通过以下的脚本来构建一个简单的配置解析器, ...

  8. CANoe创建仿真工程

    在现代汽车工业中,车载测试是确保车辆电子系统可靠性和功能性的关键环节.而使用CANoe创建仿真工程,不仅能够模拟真实的车辆环境,还能大大提升测试效率和准确性.那么,CANoe是如何实现这些的呢? 车载 ...

  9. 关于python3多线程和协程

    以下内容部分由chatgpt生成,本文仅作为备忘和记录. asyncio.sleep 和 time.sleep 都是用于在 Python 中进行延迟操作的函数,但它们的工作方式和使用场景有一些不同. ...

  10. springboot 访问url 报404

    使用Springboot 写了一个后端服务,通过 postman 测试接口时,发现一直 404 (message: No message available) 把springboot 从启动 到 da ...