DAY8 资料室--Vuex的那些方法

前言

昨天我们在 Vuex 入门研究了 StateMutation 的功能与使用方法
只是想提醒各位捧由,昨天的范例并不完全是正确用法哦! 
https://ithelp.ithome.com.tw/upload/images/20210908/20136833b8WoWobLkH.png
由这张 Vuex 官方提供的图片,我们可以发现,Vue 的元件应该透过 Action 触发 Mutation 进而修改 State 的资料,而不是直接使用 commit()
那到底要怎麽做呢?今天就让我们来说说还没提到的 Getter & Action 吧!

Action

今天若是使用 Vue,方法应该写在 methods,而修改资料也是在 methods,可是在 Vuex 却将两个功能拆开了,拆成如何呢?

Vuex 的世界中,只要修改资料就必须透过 Mutation 中的方法,这是不变的真理。
ActionMutation 有87%相似,不同在於:

  • Action 无法直接变更资料状态,而是需要透过 Mutation
  • Action 可以包含非同步操作。

最简单的分别方法就是,Action 非同步,Mutation 同步。

来个简单的 Action 范例吧!

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

从范例中可以看到,我们将修改 state 的方法写在 mutations
接着透或 actions 来使用 mutations 的方法。

看到这个范例,我们应该满疑惑,为什麽在 actions 中是使用 context.commit,而不是store.commit呢?
根据官方文件所说,context 是一个与 store 实例具有相同方法和属性的对象。
等後续介绍到 Modules 时,我们就知道 context 对象为什麽不是 store 实例本身了。

Action 要如何触发呢?

很简单,Action 通过 store.dispatch 方法触发:

store.dispatch('increment')

Getter

GetterVuex 中的计算属性,跟我们平常在 Vue 中使用的 computed 很像,需要 return 回传值。
Getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。

我们可以看到这个简单的 Getter 范例:
资料中有一个 todos 清单,需要过滤已完成的项目

const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})

Getter 接受 state 作为其第一个参数,经过 filter 计算处理後回传值。
在这个范例中便在 Getter 使用 filter 过滤出 todos 已经做完的项目,并回传。

我们也可以很简单的在元件中以 this.$store.getters 使用他

computed: {
  doneTodosCount () {
    return this.$store.getters.doneTodosCount
  }
}

结语

所以今天我们对於 Getter & Action 也有基础的认识了,可喜可贺!
明天我们来简单的创造一个完整的 store 范例,尝试实际运作Vue ComponentsActionsMutationsState 这四个状态循环吧!


<<:  AE极光制作1-Day7

>>:  33岁转职者的前端笔记-DAY 8 前端网页基础小知识

【PHP Telegram Bot】Day10 - Long Polling、持续接收与发送讯息

昨天有讲到一个叫做 getUpdates 的方法,但我们没有填任何参数,今天要利用 offset 与...

Day2 资料储存 - block storage基础

Block storage是最基本的储存系统,所以让我们从这里开始 我们都知道数据是以1和0储存在某...

那些被忽略但很好用的 Web API / Console

虽然一招 console.log 就能打遍天下无敌手,但你其实有更好的选择。 我知道我知道,这次的...

离职倒数10天:做产品才知道政治敏感不只存在两岸之间

我第一次在微软 release 产品时,学到一件很意外的事是:这世界上政治敏感区域原来不只有台湾跟中...

Day 07 「Tell. Don't Ask.」 测试与依赖:测行为

2021 IT 铁人 Day 07 测试与依赖:测行为 今天来聊「不回传值的命令」的使用场景与测试。...