前置き
みなさんはVuexのactions
でcontext
部分を
どのように書いていますか❓
mutations
や他のactions
を
呼び出さない場合の話です☝️💡
呼び出さない場合というのは
Firebaseなどに送信さえできればよい、
それだけで完結するものですね💡
また、第二引数以降に
複数の値を渡したい場合は
どうしていますか?
今回はその
第一引数context
と
第二引数に焦点を当てました👀
第一引数context
今まではcommit
やdispatch
を呼び出さない場合
こんな感じで書いていました✍️
submit({ context }, payload)
実際、公式のサンプルコードでは(context)
となっています。
アクション
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { increment (context) { context.commit('increment') } } }) |
ただ、特に使うものがないのに
わざわざcontext
を書く必要がないな〜
ということで最近はこうしてます
submit(_, payload)
私は上記の公式コードを見て
こう思っていました🤔💭
絶対にcontext
と
表記する必要があるものなんだ
しかしこちらを見てみると、
呼び出さない場合の指定は
特になさそう…
actions
1 2 3 4 5 6 7 8 |
{ state, // `store.state` と同じか、モジュール内にあればローカルステート rootState, // `store.state` と同じ。ただしモジュール内に限る commit, // `store.commit` と同じ dispatch, // `store.dispatch` と同じ getters, // `store.getters` と同じか、モジュール内にあればローカルゲッター rootGetters // `store.getters` と同じ。ただしモジュール内に限る } |
ということで、
引数なので自由に名前をつけられる❗️
ということが分かりました🙌✨
わざわざ
「呼び出さない場合は自由です」
と明記されてはいませんが、
引数なんでね…
というわけです🌟
これによって視認性もアップ✨👀actions
をパッとみただけで
送信するactions
はこれだな
とすぐ分かります。
1 2 3 4 5 6 7 8 |
export const actions = { async submit(_, payload) { // 省略 }, async getData({ commit }) { // 省略 }, } |
また、
仮にgetData(_)
になっていたら
命名的に普通は取得してstate
の上書きするのにcommit
ないよ?💥
などの間違いにも気づきやすくなります🙌
第二引数
こちらも公式を確認すると…
そして、第 2 引数の
actionspayload
があれば、それを受け取ります。
引数は第二までしか渡せないということですね💡
(厳密に言うと第三引数も取れるのですが、
そこには別のデータが入っていたりします)
そしてこちらも命名は自由。
mutationsでも全く同じです。
では複数渡したい場合はどうするのか、
それはObject
にして
1つのまとまりにすればOK⭕️{ プロパティ: 値, プロパティ: 値 }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<template> <form @submit.prevent> <input v-model="email" /> <input v-model="name" /> </form> </template> <script> export default { data() { return { email: '', name: '', } }, methods: { submit(email, password) { this.$store.dispatch('submit', { email: this.email, name: this.name, }) }, }, } </script> |
受け取る時はpayload
でObject
の
1つのまとまりを受け取ります🎁submit(_, payload)
公式のままpayload
ですが、
なんでもOKです⭕️
1 2 3 4 5 6 7 8 9 10 11 12 |
export const actions = { async submit(_, payload) { try { await this.$fire.database.ref().push().set({ text: payload.email, name: payload.name }) } catch (error) { console.log(error) } }, } |
もしくはObject
で受け取ってもOK⭕️
1 2 3 4 5 6 7 8 9 10 11 12 |
export const actions = { async submit(_, { text, name }) { try { await this.$fire.database.ref().push().set({ task, uid, }) } catch (error) { console.log(error) } }, } |
まとめ
引数をシンプルにすることで
見やすくなりました✨👀
第一引数では
自分の思い込みではないかと
疑うことって大事だな〜
と感じました。
ちなみに_
の書き方は
TSを導入している人が
結構使うらしいです。
TSの記事も書きたいなぁ…
第二引数は個人的にpayload
が好きだったのですが、
値を書く時に、
いちいち渡しているものを
確認しないといけないので、Object
の方に変えていこうかと思ってます🍀