LoginSignup
5
5

More than 5 years have passed since last update.

VuexFireのDXが悪いのでVuexBlazeというライブラリを作ってみた

Posted at

VuexBlaze

VuexFireのDXのどこが悪いのか?

(1)Vuexのプラグイン機能を使っていない

VuexFireを使うにはルートのStoreに以下のようにMutationを追加する必要があります。

export default new Vuex.Store({
  mutations: {
    ...firebaseMutations
  }
})

これと同等のことは、Vuexのプラグイン機能を使えば可能です。
VuexFireのドキュメントを見るとちゃんと「ルートのStoreだけにfirebaseMutationsを設定せよ」と書いてあるのですが、コードだけを見ると、FirestoreをバインドさせたいすべてのStoreに設定しなければいけないのかな?と思ってしまいます。
実際モジュールのStoreのみにfirebaseMutationsを設定してハマっている人を見ました。
このように不要にライブラリの内部構造をさらけ出すようなコードを書かせるのはあまりよくないと思います。

(2)バインドのためのコードが冗長

ただ単純にtodosコレクションをnameでソートしてtodosステートにバインドさせるだけなのに、アクションにこんな冗長なコードを書く必要があります。

  actions: {
    bindTodos: firebaseAction(({ bindFirebaseRef }) => {
      bindFirebaseRef('todos', todosRef.orderBy('name'))
  })

VuexBlazeでは?

VuexBlazeのセットアップを含めたコードは以下のようになります。
※ firebaseのセットアップについては省略しています。

import { vuexblazePlugin, collection } from 'vuexblaze'
// .... firebaseのセットアップ
const firestore = firebase.firestore()

export default new Vuex.Store({
  plugins: [vuexblazePlugin.config({ firestore })],
  state: {
    todos: []
  },
    actions: {
    ...collection('todos').orderBy('name').bind()
  }
})


// Vueインスタンス側
  mounted() {
    this.$store.dispatch('bindTodos')
  }

vuexblazePluginにfirestoreオブジェクトを渡していますが、Nuxtを使っていてかつNuxt-Fireでfirebaseをセットアップしている場合は、単に以下のようにすればOKです。

export const plugins = [vuexblazePlugin]

もちろんorderBy以外のクエリにも対応しています。

  ...collection('todos')
    .orderBy('name')
    .where('done', '==', true)
    .limit(10)
    .bind()

todosステート以外にバインドさせたい場合は、bindToを使います

  ...collection('todos')
    .where('isUrgent', '==', true)
    .bindTo('urgentTodos')


  // Vueインスタンス側
  this.$store.dispatch('bindUrgentTodos')

クエリを動的にしたい場合はfilterを使います。

    ...collection('todos')
      .filter(({ query, state, rootState, getters, rootGetters }) => {
        query
          .where('done', '==', state.search.done)
          .orderBy('name')
          .limit(state.search.limit)
      })
      .bindTo('searchedTodos')

  // Vueインスタンス側で再読込
  this.$store.dispatch('reloadSearchedTodos')

VuexBlazeの詳細

とりあえずは、githubのREADMEや、Vue ExampleNuxt Example を見てください。

バグは…あると思います。今の所ホットリロードしたときに変な動きをすることがあるのを確認しています。

質問など

質問やバグ報告など大歓迎です。使い方が分からないとか、そもそもVue、Vuexが分からないとかそんなものでも結構なのでどしどしください。

githubのIssueは英語で運用したいと思っているので、英語が苦手な方はTwitterで質問頂けるとうれしいです。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5