vue全家桶-vuex

1、Vuex概述

Vuex是实现组件全局数据管理的一种机制,可以方便的实现各个组件之间的数据共享问题

偷了一张图

# 左边的图是没有使用vuex的时候:
	这个时候我们组件之间如果需要传递数据的话,那么在模块多的情况下,传递关系错综复杂,难以维护。
# 右边的图是使用vuex的时候:
	这个时候我们组件之间如果需要传递数据的话,那么在不管模块多少,共享数据都是通过vuex的store来进行存取,这样就统一管理了我们的共享数据,便于数据的管理和后期维护。

使用vuex的好处

# 1、能够集中的管理组件之间的共享数据,易于开发和后期维护
# 2、vuex中存储的数据都是响应式的,能够实时保持数据与页面的同步

什么样的数据适合存在vuex中

	只有组件之间必须要共享的数据才适合存在vuex中,例如身份验证的token,那么这个就要存在vuex中,那么例如一个表格的数据,那么这种就不适合存在vuex中。
	以前看过别人的博客,我记得很清楚的一句话:**不要因为要用vuex而去用vuex**。

2、Vuex的配置

# 1、安装vuex
	npm install vuex --save
# 2、导入vuex
	import Vuex from 'vuex';
# 3、使用vuex
	Vue.use(Vuex);
# 4、创建Store对象
	/* Vuex */
    const store = new Vuex.Store({
      state:{count: 0} // state中存放的就是共享的数据
    })
# 5、将Store对象挂载到Vue实例上,那么所有组件中就都可以使用Store对象
		new Vue({
          el: '#app',
          router,
          components: { App },
          template: '<App/>',
          store:store
        })
    当然我们的store:store这个后面的可以忽略

3、Vuex的核心概念

vuex的核心概念也就是vuex的实际操作大概是什么。

​ State、Mutation、Action、Getter

3.1、State

State 提供唯一的公共数据源,所有共享的数据都要统一放到 Store 的 State 中进行存储。

例如我们现在的Store是这样的

/* Vuex */
const store = new Vuex.Store({
  state:{count: 0} // state中存放的就是共享的数据
})

组件中访问Store中State数据的方式

第一种方式

this.$store.state.全局数据名称

第二种方式

1、首先需要导入mapState函数:
	import { mapState } from 'vuex'
2、将全局数据,映射为当前组件的计算属性:
	computed: {
    	/* ...mapState(['全局数据名称']) */
        ...mapState(['count'])
    }

3.2、Mutation

Mutation用于更改State中的数据。

# 注意:
	1、只能通过Mutation的方式来更改State中的数据,不要问为什么,问就是不知道(悄悄告诉你,是因为官方认为这样更加的规范)
	2、虽然操作繁琐,但是能很轻易的知道组件内对State修改数据的操作都是什么

1、第一种使用方式

	定义mutations:
/* Vuex */
const store = new Vuex.Store({
  state:{count: 0}, // state中存放的就是共享的数据
  mutations:{ // 定义mutations
    // 增加count的值
    add(state){ // 第一个参数永远都是State对象,如果需要加入参数则add(state,参数...)
      state.count++; // 使用state对count数据进行改变
    }
  }
})
	在组件中触发mutation:
//this.$store.commit('方法名'),
//如果带有参数则this.$store.commit('方法名',参数...)
this.$store.commit('add');  

2、第二种方式

mutations:
const store = new Vuex.Store({
  state:{count: 0}, // state中存放的就是共享的数据
  mutations:{ // 定义mutations
    // 增加count的值
    add(state,num){ // 第一个参数永远都是State对象,如果需要加入参数则add(state,参数...)
      state.count+=num; // 使用state对count数据进行改变
    }
  }
})
首先导入:
import { mapMutations } from 'vuex
然后映射为当前组件的methods:
	methods:{
        ...mapMutations(['changeCount'])
    }
然后使用:
<button @click="this.changeCount(5)"></button>

3.3、Action

用于处理异步任务,如果我们要通过异步来操作State中的数据,那么就得直接调用Action,然后再由Action去调用mutation

定义Action:
    actions: { // 用来指定异步任务的操作
        syncChangeCount(context,num) { // context对象的commit方法用来执行mutations中的方法
          setTimeout(() => {  // 延时1.5秒再去提交执行changeCount方法
            context.commit('changeCount',num); 
          }, 1500);
        }
      }
调用Action:
 	// 第一种执行的方法
	this.$store.dispatch('syncChangeCount',1); 
	// 第二种执行的方法
	import {mapActions} from 'vuex' // 导入
	...mapActions(['syncChangeCount']) // 在methods下映射方法
	 @click="syncChangeCount(-1)" // 像调用自己的方法一样去调用即可 

3.4、Getter

对State中的数据进行加工处理后形成新的数据

# 1、Getter 可以对 Store 中已有的数据加工处理之后形成新的数据,类似 Vue 的计算属性。
# 2、Store 中数据发生变化, Getter 的数据也会跟着变化。
定义,在vue实例中加入这个:
getters:{ // 对State中的数据进行加工处理后形成新的数据
    showCount: state => {
      return '当前的count值为:'+state.count;
    }
}
使用:
// 第一种方式,this.$store.getters.方法名
this.$store.getters.showCount
// 第二种方式
import {mapGetters} from 'vuex' // 导入getters
computed:{
        ...mapGetters(['showCount']) // 定义在computed中
    }
{{showCount}} // 直接使用

3.5、上方测试的源码:

地址: http://files.cnblogs.com/files/daihang2366/demo2.zip

下载后先npm install,然后就可以npm run dev

4、Vuex的案例

要求:
	① 动态加载任务列表数据
    ② 实现文本框与store数据的双向同步
    ③ 完成添加任务事项的操作
    ④ 完成删除任务事项的操作
    ⑤ 动态绑定复选框的选中状态
    ⑥ 修改任务事项的完成状态
    ⑦ 统计未完成的任务的条数
    ⑧ 清除已完成的任务事项
    ⑨ 实现任务列表数据的动态切换
代码下载地址:
	files.cnblogs.com/files/daihang2366/demo3.zip
	先npm install,然后npm run dev即可
原文地址:https://www.cnblogs.com/daihang2366/p/13446337.html