What is Vuex?

  vuex是一个专为Vue.js应用程序开发的状态管理模式。他采用集中式储存管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变换

  VUEX并不限制你的代码结构,但是,他规定了一些需要遵守的规则:

    1.应用层级的状态应该集中到单个的store对象中

    2.提交 mutation是更改状态的唯一方法,并且这个过程是同步的

    3.异步逻辑都应该封装到action里面

注意!!!!   action和mutation都可以提交方法,但是两个之间最大的区别就是action是异步的!!!切记

  使用之前先安装

    1.在vue-cli中安装vuex     npm install vuex --save

    2. 在src文件目录下新建一个名字为store的文件夹,为方便引入并在store文件夹下新建一个index.js 内容如下

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store(); export default store;

    3.接下来在main.js里面引入store 然后再全局注入一下,这样一来就可以在每个组件中使用this.$store了;

import store from './store'//引入store

new Vue({
el: '#app',
router,
store,//使用store
template: '<App/>',
components: { App }
})

  讲完安装    接下来  进入正题

  VUEX集中管理数据:

    既然状态是组件需要绑定的数据,那为什么不直接写在组件的data方法里呢?当这个状态只在一个组件中使用时,当然直接在data中定义就可以。但是当多个组件都依赖同一个状态或者都会修改同一个状态时,处理起来就比较麻烦。

    因为在vue中,组件通过prop注册自定义属性。父组件通过给子组件的自定义属性赋值将数据传给子组件。另外子组件不能直接修改父组件的数据,它可以emit一个事件,将变更后的数据通过事件参数传给父组件,父组件捕获到事件后更新数据。 这样的话对下面这些场景处理起来就很麻烦:

  1. 两个兄弟关系(或者毫无关系)的组件都依赖于同一个状态,A组件修改状态后,B组件也要更新;此时A组件无法把修改后的状态传给B。
  2. 祖先向后代组件传递数据; 需要通过prop一层层的的传递,非常繁琐

   所以:  集中管理   :::vuex把组件的共享状态抽取出来,以一个全局单例模式进行管理,在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为。

        状态变化可以预测:::不允许组件直接修改状态,而是在vuex内部,通过mutation来修改状态,这样每次状态的变更都可以追踪

  STATE   state   单一状态树   每个应用只有一个store,state里面存放状态

    Vuex 使用单一状态树——用一个对象就包含了全部的应用层级状态。至此它便作为一个“唯一数据源 (SSOT)”而存在。这也意味着,每个应用将仅仅包含一个 store 实例。单一状态树能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照

   这个state在一定程度上可以看做是组建中的data用于包存所有组件的公共数据

const state = {
tableHeader :[],//表格头部数据
tableData:[],//表格内容数据
}

  mapstate 辅助函数   一个组件想要获取多种状态时,为每一个状态都声明计算属性有些重复,所以使用mapstate帮助我么生成计算属性

//使用mapstate
computed: {
  ...mapState([
// 表格头部数据
"tableHeader",
// 表格内容数据
"tableData"
  ]),
},

 GETTERS   getters     所有组件的computed属性,getters的返回值会根据他的依赖被缓存起来,且当他的依赖值发生改变之后会被重新计算

 MUTATIONS     mutations   store中的methods ,mutations对象中保存着更改数据的回调函数type,第一个参数是state,第二个参数是载荷payload,也就是自定义的参数,调用mutaions中回调函数, 只能使用store.commit(type, payload)

 const mutations = {
//获取表头数据
[type.GET_HEADER_DATA] (state, data){
state.tableHeader = data;
},
// 获取表体数据
[type.GET_TABLE_DATA] (state, data){
state.tableData = data;
},
}

  使用常量代替Mutation 事件类型,但是一定要在 store.js中引用

//mutations.js
  export const GET_TABLE_DATA = "GET_TABLE_DATA" //获取列表数据
  export const GET_HEADER_DATA = "GET_HEADER_DATA" //获取列表头部数据
//store.js
  import * as type from '../store/mutions-types'

  在组件中提交mutation     可以在组件中使用this.$store.commit('xxx')提交mutation ,或者使用mapMutation辅助函数将组件中的methods映射为store.commit调用   需要在根节点注入store

import { mapMutations } from 'vuex'
export default {
// ...
methods: {
...mapMutations([
'GET_TABLE_DATA', // 将 `this.increment()` 映射为 `this.$store.commit('increment')
  ]}
}
}

 ACTION     action类似于mutation  不同在于action提交的是mutation,而不是直接更改状态,action可以包括异步操作

