【什么是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. ETL工具-nifi干货系列 第五讲 处理器GenerateFlowFile

    1.今天我们一起来学习处理器GenerateFlowFile.这个处理器创建带有随机数据或自定义内容的 FlowFiles.GenerateFlowFile 对于负载测试.配置和模拟非常有用.从工具栏 ...

  2. ABC335

    输 E 对于 \((u,v)\): 若 \(a_u = a_v\),则把 \(u\) 和 \(v\) 扔到同一个并查集里 否则连接两个点 然后跑一遍 dp 即可. code F 根号分治 如果 \(a ...

  3. CF1626E

    problem 我们可以考虑什么情况下这个点一定可以到黑点. \(c_i = 1\). \(c_{son} = 1\). 儿子可以,并且儿子子树内有两个黑点 请两个不必多说,看最后一个. 假如说考虑他 ...

  4. 在js、vue中使用方法调用a标签

    <el-button type="primary" style="width:130px" @click="shout"> &l ...

  5. es6数组解构的原理初探

    原理 以前只用过数组解构为数组,或者将其他类数组解构为数组,但是还不知道对象为什么不能解构为数组 后面学习到了Symbol.iterator属性以后才知道,只要一个对象是可迭代的,那它就可以迭代为数组 ...

  6. python类和对象初识

    # python类和对象初识 a = 2 b = 3 print(id(a)) print(type(a)) print(a) print(id(b)) print(type(b)) print(b) ...

  7. Feign的客户端注解@EnableFeignClients,解决No qualifying bean of type 'xx.xx.类' available注入报错

    //如果使用Feign的客户端,请放开下列注释@EnableFeignClientsNo qualifying bean of type 'xx.xx.类' available //需要添加扫描的路径 ...

  8. mybatis查询参数Set遍历查询

    #sqlmapper <resultMap id="BaseResultMap" type="com.LogEntity" > <result ...

  9. Nuxt 3组件开发与管理

    title: Nuxt 3组件开发与管理 date: 2024/6/20 updated: 2024/6/20 author: cmdragon excerpt: 摘要:本文深入探讨了Nuxt 3的组 ...

  10. Django-缓存、信号与序列化

    缓存 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作 ...