Mam testy jednostkowe dla mojego reducers
. Jednak kiedy debuguję w przeglądarce, chcę sprawdzić, czy moje akcje zostały poprawnie wywołane i czy stan został odpowiednio zmodyfikowany.
Szukam czegoś takiego:
window._redux.store
... w przeglądarce, więc mogę to wpisać na konsoli i sprawdzić, jak się sprawy mają.
Jak mogę to osiągnąć?
javascript
reactjs
redux
André Pena
źródło
źródło
LogMonitor
do wizualizacji swoich działań i wynikających z nich stanów.Odpowiedzi:
Jak przeglądać sklep redux na dowolnej stronie, bez zmian w kodzie
Zaktualizuj listopad 2019
Reaguj devtools zmieniły się od czasu mojej oryginalnej odpowiedzi. Nowa
components
karta w devtools Chrome nadal zawiera dane, ale być może będziesz musiał przeszukać trochę więcej.Components
zakładkę Reaguj devtoolstore
aby go wyświetlićstore
(dla mnie był to 4 poziom)$r.store.getState()
Oryginalna odpowiedź
Jeśli masz reagować narzędzi programistycznych działa można korzystać
$r.store.getState();
z żadnych zmian w swoim kodzie .Uwaga: aby to zadziałało, musisz najpierw otworzyć reakcję devtool w oknie narzędzi programistycznych, w przeciwnym razie pojawi się
$r is not defined
błąd$r.store.getState();
lub$r.store.dispatch({type:"MY_ACTION"})
do konsoliźródło
state
jako właściwość w komponencie głównym. Jeśli postępujesz zgodnie ze wskazówkami i masz<Provider>
komponent najwyższego poziomu, to zadziała dobrze. Po prostu zostałem ugryziony, przenosząc go!$r.state.store.getState()
$r
odnosi się do aktualnie wybranego komponentu wComponents
sekcji Narzędzia deweloperskie. I nie wydaje się, aby mieć dostęp do całegostore
through$r
, może dlatego używam haków wszędzie, ale mogę zobaczyć tę część sklepu, że mój składnik widać, który jest prawie tak dobra, a czasem więcej do punkt!$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()
działa dla tych komponentów, któreuseSelector
... Ob., YMMV w zależności od używanych haków ...$r.props.store
let store = createStore(yourApp); window.store = store;
Teraz możesz uzyskać dostęp do sklepu z window.store w konsoli w następujący sposób:
window.store.dispatch({type:"MY_ACTION"})
źródło
window.store.getState()
Możesz użyć oprogramowania pośredniczącego do rejestrowania, jak opisano w 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)
Alternatywnie, możesz zmienić rejestrowanie, aby po prostu dołączać do tablicy globalnej (twojej
window._redux
) i możesz zajrzeć do tablicy, gdy potrzebujesz informacji o określonym stanie.źródło
Zalecane rozwiązanie u mnie nie działa.
Prawidłowe polecenie to:
źródło
Jeśli korzystasz z Next JS , możesz uzyskać dostęp do sklepu przez:
window.__NEXT_REDUX_STORE__.getState()
Możesz także wysłać akcje, po prostu spójrz na opcje, które masz w
window.__NEXT_REDUX_STORE__
źródło
Jeśli chcesz zobaczyć stan sklepu do debugowania, możesz to zrobić:
#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)
źródło
Inna odpowiedź sugeruje dodanie sklepu do okna, ale jeśli chcesz mieć dostęp do sklepu tylko jako obiekt, możesz zdefiniować getter w oknie.
Ten kod należy dodać w miejscu, w którym skonfigurowałeś swój sklep - w mojej aplikacji jest to ten sam plik, w którym
<Provider store={store} />
jest wywołany.Teraz możesz wpisać
reduxStore
w konsoli, aby pobrać obiekt - icopy(reduxStore)
skopiować go do schowka.Object.defineProperty(window, 'reduxStore', { get() { return store.getState(); }, });
Możesz to opakować,
if (process.env.NODE_ENV === 'development')
aby wyłączyć w produkcji.źródło
Dzięki narzędziom programistycznym React:
const store = [...__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent.internalInstancesById.values()].find(e=>e.elementType.name==="Provider").pendingProps.store
źródło
Uncaught TypeError: Cannot read property 'values' of undefined
błądPrzede wszystkim musisz zdefiniować sklep w
window
obiekcie (możesz go umieścić w swoimconfigureStore
pliku):window.store = store;
Następnie wystarczy napisać w konsoli:
window.store.getState();
Hop to pomaga.
źródło