While debugging, can I have access to the Redux store from the browser console?

JavascriptReactjsRedux

Javascript Problem Overview


I have unit tests for my reducers. However, when I'm debugging in the browser, I want to check if my actions have been called correctly and whether the state has been modified accordingly.

I'm looking for something like:

window._redux.store

... in the browser so I can type that on the console and check how things are going.

How can I achieve that?

Javascript Solutions


Solution 1 - Javascript

How to view redux store on any website, with no code changes

Update Nov 2019

The react devtools have changed since my original answer. The new components tab in chrome's devtools still has the data, but you may have to search a little bit more.

  1. open chrome devTools
  2. select react devtool's Components tab
  3. click on the top-most node and look in right-hand column for store to be shown
  4. repeat step 3 down the tree until you find the store (for me it was the 4th level)
  5. Now you can follow the steps below with $r.store.getState()

Example screenshot

Original Answer

If you have react developer tools running you can use $r.store.getState(); with no changes to your codebase.

Note: You have to open the react devtool in your developer tools window first to make this work, otherwise you will get a $r is not defined error

  1. open developer tools
  2. click the React tab
  3. ensure the provider node (or topmost node) is selected
  4. then type $r.store.getState(); or $r.store.dispatch({type:"MY_ACTION"}) into your console

Solution 2 - Javascript

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

Now you can access the store from window.store in the console like this:

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

Solution 3 - Javascript

The recommended solution doesn't work for me.

The correct command is:

$r.props.store.getState()

Solution 4 - Javascript

You can use a logging middleware as described in the 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)

Alternatively, you could change the logging to just append to a global array (your window._redux) and you could look in the array when you needed information on a particular state.

Solution 5 - Javascript

If you're using Next JS, you can access the store by: window.__NEXT_REDUX_STORE__.getState()

You can also dispatch actions, just look at the options you have in window.__NEXT_REDUX_STORE__

Solution 6 - Javascript

Another answer suggests adding the store to the window, but if you just want access to the store as an object, you can define a getter on the window.

This code needs to be added where you've configured your store - in my app, this is the same file as where <Provider store={store} /> is called.

Now you can type reduxStore in the console to get an object - and copy(reduxStore) to copy it to the clipboard.

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

You can wrap this in an if (process.env.NODE_ENV === 'development') to disable it in production.

Solution 7 - Javascript

In case you would like to see store state for debugging you could do this:

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

Solution 8 - Javascript

With react developer tools:

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

Solution 9 - Javascript

First of all, you need to define the store in the window object (You can place it in you configureStore file):

window.store = store;

Then you only need to write in the console the following:

window.store.getState();

Hop this helps.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndre PenaView Question on Stackoverflow
Solution 1 - JavascriptS.KiersView Answer on Stackoverflow
Solution 2 - JavascriptAdrian SilvescuView Answer on Stackoverflow
Solution 3 - JavascriptthodwrisView Answer on Stackoverflow
Solution 4 - JavascriptSean VieiraView Answer on Stackoverflow
Solution 5 - JavascriptSatwik GuptaView Answer on Stackoverflow
Solution 6 - JavascriptJames WilsonView Answer on Stackoverflow
Solution 7 - JavascriptigorView Answer on Stackoverflow
Solution 8 - JavascriptVARP-DOHView Answer on Stackoverflow
Solution 9 - JavascriptAlberto PerezView Answer on Stackoverflow