美文网首页
2019-06-04 Vuex的理解

2019-06-04 Vuex的理解

作者: 追夢的蚂蚁 | 来源:发表于2019-06-13 12:02 被阅读0次

对于简单的项目一些常用的vue方法足以解决,但是涉及到页面状态,权限判断等一些复杂的传值,vuex是必须的。

import Vue from 'vue'; 
import Vuex from 'vuex'; 
Vue.use(Vuex); 

const store = new Vuex.Store({ 
       state: { count: 0 },
       mutations: {
            increment (state) { 
                state.count++ 
            } 
      }
 })

以上就是一个最简单的Vuex,每一个Vuex应用就是一个store,在store中包含组件中的共享状态state和改变状态的方法(暂且称作方法)mutations。
vuex的核心是:state,getter,actions,mutations
1、state
state就是根据你项目的需求,自己定义的一个数据结构,里面可以放些通用的状态。

const state = {
  openId:"",
  storeId:"",
  storeName:''
}

例如上面所写的,这些状态可以在各个页面通过vuex访问。如下:
this.$store.state.openId = "111"

之前我一直通过上面的方式来修改state里面的状态值,行,肯定能用,但是好像官方并不建议我们这样使用,而是建议使用mutations来改变state里面的值,因为不通过mutations改变state,状态不会被同步。至于mutations下面会讲到。
2、getter
getter怎么理解呢?通俗的理解可以认为是getter里的函数就是vuex里的计算属性,类似于computed函数。

const store = new Vuex.Store({ 
       state: {
            count: 0 
       },
       getters: {  // getters
            countAdd: function (state) {
                 return state.count++
            }
       },
       mutations: {
            increment (state) { 
                state.count++ 
            } 
      }
 })

getter函数怎么用呢?如上vuex里定义了一个getter函数countAdd。我们可以在vue文件里的computed计算属性里引用,如下。

computed: {
     ...mapGetters{["countAdd"]} 
     show:function(){
           alert("这个是测试页面")
     }
}

这样我们可以直接在vue页面里取到countAdd的值{{countAdd}}即为1。可惜在我的项目里目前还没用到getter,可能写的少了,还没理解其中的要义。
3、mutation
官方定义:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:

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

你不能直接调用一个 mutation handler。这个选项更像是事件注册:“当触发一个类型为 increment 的 mutation 时,调用此函数。”要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法:
store.commit('increment')

也可以向store.commit传入第二参数,也就是mutation的payload:
mutaion: {
increment (state, n) {
state.count += n;
}
}
store.commit('increment', 10);

但是有时候,单个传入n可能并不能满足我们的业务需要,这时候我们可以选择传入一个payload对象:

mutation: { 
     increment (state, payload) { 
            state.totalPrice += payload.price + payload.count; 
     } 
} 
store.commit({
     type: 'increment', 
     price: 10, 
     count: 8
 })

不例外,mutations也有映射函数mapMutations,帮助我们简化代码,使用mapMutations辅助函数将组件中的methods映射为store.commit调用。

import { mapMutations } from 'vuex'
export default {
  methods: {
    ...mapMutations({
        add: 'increment' // 映射 this.add() 为 this.$store.commit('increment')
    })
  }
}

这样我们可以在vue文件里直接调用函数:this.add()而不用this.$store.commit('increment')这样写了,简化了很多。
需要注意:Mutations必须是同步函数。
如果我们需要异步操作,Mutations就不能满足我们需求了,这时候我们就需要Actions了。

4、action
Action 类似于 mutation,不同在于:
Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。
官方demo如下:

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

如果我在vue页面里想用action,我们可以分发 Action,Action 通过 store.dispatch 方法触发:

store.dispatch('increment')

Actions 支持同样的载荷方式和对象方式进行分发:
// 以载荷形式分发
store.dispatch('incrementAsync', {
  amount: 10
})

// 以对象形式分发
store.dispatch({
  type: 'incrementAsync',
  amount: 10
})

我们也可以运用其映射函数:mapActions

methods:{
     ...mapActions{[
           "add":"increment "//函数命名不相同
       //  "increment ":"increment "//函数命名相同
     ]}
}

调用:this.add()即可。相同时候调用:this.increment()

5、Modules
由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 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 的状态

总结起来:mutation 只管存,你给我(dispatch)我就存;action只管中间处理,处理完我就给你,你怎么存我不管(所有的改变state状态的都是mutation 来操作);Getter 我只管取,我不改的(类似计算属性)。

相关文章

  • 2019-06-04 Vuex的理解

    对于简单的项目一些常用的vue方法足以解决,但是涉及到页面状态,权限判断等一些复杂的传值,vuex是必须的。 以上...

  • vuex入门教程

    之前理解了eventbus事件总线,vuex就会好理解一点;1.npm install vuex --save ...

  • Vuex与session具体区别

    vuex 与 (sessionStorage 、localStorage)区别 首先,理解vuex的作用 每一个 ...

  • vuex理解

    一、区别: 1、传统或vue页面: 2、vuex页面 说明为了更明确地追踪到状态的变化,函数的执行不走普通的函数调...

  • vuex 理解

    6.1. vuex 理解 6.1.1. vuex 是什么 1)github 站点:https://github.c...

  • Vuex 理解

    我们可以用公司举个例子:公司有个仓库1.State(公司的仓库)2.Getter(只能取出物品,包装一下,不能改变...

  • vue - vuex 的安装与使用

    1 vuex的安装 2 vuex的使用 2.1 vuex的核心模块: State: 单一的静态树, 可以理解为定义...

  • 教你快速明白和搭建Vuex工作环境

    vuex工作工作原理(写给自己看的笔记以加深自己的理解) 一、Vuex工作原理 首先我们先来了解下Vuex: 1...

  • vuex2.x初始

    vuex自己的理解 vuex是公共状态管理库,我把他理解为公共操作库。我的思路是这样:多个组件有着同样的操作,我们...

  • 第三十九节:Vuex状态管理的认识与了解

    1. 理解Vuex 1.1 Vuex是什么 官网定义: Vuex是一个专门为Vue.js应用程序开发的状态管理模式...

网友评论

      本文标题:2019-06-04 Vuex的理解

      本文链接:https://www.haomeiwen.com/subject/irpdxctx.html