vuex适用于大型单页应用。每一个Vuex应用的核心就是store(仓库),store中储存大量状态,Vuex的状态存储是响应式的。vuex使用单一状态树,一个对象包含了全部的应用层级状态,每个应用仅仅包含一个store实例。调试页面,有可能会用到dev-tools

一、概念

1、state(共享的状态)

要get状态,需要在计算属性computed中返回状态。要get多个状态,可以借助mapState辅助函数生成计算属性。

state属性在store实例中设置,mapState函数在vue实例的computed属性中写。

state:{
a: ''
}
//实例中
computed: {
getStateA(){
return store.state.a
}
}
//组件中
import { mapState } from 'vuex' export default {
computed: {
...mapState(['a']),
getStateA(){
return this.a;
}
}
}

2、getters(共享的方法,该方法用于get状态)

实现多个组件共享同一个状态,getters属于store的计算属性,根据依赖缓存返回值,当依赖变化时,重新计算。

getters属性在store实例中设置,mapGetters函数在vue实例或组件的computed属性中写。

getters: {
getterA: state => {
return state.a
}
}
//实例中
computed: {
getGetterA() {
return store.getters.getterA
}
}
//组件中
import { mapGetters } from 'vuex' export default {
computed: {
...mapGetters(['getterA']),
getGetterA(){
return this.getterA;
}
}
}

3、mutations(修改状态)

mutation必须是同步函数,因为回调函数进行的状态改变不能被追踪,因为mutation触发的时候,回调函数还没有被调用。

mutations属性在store实例中设置,直接修改状态,mapMutations函数在vue实例或组件的methods属性中写。

mutations: {
mutationA: state => {
state.count++
}
}
//实例中
methods: {
eventA() {
this.$store.commit('mutationA');
}
}
//组件中
import { mapMutations } from 'vuex' export default {
methods: {
...mapMutations(['mutationA']),
eventA(){
this.mutationA();
}
}
}

4、actions(提交mutation)

store中的状态是响应式的,要set状态,不能直接改变数据,而是需要提交mutation。actions属性在store实例中设置,不会直接变更状态,而是提交mutation,可以包含异步操作。mapActions函数在vue实例或组件的methods属性中写。下面介绍4种提交mutaion的办法,仅供参考。

A、在组件中提交mutation

mutations:{
//改变状态
mutationA(state, { adata }) {
state.awords = adata;
}
}
//全局定义store,在组件中提交mutation
methods:{
eventF(adata){
// 以载荷形式提交mutation
store.commit('mutationA',{ adata });
}
}
//在组件内提交mutation
methods:{
eventF(adata){
// 以载荷形式提交mutation
this.$store.commit('mutationA',{ adata });
}
}

B、在组件中提交mutation之mapMutations

import { mutationA, mutationB } from './mutation-types'

export default {
[mutationA](state,payload){
state.dataA = payload;
},
[mutationB](state,payload){
state.dataB = payload;
}
}
import { mapMutations } from 'vuex'
export default {
  methods: {
...mapMutations([
'mutationA',
'mutationB'
]),
...mapMutations({
add: 'mutationA'
}),
eventA(){
this.mutationA();
},
eventB(bdata){
this.mutationB(bdata);
},
eventC(cdata){
this.add(cdata);
}
}
}

C、在actions中提交mutation

mutations:{
//改变状态
mutationA(state, payload) {
state.awords = payload;
},
//改变状态
mutationB(state, payload) {
state.bwords = payload;
}
},
//在actions中提交mutation,同步,异步
actions:{
actionA({commit,state},payload){
commit('mutationA',payload);
},
actionB({commit},payload){
new Promise((resolve,reject)=>{
setTimeout(()=>{
commit('mutationB',payload);
resolve();
},1000)
})
}
}
//在组件中分发action
methods:{
eventA(){
store.dispatch('actionA','我是老大');
}
}

D、在actions中提交mutation之mapActions

import { mutationA, mutationB } from './mutation-types'

