vuex之mutations使用示例

Posted cathy1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vuex之mutations使用示例相关的知识,希望对你有一定的参考价值。

在 vuex之state、mutations使用示例 已经简单用过mutations,这一篇更全面去了解一下这个概念。

vuex官方文档对mutations的描述

更改vuex的store中的状态的唯一方法是提交mutation。

你不能直接调用一个mutation handler。这个选项更像是事件注册。要唤醒一个mutation handler,你需要以相应的type调用store.commit方法

看之前文章中的示例代码,

src/components/Login.vue

      // 修改isLogin状态
      this.$store.commit(‘changeLogin‘, true)
      // 修改username状态
      this.$store.commit(‘changeUsername‘, this.username)
      // 修改password状态
      this.$store.commit(‘changePassword‘, this.password)

 

提交载荷

你可以向store.commit传入额外的参数,即mutation的载荷.

这里做一个用到mutation的小栗子

在store.js的state里添加一个count状态

src/store.js

    state: 
     // ...
      count: 0
    ,

mutations里面添加2个操作count的方法,一个用来增加,一个用来重置

src/store.js

    mutations: 
      // ...
      addCount(state, n) 
        state.count += n
      ,
      resetCount(state, data) 
        state.count = data;
      
    

 

回到Home.vue使用count

在计算属性的mapState里添加count

  computed: 
    // ...
    ...mapState(
      isLogin: state => state.isLogin,
      username: state => state.username,
      password: state => state.password,
      count: state => state.count
    ),
    // ...
  ,

在methods里添加两个方法唤醒mutations

  methods: 
    add () 
      this.$store.commit(‘addCount‘, 1)
    ,
    reset () 
      this.$store.commit(‘resetCount‘, 0)
    
  

最后在template里添加count相关内容

    <hr>
    <div>
      <h3>mutation载荷</h3>
      <span>count</span> | <button @click="add">+1</button> | <button @click="reset">重置</button>
    </div>

两个按钮分别调用add和reset事件

运行测试一下

技术图片

 

 

使用对象形式的载荷也能实现这种效果

很多时候,尤其是当数据比较复杂,使用对象形式的载荷会更好。

修改store.js mutations addCount和resetCount事件

src/store.js

      addCount(state, payload) 
        state.count += payload.n
      ,
      resetCount(state, payload) 
        state.count = payload.data;
      

修改Home.vue methods add和reset方法

src/components/Home.vue

    add () 
      this.$store.commit(‘addCount‘, 
        n: 1
      )
    ,
    reset () 
      this.$store.commit(‘resetCount‘, 
        data: 0
      )
    

效果一样。多学会一种写法总是好的。

 

对象风格的mutation

提交mutation的另一种方式是直接使用包含type属性的对象

结合本例,修改Home.vue

  methods: 
    add () 
      this.$store.commit(
        type: ‘addCount‘,
        n: 1
      )
    ,
    reset () 
      this.$store.commit(
        type: ‘resetCount‘,
        data: 0
      )
    
  

效果一样。

 

Mutation需遵守Vue的相应规则

以下摘自vuex官网

既然Vuex的store中的状态是响应式的,那么当我们变更状态时,监视状态的Vue组件也会自动更新。这也意味着Vuex中的mutation页需要与使用Vue一样遵守一些注意事项

  1. 最好提前在你的store中初始化好所需属性
  2. 当需要在对象上添加新属性时,你应该
    • 使用Vue.set(obj, ‘newProp‘, 123),或者
    • 以新对象替换老对象。例如,

      state.obj = ...state.obj, newProp: 123

 

 

(未完)

以上是关于vuex之mutations使用示例的主要内容,如果未能解决你的问题,请参考以下文章

14vuex2.0 之 mutation 和 action

浅谈vue使用vuex

vuex使用示例

[Vuex系列] - Actions的理解之我见

vue之vuex

vuex2.0 基本使用 --- mutation 和 action