Vue.js 2.0のVuex 2.0について、更新する知識ベースが必要です.
17195 ワード
構造の適用
実際、Vuexはコード構造をどのように組織するかに制限はありません.逆に、一連の高度な原則を強制的に規定しています.アプリケーションレベルのステータスセットはstoreに格納されます. ステータスを変更する唯一の方法はmutationsをコミットすることです.これは同期トランザクションです. 非同期論理はactionにカプセル化されるべきである.
これらのルールに従う限り、どのようにプロジェクトの構造を構築するかはあなた次第です.storeファイルが非常に大きい場合は、action、mutation、getterの複数のファイルに分割するだけでいいです.
少し複雑なアプリケーションでは、モジュールを使用する必要があるかもしれません.以下は、シンプルなプロジェクトアーキテクチャです.
詳細については、カートのインスタンスを参照してください.
Modules
単一のステータスツリーが使用されているため、適用されるすべてのステータスは大きなオブジェクトに含まれます.しかし,我々の応用規模が増加するにつれて,このStoreは非常に肥大化している.
この問題を解決するために、Vuexはstoreをmodule(モジュール)に分けることができます.各モジュールには、それぞれのステータス、mutation、action、getter、さらにはネストされたモジュールが含まれています.以下のように組織されています.
モジュールローカルステータス
モジュールのmutationsメソッドとgettersメソッドの最初の受信パラメータは、モジュールのローカル状態です.
同様に、モジュールのactionsでは、
モジュールのgetters内では,ルート状態も3番目のパラメータとして露出する.
ネーミングスペース
モジュール内のactions、mutations、gettersは依然としてグローバルネーミングスペースに登録されていることに注意してください.これにより、複数のモジュールが同じmutation/actionタイプに応答します.モジュール名に接頭辞または接尾辞を追加してネーミングスペースを設定し、ネーミング競合を回避できます.もしあなたのVuexモジュールが多重化可能で、実行環境も未知であれば、あなたはそうすべきです.
ダイナミックモジュールの登録
モジュールの
他のVueプラグインは、アプリケーションのstoreにモジュールを追加し、動的に登録することでVuexのステータス管理機能を使用することができます.例えば、
動的に登録されたモジュールを
Plugins
Vuexのstoreは
次のように使用します.
プラグイン内でのMutationsのコミット
プラグインはステータスを直接変更することはできません.これはあなたのコンポーネントのように、mutationsによって変更をトリガーするしかありません.
mutationsをコミットすることで、プラグインはstoreにデータソースを同期するために使用できます.たとえば、websocketデータソースをstoreに同期するために(これは使用例を説明するためのものであり、実際には
ステータススナップショットの生成
プラグインは、ステータスの[スナップショット](Snapshot)とステータスの変化の前後の変化を取得したい場合があります.これらの機能を実現するには、ステータスオブジェクトを深くコピーする必要があります.
**ステータススナップショットを生成するプラグインは、開発段階でのみ使用できます.WebpackまたはBrowserifyを使用して、構築ツールで処理してください.
プラグインはデフォルトで使用されます.製品をリリースするには、WebpackのDefinePluginまたはBrowserifyのenvifyを使用して
ロガープラグイン内蔵
vue-devtoolsを使用している場合は、必要ないかもしれません.
Vuexには、一般的なデバッグ用のログプラグインが用意されています.
ログ・プラグインは、
loggerプラグインはステータススナップショットを生成するので、開発環境でのみ使用できます.
厳格モード
厳格モードを有効にするには、Vuex storeを作成するときに
厳格モードでは,Vuex状態がmutationメソッドの外で修正されるとエラーが投げ出される.これにより、すべてのステータス変更がデバッグツールによって明確に追跡されることが保証されます.
開発フェーズvs.リリースフェーズリリースフェーズで厳格なモードをオンにしないでください.厳格なモードでは、ステータスツリーの深さモニタリングを行い、不適切な変更を検出します.パフォーマンス損失を回避するために、リリースフェーズでオフにすることを保証します.
プラグインの処理と同様に、コンストラクションツールで処理できます.
関連参照 http://vuex.vuejs.org/en/plugins.html http://vuex.vuejs.org/en/strict.html http://vuex.vuejs.org/en/modules.html http://vuex.vuejs.org/en/structure.html
実際、Vuexはコード構造をどのように組織するかに制限はありません.逆に、一連の高度な原則を強制的に規定しています.
これらのルールに従う限り、どのようにプロジェクトの構造を構築するかはあなた次第です.storeファイルが非常に大きい場合は、action、mutation、getterの複数のファイルに分割するだけでいいです.
少し複雑なアプリケーションでは、モジュールを使用する必要があるかもしれません.以下は、シンプルなプロジェクトアーキテクチャです.
├── index.html
├── main.js
├── api
│ └── ... # API
├── components
│ ├── App.vue
│ └── ...
└── store
├── index.js # modules 、export store
├── actions.js # action
├── mutations.js # mutations
└── modules
├── cart.js # cart
└── products.js # products
詳細については、カートのインスタンスを参照してください.
Modules
単一のステータスツリーが使用されているため、適用されるすべてのステータスは大きなオブジェクトに含まれます.しかし,我々の応用規模が増加するにつれて,このStoreは非常に肥大化している.
この問題を解決するために、Vuexはstoreをmodule(モジュール)に分けることができます.各モジュールには、それぞれのステータス、mutation、action、getter、さらにはネストされたモジュールが含まれています.以下のように組織されています.
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})
store.state.a // -> moduleA's state
store.state.b // -> moduleB's state
モジュールローカルステータス
モジュールのmutationsメソッドとgettersメソッドの最初の受信パラメータは、モジュールのローカル状態です.
const moduleA = {
state: { count: 0 },
mutations: {
increment: (state) {
// state 。
state.count++
}
},
getters: {
doubleCount (state) {
return state.count * 2
}
}
}
同様に、モジュールのactionsでは、
context.state
がローカル状態であり、context.rootState
がルート状態である.const moduleA = {
// ...
actions: {
incrementIfOdd ({ state, commit }) {
if (state.count % 2 === 1) {
commit('increment')
}
}
}
}
モジュールのgetters内では,ルート状態も3番目のパラメータとして露出する.
const moduleA = {
// ...
getters: {
sumWithRootCount (state, getters, rootState) {
return state.count + rootState.count
}
}
}
ネーミングスペース
モジュール内のactions、mutations、gettersは依然としてグローバルネーミングスペースに登録されていることに注意してください.これにより、複数のモジュールが同じmutation/actionタイプに応答します.モジュール名に接頭辞または接尾辞を追加してネーミングスペースを設定し、ネーミング競合を回避できます.もしあなたのVuexモジュールが多重化可能で、実行環境も未知であれば、あなたはそうすべきです.
todos
モジュールを作成します.// types.js
// getter、 action mutation
// `todos`
export const DONE_COUNT = 'todos/DONE_COUNT'
export const FETCH_ALL = 'todos/FETCH_ALL'
export const TOGGLE_DONE = 'todos/TOGGLE_DONE'
// modules/todos.js
import * as types from '../types'
// getters, actions and mutations
const todosModule = {
state: { todos: [] },
getters: {
[types.DONE_COUNT] (state) {
// ...
}
},
actions: {
[types.FETCH_ALL] (context, payload) {
// ...
}
},
mutations: {
[types.TOGGLE_DONE] (state, payload) {
// ...
}
}
}
ダイナミックモジュールの登録
store.registerModule
メソッドでstore作成後にモジュールを登録できます.store.registerModule('myModule', {
// ...
})
モジュールの
store.state.myModule
は、モジュールの状態に曝される.他のVueプラグインは、アプリケーションのstoreにモジュールを追加し、動的に登録することでVuexのステータス管理機能を使用することができます.例えば、
vuex-router-sync
ライブラリは、動的に登録されたモジュールでアプリケーションのルーティング状態を管理することによって、vue−routerおよびvuexを統合する.動的に登録されたモジュールを
store.unregisterModule(moduleName)
で削除することもできます.しかし、この方法で静的モジュール(つまりstoreが作成されたときに宣言されたモジュール)を削除することはできません.Plugins
Vuexのstoreは
plugins
オプションを受信し、このオプションは各mutationのフックを露出する.Vuexのプラグインは、sotreを一意のパラメータとして受信する簡単な方法です.const myPlugin = store => {
// store
store.subscribe((mutation, state) => {
// mutation
// mutation {type, payload}。
})
}
次のように使用します.
const store = new Vuex.Store({
// ...
plugins: [myPlugin]
})
プラグイン内でのMutationsのコミット
プラグインはステータスを直接変更することはできません.これはあなたのコンポーネントのように、mutationsによって変更をトリガーするしかありません.
mutationsをコミットすることで、プラグインはstoreにデータソースを同期するために使用できます.たとえば、websocketデータソースをstoreに同期するために(これは使用例を説明するためのものであり、実際には
createPlugin
メソッドは複雑なタスクを完了するためにより多くのオプションを追加する).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,
mutations,
plugins: [plugin]
})
ステータススナップショットの生成
プラグインは、ステータスの[スナップショット](Snapshot)とステータスの変化の前後の変化を取得したい場合があります.これらの機能を実現するには、ステータスオブジェクトを深くコピーする必要があります.
const myPluginWithSnapshot = store => {
let prevState = _.cloneDeep(store.state)
store.subscribe((mutation, state) => {
let nextState = _.cloneDeep(state)
// prevState nextState...
// , mutation
prevState = nextState
})
}
**ステータススナップショットを生成するプラグインは、開発段階でのみ使用できます.WebpackまたはBrowserifyを使用して、構築ツールで処理してください.
const store = new Vuex.Store({
// ...
plugins: process.env.NODE_ENV !== 'production'
? [myPluginWithSnapshot]
: []
})
プラグインはデフォルトで使用されます.製品をリリースするには、WebpackのDefinePluginまたはBrowserifyのenvifyを使用して
process.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
transformer (state) {
//
// ,
return state.subTree
},
mutationTransformer (mutation) {
// mutation { type, payload }
//
return mutation.type
}
})
ログ・プラグインは、
<script>
のラベルを直接通過することもでき、グローバル・メソッドcreateVuexLogger
を提供します.loggerプラグインはステータススナップショットを生成するので、開発環境でのみ使用できます.
厳格モード
厳格モードを有効にするには、Vuex storeを作成するときに
strict: true
に簡単に入力します.const store = new Vuex.Store({
// ...
strict: true
})
厳格モードでは,Vuex状態がmutationメソッドの外で修正されるとエラーが投げ出される.これにより、すべてのステータス変更がデバッグツールによって明確に追跡されることが保証されます.
開発フェーズvs.リリースフェーズ
プラグインの処理と同様に、コンストラクションツールで処理できます.
const store = new Vuex.Store({
// ...
strict: process.env.NODE_ENV !== 'production'
})
関連参照