디버깅하는 동안 브라우저 콘솔에서 Redux 스토어에 액세스 할 수 있습니까?


87

reducers. 그러나 브라우저에서 디버깅 할 때 내 작업이 올바르게 호출되었는지 그리고 그에 따라 상태가 수정되었는지 확인하고 싶습니다.

다음과 같은 것을 찾고 있습니다.

window._redux.store

... 브라우저에서 콘솔에 입력하고 어떻게 진행되는지 확인할 수 있습니다.

어떻게 할 수 있습니까?


1
참고로 Redux Devtools 와 함께 작업 및 결과 상태를 시각화 하는LogMonitor 것을 고려할 수 있습니다 .
Michelle Tilley

1
프로덕션 빌드 모드에서 보안에 대해 이야기하면 브라우저 콘솔에서 저장소를 읽을 수 있습니까?
JRichardsz

답변:


151

코드 변경없이 모든 웹 사이트에서 redux 스토어를 보는 방법

2019 년 11 월 업데이트

내 원래 답변 이후 반응 devtools가 변경되었습니다. components크롬 개발 도구의 새 탭에는 여전히 데이터가 있지만 조금 더 검색해야 할 수도 있습니다.

  1. 크롬 devTools 열기
  2. react devtool의 Components탭을 선택 하십시오.
  3. 맨 위에있는 노드를 클릭하고 표시 할 오른쪽 열을 확인 store합니다.
  4. 당신이 찾을 때까지 트리 아래로 3 단계를 반복하십시오 store(저에게는 그것은 4 단계였습니다)
  5. 이제 아래 단계를 수행 할 수 있습니다. $r.store.getState()

예시 스크린 샷

원래 답변

당신이 가지고있는 경우에 사용할 수있는 실행 개발자 도구 반응 $r.store.getState();코드베이스를 변경하지 .

참고 : 이 작업을 수행하려면 먼저 개발자 도구 창에서 react devtool을 열어야합니다. 그렇지 않으면 $r is not defined오류가 발생합니다.

  1. 오픈 개발자 도구
  2. React 탭을 클릭하십시오
  3. 공급자 노드 (또는 최상위 노드)가 선택되었는지 확인
  4. 그런 다음 $r.store.getState();또는 $r.store.dispatch({type:"MY_ACTION"})콘솔에 입력 하십시오.

2
참고 :이 작업을 수행하려면 state루트 구성 요소에 속성으로 를 저장해야합니다 . 당신이 따르는 경우에 지시를 하고있는 <Provider>최상위 구성 요소,이 뜻을 잘 작동한다. 그냥 움직여서 조금 먹었습니다!
Aidan Feldman

3
시도$r.state.store.getState()
user1032752

4
같은 외모는 $r현재의 구성 요소를 선택하는 의미 Components개발 도구의 섹션을 참조하십시오. 을 store통해 전체에 액세스 할 수없는 것 같습니다. $r모든 곳에서 후크를 사용하고 있기 때문일 수 있지만 내 구성 요소가 볼 수있는 상점의 일부를 볼 수 있습니다. 포인트!
Dima Tisnek

2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()이러한 구성 요소가 작동합니다 useSelector. ... 산부인과, YMMV 사용 후크에 따라 ...
디마 Tisnek

3
나는 사용해야했다$r.props.store
Kris Dover

62

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

이제 다음과 같이 콘솔의 window.store에서 저장소에 액세스 할 수 있습니다.

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


6
: 또한 상태에 액세스 할 수 있습니다window.store.getState()
Liran BRIMER

13

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)

또는 로깅을 변경하여 전역 배열 (사용자 window._redux)에 추가하고 특정 상태에 대한 정보가 필요할 때 배열을 볼 수 있습니다.


1
또는 더 나은 방법은 redux-logger
Anand Sainath

다음과 같이 리듀서를 가져 오는 경우 : './reducers/'에서 리듀서를 가져 오면 let store = createStoreWithMiddleware (reducers)를 사용하면됩니다.
Bruce Seymour


6

권장 솔루션이 작동하지 않습니다.

올바른 명령은 다음과 같습니다.

$r.props.store.getState()

이 답변에 대한 주석이어야합니다
gdbdable

1

디버깅을위한 저장 상태를보고 싶다면 다음과 같이 할 수 있습니다.

#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

또 다른 대답은 창에 상점을 추가하는 것을 제안하지만 상점에 객체로 액세스하려는 경우 창에 게터를 정의 할 수 있습니다.

이 코드는 스토어를 구성한 위치에 추가해야합니다. 내 앱에서이 코드 <Provider store={store} />는 호출 된 위치와 동일한 파일 입니다.

이제 reduxStore콘솔에 입력 하여 개체를 가져오고 copy(reduxStore)클립 보드에 복사 할 수 있습니다.

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

이것을로 래핑 if (process.env.NODE_ENV === 'development')하여 프로덕션에서 비활성화 할 수 있습니다 .


-1

React 개발자 도구 :

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

1
Uncaught TypeError: Cannot read property 'values' of undefined오류 제공
gdbdable

-2

먼저 window객체에 저장소를 정의해야 합니다 ( configureStore파일에 저장할 수 있음).

window.store = store;

그런 다음 콘솔에 다음 내용 만 작성하면됩니다.

window.store.getState();

도움이 돼요.


저장소는 기본적으로 콘솔에서 정의되지 않습니다. 어떻게 거기에 도착합니까?
Jen S.

저장소를 사용하려면 먼저 창 개체에서 정의해야합니다.
Rafael Rozon 19 년

@RafaelRozon 네, 맞습니다. 그것을 보여주기 위해 내 대답을 편집했습니다.
Alberto Perez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.