const actions = {
// 获取表格头部数据
getTableHeader:function({commit, state}){
return api.getTableHeader().then(res =>{
commit(type.GET_HEADER_DATA,res.data.Model.headList)
})
.catch((error)=>{
alert('error')
})
},
// 获取表格体
getTableData:function({commit,state}){
return api.getTableData().then(res=>{
// console.log(res)
commit(type.GET_TABLE_DATA,res.data.Model.list)
})
},
}

  分发action   通过store.dispatch方法触发  但是也可以使用mapAction辅助函数将组件的method映射为 store.dispatch 调用(需要在根节点注入store)

  分发同样支持载荷方式和对象方式进行分发,store.dispatch可以处理被触发的 action 的处理函数返回的 Promise,并且 store.dispatch 仍旧返回 Promise,一个 store.dispatch 在不同模块中可以触发多个 action 函数。在这种情况下,只有当所有触发函数完成后,返回的 Promise 才会执行。

methods:{,
getTableHeader(){
this.$store.dispatch("users/getTableHeader").then(()=>{
this.tableHeader=this.$store.state.users.tableHeader
})
}
}
----------------------------或者----------------------------------
methods: {
...mapActions([
// 表头数据
"getTableHeader",
]),
}

  MODULES  modules 将store分成模块(modules)每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割

  

VUEX 总结的更多相关文章

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

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

  2. vuex复习方案

    这次复习vuex,发现官方vuex2.0的文档写得太简略了,有些看不懂了.然后看了看1.0的文档,感觉很不错.那以后需要复习的话,还是先看1.0的文档吧.

  3. vuex 初体验

    vuex是vue的状态管理工具,vue进阶从es6和npm开始,es6推荐阮一峰大神的教程. vuex学习从官方文档和一个记忆小游戏开始.本着兴趣为先的原则,我先去试玩了一把-->. Vuex ...

  4. vuex(1.0版本写法)

    Vuex 是一个专门为 Vue.js 应用所设计的集中式状态管理架构. 官方文档:http://vuex.vuejs.org/zh-cn/  2.0和1.0都能在此找到 每一个 Vuex 应用的核心就 ...

  5. 关于Vue vuex vux 文档

    01. vue 链接 http://vuejs.org.cn/guide/ 02. vuex  ----->>状态管理模块儿<<------- https://vuex.vue ...

  6. vuex

    英文:(Introduction)中文:https://github.com/vuejs/vuex/issues/176(贡献者努力中)

  7. Vue 2.0 + Vue Router + Vuex

    用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node.js(包括了 npm).vue-cli 项目结构如图所示: ass ...

  8. Vue2.X的状态管理vuex记录

    记住上述的顺序情况:想要改变state,只能通过Mutation,虽然action可以直接改变state,这样会使每个状态可以方便的跟踪和记录(用Devtools跟踪) vue Method   -- ...

  9. 在vue1.0遇到vuex和v-model的坑

    事情是这样的,在开发项目的过程中我使用了vuex并且在store中定义了一个保存用户信息的对象 userInfo : { 'nickName' : '', // 昵称 'password' :'', ...

  10. vuex 笔记

    Vuex 笔记 一个简单的状态管理 单一数据源: const sourceOfTruth = {} const vmA = new Vue({ data: sourceOfTruth }) const ...

随机推荐

  1. SE955 激光扫描头设置 通过SSI串口进行设置

    扫描头是能够进行配置的,使其支持与禁用某些条码类型,设置有两种方式,一种是扫一下相应的设置条码,还有一种是通过SSI(simple serial interface)来设置,以下就讲一下SSI的设置方 ...

  2. 初步了解Shuttle ESB

    ESB:EnterpriseService Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物.从面向服务体系架构发展而来. ESB採用了"总线"这种模 ...

  3. 我的红外arduino链接,!!!!

    点击打开链接http://blog.csdn.net/g1342522389/article/details/46272473 一定要赞,小编非常辛苦.

  4. 热修复JSPatch之实战教程

      接上篇<热修复JSPatch之接口设计>,在这篇文章主要给大家讲述一下怎样高速具备热修复能力,当然了假设有人有志于把JSPatch系统的学习,甚至用JSPatch进行开发的.就没有必要 ...

  5. Problem G 宝石合成 (内蒙古14年省赛)

    1117: Problem G 宝石合成 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 4 [提交][状态][讨论版] 题目描写叙述 故事人物:豆豆强 走上致富之路的豆豆 ...

  6. graphviz.js的图形及属性简单用法

    digraph A { graph[bgcolor="cadetblue" label="图的标题" fontsize=48 fontcolor="g ...

  7. bzoj2958: 序列染色(DP)

    2958: 序列染色 题目:传送门 题解: 大难题啊(还是我太菜了) %一发大佬QTT 代码: #include<cstdio> #include<cstring> #incl ...

  8. 【BZOJ 2982】 combination

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2982 [算法] lucas定理 [代码] #include<bits/stdc ...

  9. php简单测试slim框架的功能

    php简单测试slim框架的功能 监听主路径/ $app->get( '/', function () { $template = <<<EOT<!DOCTYPE htm ...

  10. 记录,javascript中对象的属性名是字符串,却可以不用引号

    问题描述:今日看书,里面介绍js的对象的属性名是包括空字符串在内的所以字符串 问题来了,我们平时定义的对象如下,是没有引号""or’'的 var someone  = {    f ...