Під час налагодження чи можу я отримати доступ до магазину Redux із консолі браузера?


87

У мене є модульні тести для мого reducers. Однак, коли я налагоджую в браузері, я хочу перевірити, чи правильно були викликані мої дії та чи відповідно змінено стан.

Я шукаю щось на зразок:

window._redux.store

... у браузері, щоб я міг набрати це на консолі і перевірити, як ідуть справи.

Як я можу цього досягти?


1
В якості примітки, ви могли б розглянути можливість використання Redux Devtools разом з візуалізувати ваші дії і результуючі стану. LogMonitor
Мішель Тіллі,

1
Говорячи про безпеку, у режимі побудови виробництва, чи можна читати магазин із консолі браузера?
JRichardsz

Відповіді:


151

Як переглянути магазин Redux на будь-якому веб-сайті, без змін коду

Оновлення листопада 2019

Інструменти реагування змінилися з моєї початкової відповіді. На новій componentsвкладці в розробницьких інструментах chrome все ще є дані, але можливо вам доведеться пошукати трохи більше.

  1. відкрити chrome devTools
  2. виберіть Componentsвкладку reag devtool
  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>компонент верхнього рівня, це буде добре працювати. Просто покусав, перемістивши його!
Айдан Фельдман

3
Спробуйте$r.state.store.getState()
user1032752

4
Схоже, $rпосилається на вибраний на даний момент компонент у Componentsрозділі Dev Tools. Я , здається, не бути в змозі отримати доступ до всього storeнаскрізний $r, може бути , тому що я використовую гачки всюди, але я отримую , щоб побачити частину магазину , що мій компонент можна побачити, що майже так само добре, а іноді і більше до точка!
Діма Тіснек

2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()працює для тих компонентів, які useSelector... Ob., YMMV залежно від гачків, які ви використовуєте ...
Dima 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()
Ліран Бример

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
Ананд Сайнат

Якщо ви імпортуєте редуктори таким чином: імпортуйте редуктори з './reducers/', тоді ви можете просто використовувати let store = createStoreWithMiddleware (редуктори), оскільки у файлі './reducers/' зазвичай міститься combReducers.
Брюс Сеймур,

6

Якщо ви використовуєте Next JS , ви можете отримати доступ до магазину за допомогою: window.__NEXT_REDUX_STORE__.getState()

Ви також можете відправляти дії, просто подивіться на параметри, які ви маєте вwindow.__NEXT_REDUX_STORE__


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

За допомогою інструментів розробника для реагування:

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();

Хоп, це допомагає.


store за замовчуванням не визначено в консолі. Як воно туди потрапляє?
Jen S.

Магазин потрібно було б визначити спочатку в об’єкті вікна, перш ніж його можна буде використовувати.
Рафаель Розон,

@RafaelRozon Так, ти маєш рацію, я відредагував свою відповідь, щоб показати це.
Альберто Перес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.