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

Posted

技术标签:

【中文标题】调试时,我可以从浏览器控制台访问 Redux 存储吗?【英文标题】:While debugging, can I have access to the Redux store from the browser console? 【发布时间】:2016-03-26 05:11:04 【问题描述】:

我的reducers 有单元测试。但是,当我在浏览器中调试时,我想检查我的操作是否已正确调用以及状态是否已相应修改。

我正在寻找类似的东西:

window._redux.store

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

我怎样才能做到这一点?

【问题讨论】:

附带说明,您可以考虑使用Redux Devtools 和the LogMonitor 来可视化您的操作和结果状态。 谈到安全性,在生产构建模式下,是否可以从浏览器控制台读取存储? @JRichardsz ***.com/questions/43507052/… 【参考方案1】:

如何在任何网站上查看 redux 存储,无需更改代码

2019 年 11 月更新

自我最初的回答以来,react devtools 发生了变化。 chrome 的 devtools 中的新 components 选项卡仍有数据,但您可能需要多搜索一些。

    打开 chrome devTools 选择 react devtool 的 Components 选项卡 单击最顶部的节点并在右侧列中查找要显示的store 在树中重复第 3 步,直到找到 store(对我来说是第 4 级) 现在您可以使用$r.store.getState() 执行以下步骤

原答案

如果您正在运行 react 开发人员工具,则可以使用 $r.store.getState();您的代码库无需更改

注意:你必须先在你的开发者工具窗口中打开 react devtool 才能使这个工作,否则你会得到一个$r is not defined 错误

    打开开发者工具 点击 React 选项卡 确保选择了提供者节点(或最顶层节点) 然后在控制台中输入$r.store.getState();$r.store.dispatch(type:"MY_ACTION")

【讨论】:

注意:为此,您需要将state 作为属性存储在根组件上。如果您关注the directions 并将<Provider> 作为***组件,这将正常工作。只是移动它被咬了! 试试$r.state.store.getState() 看起来$r 指的是开发工具的Components 部分中当前选定的组件。我似乎无法通过$r 访问整个store,可能是因为我到处都在使用钩子,但是我可以看到我的组件可以看到的商店部分,这几乎一样好,有时更重要! $r.hooks[0].subHooks[0].subHooks[0].value.store.getState() 适用于useSelector... Ob., YMMV 取决于您使用的钩子的那些组件... 我不得不使用$r.props.store【参考方案2】:

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

现在您可以像这样从控制台中的 window.store 访问商店:

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

【讨论】:

也可以访问状态:window.store.getState() 你怎么知道yourApp在生产中的名字?【参考方案3】:

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

正确的命令是:

$r.props.store.getState()

【讨论】:

应该是对这些答案的评论【参考方案4】:

您可以使用日志中间件as described in the 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),当您需要特定状态的信息时,您可以查看数组。

【讨论】:

或者更好的是,使用像redux-logger这样的库 如果您要像这样导入减速器:从 './reducers/' 导入减速器,那么您可以使用 let store = createStoreWithMiddleware(reducers) 作为 './reducers/' 文件通常会里面有 combineReducers。【参考方案5】:

如果您使用的是Next JS,则可以通过以下方式访问商店:window.__NEXT_REDUX_STORE__.getState()您还可以调度操作,只需查看您在 window.__NEXT_REDUX_STORE__ 中的选项即可

【讨论】:

【参考方案6】:

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

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

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

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

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

【讨论】:

【参考方案7】:

如果您想查看存储状态以进行调试,您可以这样做:

#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)

【讨论】:

【参考方案8】:

使用 react 开发者工具:

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

【讨论】:

给出Uncaught TypeError: Cannot read property 'values' of undefined 错误【参考方案9】:

首先,你需要在window对象中定义store(你可以把它放在你的configureStore文件中):

window.store = store;

那么你只需要在控制台中写下以下内容:

window.store.getState();

这有帮助。

【讨论】:

store 默认在控制台中是未定义的。它是如何到达那里的? Store 需要先在 window 对象中定义才能使用。 @RafaelRozon 是的,你是对的,我已经编辑了我的答案以表明这一点。

以上是关于调试时,我可以从浏览器控制台访问 Redux 存储吗?的主要内容,如果未能解决你的问题,请参考以下文章

P06:Chrome插件 Redux-DevTools 用来调试Redux数据

为啥 redux 只在浏览器刷新时更新?

从 redux-saga 函数访问 React 上下文值

使用 next-redux-wrapper 时访问 React 外部的 Redux 存储

从 Chrome 远程调试协议访问 JavaScript 变量

如何从插件访问 Eclipse Java 调试器?