Eu tenho testes de unidade para o meu reducers
. No entanto, quando estou depurando no navegador, quero verificar se minhas ações foram chamadas corretamente e se o estado foi modificado de acordo.
Estou procurando algo como:
window._redux.store
... no navegador para que eu possa digitar no console e verificar como as coisas estão indo.
Como posso conseguir isso?
javascript
reactjs
redux
André Pena
fonte
fonte
LogMonitor
para visualizar suas ações e estados resultantes.Respostas:
Como visualizar a loja redux em qualquer site, sem alterações de código
Atualização de novembro de 2019
Os devtools de reação mudaram desde minha resposta original. A nova
components
guia nos devtools do Chrome ainda contém os dados, mas talvez você precise pesquisar um pouco mais.Components
aba do devtool de reaçãostore
para ser mostradostore
(para mim, era o 4º nível)$r.store.getState()
Resposta Original
Se você tiver ferramentas de desenvolvedor Rea em execução, poderá usá
$r.store.getState();
-lo sem alterações em sua base de código .Nota: Você precisa abrir o react devtool na janela de ferramentas do desenvolvedor primeiro para fazer este trabalho, caso contrário, você receberá um
$r is not defined
erro$r.store.getState();
ou$r.store.dispatch({type:"MY_ACTION"})
em seu consolefonte
state
como uma propriedade em seu componente raiz. Se você seguir as instruções e tiver o<Provider>
como o componente de nível superior, isso funcionará bem. Só fui mordido movendo-o!$r.state.store.getState()
$r
se refere ao componente atualmente selecionado naComponents
seção de Ferramentas de Desenvolvimento. Parece que não consigo acessar todo ostore
caminho$r
, talvez porque estou usando ganchos em todos os lugares, mas consigo ver a parte da loja que meu componente pode ver, que é quase tão boa, e às vezes mais para o ponto!$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()
funciona para os componentes queuseSelector
... Ob., YMMV dependendo dos ganchos que você usa ...$r.props.store
let store = createStore(yourApp); window.store = store;
Agora você pode acessar a loja em window.store no console desta forma:
window.store.dispatch({type:"MY_ACTION"})
fonte
window.store.getState()
Você pode usar um middleware de registro conforme descrito no 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)
Como alternativa, você pode alterar o registro para apenas anexar a um array global (your
window._redux
) e pode olhar no array quando precisar de informações sobre um determinado estado.fonte
A solução recomendada não funciona para mim.
O comando correto é:
fonte
Se estiver usando o Next JS , você pode acessar a loja:
window.__NEXT_REDUX_STORE__.getState()
Você também pode despachar ações, basta olhar as opções que você tem em
window.__NEXT_REDUX_STORE__
fonte
Caso queira ver o estado da loja para depuração, você pode fazer o seguinte:
#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)
fonte
Outra resposta sugere adicionar a loja à janela, mas se você quiser apenas acessar a loja como um objeto, pode definir um getter na janela.
Este código precisa ser adicionado onde você configurou sua loja - em meu aplicativo, este é o mesmo arquivo de onde
<Provider store={store} />
é chamado.Agora você pode digitar
reduxStore
no console para obter um objeto - ecopy(reduxStore)
copiá-lo para a área de transferência.Object.defineProperty(window, 'reduxStore', { get() { return store.getState(); }, });
Você pode embrulhar isso em um
if (process.env.NODE_ENV === 'development')
para desativá-lo na produção.fonte
Com as ferramentas de desenvolvedor react:
const store = [...__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent.internalInstancesById.values()].find(e=>e.elementType.name==="Provider").pendingProps.store
fonte
Uncaught TypeError: Cannot read property 'values' of undefined
erroEm primeiro lugar, você precisa definir o armazenamento no
window
objeto (você pode colocá-lo em seuconfigureStore
arquivo):window.store = store;
Então você só precisa escrever no console o seguinte:
window.store.getState();
Espero que isso ajude.
fonte