vuex-connectはVuexでReduxのconnect
のようにstoreとコンポーネントを繋ぐやつ。
コンポーネントとstoreを繋ぐ部分を切り離せて宣言的に書けて気に入ってる。mapState
とかVuexが用意してるやつ使わなくてもstoreの値を取り出せて注入できる。
namespacedなmoduleを繋ぐとき
たとえば次のようなstoreがあったとき
const store = new Vuex.Store({ state: { foo: 'foo', }, modules: { moduleName: { namespaced: true, state: { bar: 'bar', }, mutations: { barMutation(state, payload) { state.bar = payload }, }, actions: { barAction({ commit }, payload) { commit('barMutation', payload) }, }, getters: { barbar: state => state.bar + state.bar, }, }, }, })
vuex-connect
ではこう、関数で書いて階層たどってreturn。
import { connect } from 'vuex-connect' import MyComponent from './MyComponent' export default connect({ stateToProps: { foo: 'foo', bar: state => state.moduleName.bar, }, })(MyComponent)
mapXxxxxぽく書きたいからヘルパー作った
数が少なければいいんだけど多くなってくると毎回namespaceの階層まで記述するのめんどい、のでヘルパー関数作った。
import { connect } from 'vuex-connect' import { stateToProps } from 'vuex-connect-namespace-helper' import MyComponent from './MyComponent' export default connect({ stateToProps: { foo: 'foo', ...stateToProps('moduleName', { bar: 'bar', }), }, })(MyComponent)
mapXxxxx
とかと同じように1つ目の引数にnamespaceを指定、そのあとそのmoduleのlocal stateを指定する。
ヘルパーがやってるのは指定されたnamespaceとstate名をいい感じにマッピングして、moduleのstateを返す関数に変換してるだけ。
API
内部的にやってることはほぼ同じだけど一応わけてある。
helperFunction(namespace, options) -> Object
stateToProps
gettersToProps
mutationsToEvents
mutationsToProps
actionsToEvents
actionsToProps
vuex-connectおすすめ
VuexのmapXxxxx
を無計画に使ってるとつらみになりがちで
- storeと密結合になるから
mapXxxxx
をpresentationなコンポーネントには使いたくない - コンポーネントごとに小さなcontainerを都度作るのつらい
- pageレベルのcontainerにやらせると
mapXxxxx
が増えまくってつらい - コンポーネントの
$emit
をバケツリレーしてcontainerでmapMutations
とかした処理呼ぶのつらい
とかとか。
この辺りをスッと綺麗に書けるようになるので、Vuex使う人は一度試してみるのおすすめです。
starください。