のユニットテストがありますreducers
。ただし、ブラウザーでデバッグしているときに、アクションが正しく呼び出されているかどうか、およびそれに応じて状態が変更されているかどうかを確認したいと思います。
私は次のようなものを探しています:
window._redux.store
...ブラウザで入力して、コンソールで入力し、状況を確認できます。
どうすればそれを達成できますか?
のユニットテストがありますreducers
。ただし、ブラウザーでデバッグしているときに、アクションが正しく呼び出されているかどうか、およびそれに応じて状態が変更されているかどうかを確認したいと思います。
私は次のようなものを探しています:
window._redux.store
...ブラウザで入力して、コンソールで入力し、状況を確認できます。
どうすればそれを達成できますか?
回答:
私の最初の答えから、reactdevtoolsが変更されました。components
Chromeのdevtoolsの新しいタブにはまだデータがありますが、もう少し検索する必要があるかもしれません。
Components
タブを選択しますstore
れますstore
(私にとっては第4レベルでした)が見つかるまで、ツリーを下ってステップ3を繰り返します。$r.store.getState()
反応開発ツールを実行している場合は、コードベースを変更$r.store.getState();
せずに使用できます。
注:これを機能させるには、最初に開発者ツールウィンドウでreact devtoolを開く必要があります。そうしないと、$r is not defined
エラーが発生します。
$r.store.getState();
または$r.store.dispatch({type:"MY_ACTION"})
を入力しますstate
させるには、ルートコンポーネントのプロパティとしてを保存する必要があります。あなたが続く場合は指示をし、持っている<Provider>
トップレベルのコンポーネントとして、これはうまく動作します。動かして少しだけ!
$r.state.store.getState()
$r
現在選択されているコンポーネントを参照しているようComponents
です。私は全体にアクセスすることはできていないようですstore
を通じて$r
、私はどこでもフックを使用しているかもしれないので、しかし、私は私のコンポーネントが見ることができるストアの一部を見ることが、ほとんど良いようである、そして時にはそれ以上ポイント!
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()
useSelector
使用するフックに応じて... Ob。、YMMV ...
$r.props.store
let store = createStore(yourApp);
window.store = store;
これで、次のようにコンソールのwindow.storeからストアにアクセスできます。
window.store.dispatch({type:"MY_ACTION"})
window.store.getState()
Redux Bookで説明されているように、ロギングミドルウェアを使用できます。
/**
* Logs all actions and states after they are dispatched.
*/
const logger = store => next => action => {
console.group(action.type)
console.info('dispatching', action)
let result = next(action)
console.log('next state', store.getState())
console.groupEnd(action.type)
return result
}
let createStoreWithMiddleware = applyMiddleware(logger)(createStore)
let yourApp = combineReducers(reducers)
let store = createStoreWithMiddleware(yourApp)
または、ロギングを変更してグローバル配列(your window._redux
)に追加するだけで、特定の状態に関する情報が必要なときに配列を調べることもできます。
デバッグ用にストアの状態を確認したい場合は、次のようにします。
#import global from 'window-or-global'
const store = createStore(reducer)
const onStateChange = (function (global) {
global._state = this.getState()
}.bind(store, global))
store.subscribe(onStateChange)
onStateChange()
console.info('Application state is available via global _state object.', '_state=', global._state)
別の答えは、ストアをウィンドウに追加することを提案していますが、オブジェクトとしてストアにアクセスしたいだけの場合は、ウィンドウにゲッターを定義できます。
このコードは、ストアを構成した場所に追加する必要があります。私のアプリでは、これ<Provider store={store} />
は呼び出された場所と同じファイルです。
これreduxStore
で、コンソールに入力してオブジェクトを取得copy(reduxStore)
し、クリップボードにコピーできます。
Object.defineProperty(window, 'reduxStore', {
get() {
return store.getState();
},
});
これをでラップしif (process.env.NODE_ENV === 'development')
て、本番環境で無効にすることができます。
まず、window
オブジェクトにストアを定義する必要があります(configureStore
ファイルに配置できます)。
window.store = store;
次に、コンソールに次のように書き込むだけです。
window.store.getState();
これがお役に立てば幸いです。
LogMonitor