Pendant le débogage, puis-je avoir accès au magasin Redux à partir de la console du navigateur?


88

J'ai des tests unitaires pour mon reducers. Cependant, lorsque je débogue dans le navigateur, je veux vérifier si mes actions ont été appelées correctement et si l'état a été modifié en conséquence.

Je recherche quelque chose comme:

window._redux.store

... dans le navigateur pour que je puisse taper cela sur la console et vérifier comment les choses se passent.

Comment puis-je y parvenir?


1
En remarque, vous pouvez envisager d'utiliser les outils de développement Redux avec leLogMonitor pour visualiser vos actions et les états résultants.
Michelle Tilley

1
En parlant de sécurité, en mode production, est-il possible de lire le magasin à partir de la console du navigateur?
JRichardsz

Réponses:


151

Comment afficher le magasin Redux sur n'importe quel site Web, sans changement de code

Mise à jour novembre 2019

Les devtools de react ont changé depuis ma réponse initiale. Le nouvel componentsonglet dans les outils de développement de Chrome contient toujours les données, mais vous devrez peut-être chercher un peu plus.

  1. ouvrir chrome devTools
  2. sélectionnez l' Componentsonglet React devtool
  3. cliquez sur le nœud le plus haut et regardez dans la colonne de droite pour storeêtre affiché
  4. répétez l'étape 3 dans l'arbre jusqu'à ce que vous trouviez le store(pour moi c'était le 4ème niveau)
  5. Vous pouvez maintenant suivre les étapes ci-dessous avec $r.store.getState()

Exemple de capture d'écran

Réponse originale

Si vous avez réagir les outils de développement en cours d' exécution , vous pouvez utiliser $r.store.getState();avec aucun changement à votre base de code .

Remarque: vous devez d'abord ouvrir le react devtool dans la fenêtre de vos outils de développement pour que cela fonctionne, sinon vous obtiendrez une $r is not definederreur

  1. ouvrir les outils de développement
  2. cliquez sur l'onglet Réagir
  3. assurez-vous que le nœud fournisseur (ou le nœud le plus élevé) est sélectionné
  4. puis tapez $r.store.getState();ou $r.store.dispatch({type:"MY_ACTION"})dans votre console

2
Remarque: pour que cela fonctionne, vous devez stocker le en statetant que propriété sur votre composant racine. Si vous suivez les instructions et avez le <Provider>comme composant de niveau supérieur, cela fonctionnera correctement. Je viens de me faire mordre en le déplaçant!
Aidan Feldman

3
Essayez$r.state.store.getState()
user1032752

4
On dirait que $rfait référence au composant actuellement sélectionné dans la Componentssection des outils de développement. Je ne semble pas être en mesure d'accéder à l'ensemble storegrâce $r, peut - être parce que je suis en utilisant des crochets partout, mais je vais voir la partie du magasin que mon composant peut voir, ce qui est presque aussi bon, et parfois plus au point!
Dima Tisnek

2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()fonctionne pour les composants qui useSelector... Ob., YMMV en fonction des crochets que vous utilisez ...
Dima Tisnek

3
Je devais utiliser$r.props.store
Kris Dover le

62

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

Vous pouvez maintenant accéder au magasin depuis window.store dans la console comme ceci:

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


6
et peut également accéder à l'état:window.store.getState()
Liran Brimer

13

Vous pouvez utiliser un middleware de journalisation comme décrit dans le 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)

Alternativement, vous pouvez modifier la journalisation pour l'ajouter simplement à un tableau global (votre window._redux) et vous pouvez regarder dans le tableau lorsque vous avez besoin d'informations sur un état particulier.


1
Ou encore mieux, utilisez une bibliothèque comme redux-logger
Anand Sainath

Si vous importez les réducteurs comme ceci: importez des réducteurs à partir de './reducers/', vous pouvez simplement utiliser let store = createStoreWithMiddleware (réducteurs) car le fichier './reducers/' contiendra généralement des combinReducers.
Bruce Seymour

7

La solution recommandée ne fonctionne pas pour moi.

La commande correcte est:

$r.props.store.getState()

cela devrait être un commentaire à ces réponses
gdbdable

6

Si vous utilisez Next JS , vous pouvez accéder au magasin par: window.__NEXT_REDUX_STORE__.getState()

Vous pouvez également distribuer des actions, il suffit de regarder les options dont vous disposezwindow.__NEXT_REDUX_STORE__


1

Si vous souhaitez voir l'état du magasin pour le débogage, vous pouvez le faire:

#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

Une autre réponse suggère d'ajouter le magasin à la fenêtre, mais si vous voulez simplement accéder au magasin en tant qu'objet, vous pouvez définir un getter sur la fenêtre.

Ce code doit être ajouté là où vous avez configuré votre boutique - dans mon application, il s'agit du même fichier que celui où <Provider store={store} />est appelé.

Vous pouvez maintenant taper reduxStoredans la console pour obtenir un objet et copy(reduxStore)le copier dans le presse-papiers.

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

Vous pouvez encapsuler ceci dans un if (process.env.NODE_ENV === 'development')pour le désactiver en production.


-1

Avec les outils de développement React:

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

1
donne une Uncaught TypeError: Cannot read property 'values' of undefinederreur
gdbdable

-2

Tout d'abord, vous devez définir le magasin dans l' windowobjet (vous pouvez le placer dans votre configureStorefichier):

window.store = store;

Ensuite, il vous suffit d'écrire dans la console ce qui suit:

window.store.getState();

J'espère que cela aide.


store n'est pas défini dans la console par défaut. Comment y arrive-t-il?
Jen S.

Store devrait d'abord être défini dans l'objet window avant de pouvoir être utilisé.
Rafael Rozon

@RafaelRozon Ouais, tu as raison, j'ai édité ma réponse pour montrer ça.
Alberto Perez
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.