export default {
[mutationA](state,payload){
state.dataA = payload;
},
[mutationB](state,payload){
state.dataB = payload;
}
}
//actions.js,提交mutation
import { mutationA, mutationB } from './mutation-types' export default {
actionA({commit,state}, payload){
commit(mutationA, payload);
},
actionB({commit,state}, payload){
commit(mutationB, payload);
}
}
import { mapActions } from 'vuex'

//在组件中分发action
methods:{
...mapActions(['actionA', 'actionB']),
eventA(){
this.actionA('我是老大');
},
eventB(){
this.actionB('我是老二');
}
}

5、modules

解决状态多导致store对象臃肿,将store分割成模块,每个模块拥有自己state,getters,mutations,actions。

二、vuex的引用方法
1、用script标签

<script src="https://unpkg.com/vuex"></script>

2、npm安装

cnpm install vuex
//在js文件引入
var Vue = require('vue')
var Vuex = require('vuex') Vue.use(Vuex)

三、参考案例

四、简单版父子组件通信

const store = new Vuex.Store({
state:{
fwords: '一朵红花',
awords: '我是老大'
},
getters:{
getAwords(state){
return state.awords
}
},
mutations:{
//改变状态
listenA(state, { adata }) {
state.awords = adata;
}
}
})

1、父组件给子组件传递消息

//父组件
<com-a :apropVal="getFwords"></com-a> computed:{
getFwords(){
return store.state.fwords
}
}
//子组件
<h3>父亲给我了,{{ apropVal }}</h3> props:['apropVal']

2、子组件给父组件传递事件

//子组件
<input type="button" value="A和父亲说话" @click="eventAf"> methods:{
eventAf(){
this.$emit('a-f-msg',`谢谢父亲`);
}
}
//父组件
<com-a @a-f-msg="eventFa"></com-a> methods:{
eventFa(adata){
// 以载荷形式提交mutation
store.commit('listenA',{ adata });
}
}

五、简单版兄弟组件通信

const store = new Vuex.Store({
state:{
awords: '',
bwords: ''
},
getters:{
getAwords(state){
return state.awords
},
getBwords(state){
return state.bwords
}
},
mutations:{
//改变状态
mutationA(state, payload) {
state.awords = payload;
},
//改变状态
mutationB(state, payload) {
state.bwords = payload;
}
},
actions:{
actionA({commit,state},payload){
commit('mutationA',payload);
},
actionB({commit},payload){
new Promise((resolve,reject)=>{
setTimeout(()=>{
commit('mutationB',payload);
resolve();
},1000)
})
}
}
})
//子组件A
<h4>B传过来的数据是:{{ store.getters.getBwords }}</h4>
<input type="button" value="把值传给B" @click="eventAb"> methods:{
eventAb(){
store.dispatch('actionA','我是老大');
}
}
//子组件B
<h4>A传过来的数据是:{{ store.getters.getAwords }}</h4>
<input type="button" value="把值传给A" @click="eventBa"> methods:{
eventBa(){
store.dispatch('actionB','我是老二');
}
}

六、综合版父子兄弟组件通信

1、语法基础

A、引入和输出模块

//store.js,默认输出
export default store;
//main.js
import store from 'store.js';
// constants.js
export const A = 1;
export const B = 3;
//main.js
import { A, B } from './constants.js';
// constants.js,跨模块常量
export const A = 1;
export const B = 3;
export const C = 4;
// main.js
import * as constants from './constants';
console.log(constants.A); //
console.log(constants.B); //

B、对象扩展运算符

将多个对象合并为一个,传给computed属性。

# 安装插件
npm i -D babel-plugin-transform-object-rest-spread
#配置文件babelrc
{
"presets": ["env"],
"plugins": ["transform-runtime","transform-object-rest-spread"]
}
//组件内
computed:{
...mapGetters(['getterA','getterB','getterC'])
}

C、对象属性名用常量表达式

//mutation-types.js
export const MUTATION_A = 'MUTATION_A';
//mutations.js
import { MUTATION_A } from './mutation-types'; export default {
[MUTATION_A](state,payload){
state.dataA = payload;
}
}

D、对象参数的解构赋值

