在调试时,我可以从浏览器控制台访问Redux存储吗?

And*_*ena 68 javascript reactjs redux

我有我的单元测试reducers,正如我所说的那样.但是,当我在浏览器中进行调试时,我想检查是否已正确调用我的操作以及是否已相应地修改状态.

我正在寻找类似的东西:

window._redux.store
Run Code Online (Sandbox Code Playgroud)

...在浏览器中,我可以在控制台上键入它并检查事情的进展情况.

我怎样才能做到这一点?

S.K*_*ers 124

如果您已经运行了反应开发人员工具,则可以使用components无需更改代码库.

注意:您必须首先在开发人员工具窗口中打开react devtool以使其工作,否则您将收到Components错误

  1. 打开开发者工具
  2. 单击"React"选项卡
  3. 确保选择了提供者节点(或最顶层节点)
  4. 然后键入storestore进入您的控制台

  • 我必须使用 `$r.props.store` (8认同)
  • 看起来$ r指的是Dev Tools中“组件”部分中当前选择的组件。我似乎无法通过`$ r`访问整个`store`,也许是因为我到处都使用钩子,但是我看到了我的组件可以看到的一部分存储,这几乎与好,有时更重要! (3认同)
  • 注意:为此,您需要将`state`存储为根组件的属性.如果您按照[指示](https://redux.js.org/basics/usage-with-react#passing-the-store)并将`<Provider>`作为顶级组件,这将有效精细.移动它只是有点儿! (2认同)
  • 尝试$ r.state.store.getState() (2认同)
  • `$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()` 适用于那些 `useSelector` 的组件...Ob.,YMMV 取决于您使用的钩子... (2认同)

Adr*_*scu 56

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

现在您可以从控制台中的window.store访问商店,如下所示:

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

  • 并且还可以访问状态:`window.store.getState()` (4认同)
  • 你如何知道生产中的“yourApp”名称? (2认同)

Sea*_*ira 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)
Run Code Online (Sandbox Code Playgroud)

或者,您可以将日志记录更改为仅附加到全局数组(您的window._redux),并在需要有关特定状态的信息时查看数组.


tho*_*ris 13

推荐的解决方案对我不起作用。

正确的命令是:

$r.props.store.getState()
Run Code Online (Sandbox Code Playgroud)

  • 它应该是对这些答案的评论 (4认同)
  • 现在不起作用 (2认同)

Jam*_*son 7

另一个答案建议将商店添加到窗口中,但如果您只想将商店作为对象访问,则可以在窗口上定义一个 getter。

需要在您配置商店的位置添加此代码 - 在我的应用程序中,这与<Provider store={store} />调用的文件相同。

现在,您可以reduxStore在控制台中键入以获取对象 - 并将copy(reduxStore)其复制到剪贴板。

  Object.defineProperty(window, 'reduxStore', {
    get() {
      return store.getState();
    },
  });
Run Code Online (Sandbox Code Playgroud)

您可以将其包装在 an 中if (process.env.NODE_ENV === 'development')以在生产中禁用它。


Sat*_*pta 6

如果您使用Next JS,您可以通过以下方式访问商店:window.__NEXT_REDUX_STORE__.getState()

您也可以调度操作,只需查看您拥有的选项window.__NEXT_REDUX_STORE__