Durante la depuración, ¿puedo tener acceso a la tienda Redux desde la consola del navegador?

88

Tengo pruebas unitarias para mi reducers. Sin embargo, cuando estoy depurando en el navegador, quiero comprobar si mis acciones se han llamado correctamente y si el estado se ha modificado en consecuencia.

Estoy buscando algo como:

window._redux.store

... en el navegador para poder escribir eso en la consola y comprobar cómo van las cosas.

¿Cómo puedo lograrlo?

André Pena
fuente
1
Como nota al margen, es posible considerar el uso de los Devtools Redux , junto con laLogMonitor de visualizar sus acciones y estados resultantes.
Michelle Tilley
1
Hablando de seguridad, en el modo de construcción de producción, ¿es posible leer la tienda desde la consola del navegador?
JRichardsz

Respuestas:

151

Cómo ver la tienda redux en cualquier sitio web, sin cambios de código

Actualización Nov 2019

Las devtools de reacción han cambiado desde mi respuesta original. La nueva componentspestaña en las herramientas de desarrollo de Chrome todavía tiene los datos, pero es posible que tenga que buscar un poco más.

  1. abrir Chrome devTools
  2. seleccione reaccionar de devtool Componentspestaña
  3. haga clic en el nodo superior y busque en la columna de la derecha para storeque se muestre
  4. repite el paso 3 abajo del árbol hasta que encuentres el store(para mí fue el 4to nivel)
  5. Ahora puede seguir los pasos a continuación con $r.store.getState()

Captura de pantalla de ejemplo

Respuesta original

Si usted tiene las herramientas para desarrolladores reaccionar correr puede utilizar $r.store.getState();con ningún cambio en el código base .

Nota: Primero debe abrir la herramienta de reacción de desarrollo en la ventana de herramientas de desarrollador para que esto funcione, de lo contrario, obtendrá un $r is not definederror

  1. herramientas de desarrollador abiertas
  2. haga clic en la pestaña Reaccionar
  3. asegúrese de que el nodo proveedor (o nodo superior) esté seleccionado
  4. luego escribe $r.store.getState();o $r.store.dispatch({type:"MY_ACTION"})en tu consola
S.Kiers
fuente
2
Nota: para que esto funcione, debe almacenar el statecomo una propiedad en su componente raíz. Si sigue las instrucciones y tiene <Provider>como componente de nivel superior, esto funcionará bien. ¡Simplemente me mordió moviéndolo!
Aidan Feldman
3
Prueba$r.state.store.getState()
user1032752
4
Parece que se $rrefiere al componente seleccionado actualmente en la Componentssección de Herramientas de desarrollo. No parecen ser capaces de acceder a la totalidad del storemedio $r, tal vez porque estoy usando ganchos en todas partes, pero puedo ver la parte de la tienda que mi componente puede ver, que es casi tan bueno, ya veces más a la ¡punto!
Dima Tisnek
2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()funciona para aquellos componentes que useSelector... Ob., YMMV dependiendo de los ganchos que use ...
Dima Tisnek
3
Tuve que usar$r.props.store
Kris Dover
62

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

Ahora puede acceder a la tienda desde window.store en la consola de esta manera:

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

Adrian Silvescu
fuente
6
y también puede acceder al estado:window.store.getState()
Liran Brimer
13

Puede utilizar un middleware de registro como se describe en el libro Redux :

/**
 * 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)

Alternativamente, puede cambiar el registro para agregarlo a una matriz global (su window._redux) y puede buscar en la matriz cuando necesite información sobre un estado en particular.

Sean Vieira
fuente
1
O incluso mejor, use una biblioteca como redux-logger
Anand Sainath
Si está importando los reductores como este: import reducers from './reducers/' entonces puede usar let store = createStoreWithMiddleware (reducers) ya que el archivo './reducers/' normalmente tendrá combineReducers.
Bruce Seymour
7

La solución recomendada no me funciona.

El comando correcto es:

$r.props.store.getState()
thodwris
fuente
debería ser un comentario a estas respuestas
gdbdable
6

Si está utilizando Next JS , puede acceder a la tienda mediante: window.__NEXT_REDUX_STORE__.getState()

También puede enviar acciones, solo mire las opciones que tiene enwindow.__NEXT_REDUX_STORE__

Satwik Gupta
fuente
1

En caso de que desee ver el estado de la tienda para la depuración, puede hacer esto:

#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)
igor
fuente
1

Otra respuesta sugiere agregar la tienda a la ventana, pero si solo desea acceder a la tienda como un objeto, puede definir un captador en la ventana.

Este código debe agregarse donde haya configurado su tienda; en mi aplicación, este es el mismo archivo donde <Provider store={store} />se llama.

Ahora puede escribir reduxStoreen la consola para obtener un objeto y copy(reduxStore)copiarlo en el portapapeles.

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

Puede envolver esto en un if (process.env.NODE_ENV === 'development')para deshabilitarlo en producción.

James Wilson
fuente
-1

Con las herramientas de desarrollo de react:

const store = [...__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent.internalInstancesById.values()].find(e=>e.elementType.name==="Provider").pendingProps.store
VARP-DOH
fuente
1
da Uncaught TypeError: Cannot read property 'values' of undefinederror
gdbdable
-2

En primer lugar, debe definir la tienda en el windowobjeto (puede colocarlo en su configureStorearchivo):

window.store = store;

Entonces solo necesitas escribir en la consola lo siguiente:

window.store.getState();

Hop esto ayuda.

Alberto Pérez
fuente
store no está definido en la consola de forma predeterminada. ¿Cómo llega ahí?
Jen S.
La tienda debería definirse primero en el objeto de ventana antes de que pueda usarse.
Rafael Rozon
@RafaelRozon Sí, tienes razón, he editado mi respuesta para mostrar eso.
Alberto Perez