//actions.js
import { MUTATION_A } from './mutation-types';
//解构赋值前,context是一个对象
export default {
actionA(context, payload){
context.commit(MUTATION_A, payload);
}
}
//解构赋值后
export default {
actionA({commit, state}, payload){
commit(MUTATION_A, payload);
}
}

commit = context.commit,为什么这样解构赋值?查看原理

2、父组件给子组件传递

3、子组件给父组件传递

4、兄弟组件相互传递

vuex那些事儿的更多相关文章

  1. 关于Vuex的那些事儿

    vuex vuex是一个专门为Vue.js应用程序开发的状态管理模式,集中式的存储应用的所有组件的状态 以相应的规则保证状态以一种可预测的方式发生变化 单向数据流 State:驱动应用的数据源(单向数 ...

  2. Vue2.0 探索之路——生命周期和钩子函数的一些理解 - JS那些事儿

    在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这 ...

  3. 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app

    一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...

  4. Vuex、Flux、Redux、Redux-saga、Dva、MobX

    https://www.jqhtml.com/23003.html 这篇文章试着聊明白这一堆看起来挺复杂的东西.在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 Reac ...

  5. vuex存取token,http简单封装、模拟登入权限校验操作、路由懒加载的几种方式、vue单页设置title

    1.config index.js下面的跨域代理设置: proxyTable: { '/api': { target: 'http://xxxx', //要访问的后端接口 changeOrigin: ...

  6. vuex分模块3

    nuxt 踩坑之 -- Vuex状态树的模块方式使用 原创 2017年12月20日 11:24:14 标签: vue / nuxt / vuex / 模块化 / 状态管理 874 初次看到这个模块方式 ...

  7. Vuex,从入门到...

    Vuex 是什么? 官方是这么说的:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 不懂? ...

  8. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  9. 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库

    应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...

随机推荐

  1. poj2417 bsgs算法非逆元模板,用于求解A^x=B(mod C)的方程

    参考博客 https://blog.csdn.net/clover_hxy/article/details/50683832关于欧拉定理推论的证明 https://www.cnblogs.com/as ...

  2. 利用vue-cli创建新项目

    1.安装vue-cli npm i vue-cli --gd 2.初始化一个项目 vue init webpack test //test 是个项目名称并且配置相应的配置,(测试部份的可以选择no) ...

  3. easyui之自定义字体图标(鼠标覆盖时切换颜色)

    项目要求是自定义字体图标,使用easyui框架结构,众所周知easyui强功能弱样式,字体图标其实就是一张图片.要达到切换图标颜色的效果,要么就是有两套图,使用js控制.但是我这个人比较懒,不喜欢做复 ...

  4. JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器

    有这样一个压力测试环境,有一个上传页面,上传成功之后服务器会返回一些上传信息(比如文件的 id 或者保存路径之类的信息),然后压力机会继续下一个请求,比如调整 id 为 xx 的文件的一些信息等等.问 ...

  5. Linux-server-sshd

    Linux-server-sshd 1:安装 OpenSSH 服务需要4 个软件包 openssh-5.3p1-114.el6_7.x86_64:包含OpenSSH 服务器及客户端需要的核心文件 op ...

  6. Redis 学习手册

    一:Redis的简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包 ...

  7. noip飞扬的小鸟

    题解: 挺简单的题目 f[i][j]表示x坐标为i,y坐标为j的最小值 会发现那个东西是个完全背包 从f[i][j-a[i]]转移一下就是O(1)转移的了 另外上界为m这个要特判一下 我把sum[a[ ...

  8. 【BZOJ4155】[Ipsc2015]Humble Captains

    题解: 第一问裸的最小割 第二问考虑贪心 我们把边权平均分配给两个点 然后就变成了给n个数分两组差最小 np-hard问题 暴力背包,操作存在区间左移,右移,or bieset优化

  9. 【C#】WebApi 添加过滤器,实现对请求参数和响应内容的日志记录

    filter的介绍 filter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等:Web API提供两种过滤器的基本类型:actionfilterattribute,excep ...

  10. 【Android】ContentValues的用法

    ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而 ...