Vuexのプラグイン
4673 ワード
Vuexが守るべきルール
1.アプリケーションレベルの状態は、単一storeオブジェクトに集中すべきである.mutationのコミットはステータスを変更する唯一の方法であり、このプロセスは同期されます.3.非同期ロジックはactionにカプセル化する必要があります.
プロジェクト構造
storeファイルが大きすぎる場合は、action、mutation、getterを個別のファイルに分割するだけです.
├── index.html ├── main.js├——api|└——...#抽出API要求├——components|├——App.vue │ └── … └── store ├── index.js#モジュールを組み立ててstoreの場所をエクスポートします.js#ルートレベルのaction├-mutations.js#ルートレベルのmutation└-modules├-cart.js#ショッピングカートモジュールjs#製品モジュール
Vuexプラグイン
Vuexプラグインは、storeを一意のパラメータとして受け入れる関数です.
1.プラグインの定義:
プラグインの使用storeを定義します.subscribe
const myPlugin=store => {
store.subscribe((mutation,state) => {
//mutation { type,payload }
})
}
2.プラグインの使用
const store=new Vuex.Store({
plugins:[myPlugin]
})
プラグイン内でのmutationのコミット
mutationをコミットすることで、プラグインはstoreにデータソースを同期するために使用できます.
export default function createWebsocketPlugin(socket){
return store => {
socket.on('data',data => {
store.commit('receiveData',data)
})
store.subscribe(mutation => {
if(mutation.type==='UPDATE_DATA'){
socket.emit('update',mutation.payload)
}
})
}
}
const plugin=createWebsocketPlugin(socket){
const store=new Vuex.Store({
state,
mutation,
plugins:[plugin]
})
}
プラグインは、前後のステータスを比較するためにステータスのスナップショットを取得する必要がある場合があります.この場合、ステータスを深くコピーする必要があります.
const myPluginWithSnapshot=store => {
let prevState=_.cloneDeep(store.state)
store.subscribe((mutation,state) => {
let nextState=_.cloneDeep(state)
// preState nextState
// , mutation
prevState=nextState
})
}
スナップショットを生成するプラグインは、開発段階でのみ使用し、webpackまたはBrowserifyを使用して構築ツールに処理してもらう必要があります.
const store=new Vuex.Store({
plugins:process.env.NODE_ENV !== 'production'?[myPluginWithSnapshot]:[]
})
上のプラグインはデフォルトで有効になります.リリース段階ではwebpackのDefinePluginまたはBrowserifyのenvifyを使用してプロセスを実行します.env.NODE_ENV !== ‘production’はfalse
ロガープラグイン内蔵
vue-devtoolsを使用している場合は、このプラグインVuexを使用しないで、一般的なデバッグのためにログプラグインを持参します.
import createLogger from 'vuex/dist/logger'
const store=new Vuex.Store({
plugins:[createLogger()]
})
createLogger関数のいくつかの構成項目:
const logger=createLogger({
collapsed:false, // mutation
filter(mutation,stateBefore,stateAfter){
// mutation , true
// ,mutation { type,payload }
return mutation.type!=="aBlacklistedMutation"
},
transformer(state){
//
// , d
return state.subTree
},
mutationTransformer(mutation){
//mutation { type,payload }
return mutation.type
},
logger: console // console , console
})
ログプラグインは、直接使用することもできます.