浅谈 Vuex

什么是Vuex?

     首先VuexVue '全家桶'的成员之一,也是一个专为Vue.js应用程序开发的状态管理模式。
    官方说法: 它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

为什么要用Vuex?

    因为组件之间是相互独立的,组件之间想要通信。其中有通过props选项通信,但这只限于父子组件通信,远远不能满足组件之间通信的需求,特别是做中大型的项目。所以就把组件之间需要共享的数据给单独'弄'出来。
    通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态间的独立性,我们的代码将会变得更结构化且易维护。

什么情况应该用Vuex?

    Vuex可以帮助我们管理共享状态,并附带了更多的概念和框架,这需要对短期和长期效益进行权衡。
    如果不是开发中大型单页应用,使用Vuex可能是繁琐冗余的,不建议使用。

Vuex的特性

    每一个 Vuex应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:

  1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

  2. 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

Vuex 的核心概念

     state:      把组件需要通信的数据定义在storestate中。容器的状态(响应式数据,可以触发视图更新的数据)。
举例:

 //如果在模块化构建系统中,请确保在开头调用了 Vue.use(Vuex)
    //视图状态仓库中(超大的ViewModel,把需要跨组件通信的数据都放到这里)
    const store = new Vuex.Store({
      //容器状态(响应式数据,可以触发视图更新的数据)
      state: {
        count: 0
      },)
//在组件中通过计算属性来获取 store.state中的成员
 Vue.component('component-b', {
    template: `
     <div>
      componentB 
      <h1>{{count }}</h1>
     </div>
    `,
    created () {
    },
    data () {
      return {
      }
    },
    computed: {  //使用computed 来监视count的变化,当count的值一变化,就会调用computed的事件
     count () {
      return store.state.count
     }
    }
  })

     getter:      就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
举例:

const store = new Vuex.Store({
  state: {
   todos: [
    { name: '小张',compoleted: true},
    { name: '小李',compoleted: false }
   ]
  },
getters: {  
  compoletedTodos: state => {   //getter 接受state作为其第一个参数
    return state.todos.filter (todo => toto.compoleted)
  },
comTodosLength: ( state, getters) => { //getter 也可以接受其他的getter作为第二个参数
    return getters.compoletedTodos.length
}
}
})
通过属性访问
store.getters.compoletedTodos

     mutation:     它是更改Vuexstore中的状态的唯一方法,非常类似于事件,每个mutation
都有一个字符串的事件类型type和一个回调函数handle
举例:

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  }
})

在组件中通过store.commit方法来触发mutation
store.commit('increment ')

通过store.commit传入额外的参数,即mutation的载荷(payload):
举例:

方式一:
mutations: {
  increment (state,n) {
     state.count += n
  }
}
store.commit('increment',10)
方式二: 载荷应该是一个对象
mutations: {
  increment (state,payload) {
   state.count += payload.amount
  }
}
store.commit('increment',{
  amount: 10
})
方式三:对象风格的提交方式,但是定义mutation函数保持不变
store.commit({
  type:'increment',
  amunt: 10
})

     action:      action 类似于 mutation,但是不同的是:

  • action 提交的是mutation,而不是直接变更状态。
  • action可以包含任何异步操作
    举例:
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
  //action 函数接受一个与store实例具有相同方法和属性的context对象
    increment (context) {
      context.commit('increment')
    }
  }
})

action 通过 store.dispatch 触发:

  store.dispatch('increment')

actionmutation最大的不同是:mutation必须同步执行,而action就不受约束,可以在action内部执行异步操作:

actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}

action支持同样的载荷方式和对象方式进行分发。
     module:     当项目非常大的时候,应用的所有状态会集中到一个比较大的对象,store对象就有可能变得相当臃肿。
    为了解决以上问题,我们可以将store分割成模块,同时每个模块拥有自己的state,mutation,action,getter,还能嵌套子模块,从上至下进行同样方式的分割。

  const moduleA = {
    state: { ... },
    mutations: { ... },
    actions: { ... },
    getters: { ... }
  }
 
 const moduleB = {
   state: { ... },
   mutations: { ... },
   actions: { ... }
 }

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

辅助函数

  • mapState辅助函数
  • mapGetters 辅助函数
  • mapMutations 辅助函数
  • mapActions 辅助函数

     其实关于Vuex还有很多知识点,尤大神已经写的很全面了,大家感兴趣的可以参考Vuex(https://vuex.vuejs.org/zh/)的官网。

     我觉得学习最好的办法就是跟着官网敲demo,这样才能学以致用,更好的理解新的技术点。

     好了,不说了,我要去敲代码了。如果我写的对你有些帮助,不要忘了给我点个赞或加个关注哟。ღ( ´・ᴗ・` )比心

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 一,什么是vuex 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应...
    是归人不是过客阅读 816评论 0 5
  • 什么是vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组...
    天天zzl阅读 407评论 1 8
  • 1.安装Vuex npm install vuex --save (简略版: npm i vuex -S) 2...
    G_弦上的咏叹调阅读 341评论 0 7
  • 本文基本上是官方的盗版,用通俗易懂的文字讲解Vuex。学习一个新技术,必须要清楚两个W,"What 和Why"。当...
    O糊涂范O阅读 2,824评论 1 3
  • 通过购物车的一个案列,把vuex学习了一篇。 vuex概念浅谈 Vuex 是一个专为 Vue.js 应用程序开发的...
    蓝茫阅读 453评论 0 8