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?
javascript
reactjs
redux
André Pena
la source
la source
LogMonitor
pour visualiser vos actions et les états résultants.Réponses:
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
components
onglet dans les outils de développement de Chrome contient toujours les données, mais vous devrez peut-être chercher un peu plus.Components
onglet React devtoolstore
être affichéstore
(pour moi c'était le 4ème niveau)$r.store.getState()
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 defined
erreur$r.store.getState();
ou$r.store.dispatch({type:"MY_ACTION"})
dans votre consolela source
state
tant 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!$r.state.store.getState()
$r
fait référence au composant actuellement sélectionné dans laComponents
section des outils de développement. Je ne semble pas être en mesure d'accéder à l'ensemblestore
grâ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!$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()
fonctionne pour les composants quiuseSelector
... Ob., YMMV en fonction des crochets que vous utilisez ...$r.props.store
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"})
la source
window.store.getState()
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.la source
La solution recommandée ne fonctionne pas pour moi.
La commande correcte est:
la source
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 disposez
window.__NEXT_REDUX_STORE__
la source
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)
la source
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
reduxStore
dans la console pour obtenir un objet etcopy(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.la source
Avec les outils de développement React:
const store = [...__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent.internalInstancesById.values()].find(e=>e.elementType.name==="Provider").pendingProps.store
la source
Uncaught TypeError: Cannot read property 'values' of undefined
erreurTout d'abord, vous devez définir le magasin dans l'
window
objet (vous pouvez le placer dans votreconfigureStore
fichier):window.store = store;
Ensuite, il vous suffit d'écrire dans la console ce qui suit:
window.store.getState();
J'espère que cela aide.
la source