デバッグ中に、ブラウザコンソールからReduxストアにアクセスできますか?


91

のユニットテストがありますreducers。ただし、ブラウザーでデバッグしているときに、アクションが正しく呼び出されているかどうか、およびそれに応じて状態が変更されているかどうかを確認したいと思います。

私は次のようなものを探しています:

window._redux.store

...ブラウザで入力して、コンソールで入力し、状況を確認できます。

どうすればそれを達成できますか?


1
注意点として、あなたは使用して検討するかもしれないReduxのデベロッパーツールを一緒にあなたの行動と結果の状態を視覚化します。LogMonitor
ミシェルティリー2015

1
本番ビルドモードでのセキュリティについて言えば、ブラウザコンソールからストアを読み取ることは可能ですか?
JRichardsz 2018

回答:


153

コードを変更せずに、任意のWebサイトでreduxストアを表示する方法

2019年11月更新

私の最初の答えから、reactdevtoolsが変更されました。componentsChromeのdevtoolsの新しいタブにはまだデータがありますが、もう少し検索する必要があるかもしれません。

  1. ChromedevToolsを開きます
  2. reactdevtoolのComponentsタブを選択します
  3. 一番上のノードをクリックし、右側の列を見て表示さstoreれます
  4. store(私にとっては第4レベルでした)が見つかるまで、ツリーを下ってステップ3を繰り返します。
  5. これで、以下の手順に従うことができます。 $r.store.getState()

スクリーンショットの例

元の回答

反応開発ツールを実行している場合は、コードベースを変更$r.store.getState();ずに使用できます

注:これを機能させるには、最初に開発者ツールウィンドウでreact devtoolを開く必要があります。そうしないと、$r is not definedエラーが発生します。

  1. オープン開発ツール
  2. [反応]タブをクリックします
  3. プロバイダーノード(または最上位ノード)が選択されていることを確認します
  4. 次に、コンソールに$r.store.getState();または$r.store.dispatch({type:"MY_ACTION"})を入力します

2
注:これを機能stateさせるには、ルートコンポーネントのプロパティとしてを保存する必要があります。あなたが続く場合は指示をし、持っている<Provider>トップレベルのコンポーネントとして、これはうまく動作します。動かして少しだけ!
エイダンフェルドマン2018

3
試してください$r.state.store.getState()
user10327 5219

4
開発ツールのセクションで$r現在選択されているコンポーネントを参照しているようComponentsです。私は全体にアクセスすることはできていないようですstoreを通じて$r、私はどこでもフックを使用しているかもしれないので、しかし、私は私のコンポーネントが見ることができるストアの一部を見ることが、ほとんど良いようである、そして時にはそれ以上ポイント!
DimaTisnek19年

2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()useSelector使用するフックに応じて... Ob。、YMMV ...
DimaTisnek19年

4
私は使用しなければなりませんでした$r.props.store
KrisDover20年

63

let store = createStore(yourApp); window.store = store;

これで、次のようにコンソールのwindow.storeからストアにアクセスできます。

window.store.dispatch({type:"MY_ACTION"})


6
そして、も状態にアクセスすることができますwindow.store.getState()
Liran Brimerの

13

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)に追加するだけで、特定の状態に関する情報が必要なときに配列を調べることもできます。


1
またはさらに良いことに、redux-loggerの
Anand Sainath 2016年

次のようにレデューサーをインポートする場合: './ reducers /'からレデューサーをインポートします。 '。/ reducers /'ファイルには通常combineReducersが含まれるため、let store = createStoreWithMiddleware(reducers)を使用できます。
ブルースシーモア

7

推奨される解決策は私にはうまくいきません。

正しいコマンドは次のとおりです。

$r.props.store.getState()

それは、これらの答えにコメントする必要があります
gdbdable

6

Next JSを使用している場合は、の方法でストアにアクセスできます。window.__NEXT_REDUX_STORE__.getState()

アクションをディスパッチすることもできます。オプションを確認するだけです。window.__NEXT_REDUX_STORE__


1

デバッグ用にストアの状態を確認したい場合は、次のようにします。

#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)

1

別の答えは、ストアをウィンドウに追加することを提案していますが、オブジェクトとしてストアにアクセスしたいだけの場合は、ウィンドウにゲッターを定義できます。

このコードは、ストアを構成した場所に追加する必要があります。私のアプリでは、これ<Provider store={store} />は呼び出された場所と同じファイルです。

これreduxStoreで、コンソールに入力してオブジェクトを取得copy(reduxStore)し、クリップボードにコピーできます。

  Object.defineProperty(window, 'reduxStore', {
    get() {
      return store.getState();
    },
  });

これをでラップしif (process.env.NODE_ENV === 'development')て、本番環境で無効にすることができます。


-1

反応開発ツールを使用する場合:

const store = [...__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent.internalInstancesById.values()].find(e=>e.elementType.name==="Provider").pendingProps.store

1
与えUncaught TypeError: Cannot read property 'values' of undefinedエラー
gdbdable

-2

まず、windowオブジェクトにストアを定義する必要があります(configureStoreファイルに配置できます)。

window.store = store;

次に、コンソールに次のように書き込むだけです。

window.store.getState();

これがお役に立てば幸いです。


ストアはデフォルトでコンソールで未定義です。どうやってそこにたどり着くのですか?
ジェンS.

ストアは、使用する前に、最初にウィンドウオブジェクトで定義する必要があります。
RafaelRozon19年

@RafaelRozonええ、そうです、私はそれを示すために私の答えを編集しました。
アルベルトペレス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.