我有自己的单元测试reducers
。但是,当我在浏览器中调试时,我想检查我的动作是否已正确调用以及状态是否已相应修改。
我正在寻找类似的东西:
window._redux.store
...在浏览器中,这样我就可以在控制台上键入该信息并检查运行情况。
我该如何实现?
我有自己的单元测试reducers
。但是,当我在浏览器中调试时,我想检查我的动作是否已正确调用以及状态是否已相应修改。
我正在寻找类似的东西:
window._redux.store
...在浏览器中,这样我就可以在控制台上键入该信息并检查运行情况。
我该如何实现?
Answers:
自从我最初回答以来,react devtools已经更改。components
chrome devtools中的新标签仍然包含数据,但您可能需要搜索更多内容。
Components
标签store
中显示store
(对我来说这是第4级)$r.store.getState()
如果您正在运行React开发人员工具$r.store.getState();
,则无需更改代码库即可使用。
注意:您必须先在开发人员工具窗口中打开react devtool才能进行此工作,否则会出现$r is not defined
错误
$r.store.getState();
或$r.store.dispatch({type:"MY_ACTION"})
$r.state.store.getState()
$r
指Components
“开发工具”部分中的当前选定组件。我似乎无法访问整个store
through $r
,也许是因为我在各处都使用钩子,但是我看到了我的组件可以看到的存储部分,它几乎一样好,有时甚至更多。点!
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()
适用于那些组件useSelector
... Ob。,YMMV取决于您使用的钩子...
$r.props.store
let store = createStore(yourApp);
window.store = store;
现在,您可以从控制台中的window.store访问商店,如下所示:
window.store.dispatch({type:"MY_ACTION"})
window.store.getState()
您可以按照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
),并且在需要有关特定状态的信息时可以查看该数组。
如果您想查看存储状态以进行调试,可以执行以下操作:
#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)
另一个答案建议将商店添加到窗口中,但是如果您只想将商店作为对象访问,则可以在窗口上定义吸气剂。
此代码需要添加到您配置商店的位置-在我的应用中,该文件与<Provider store={store} />
调用位置的文件相同。
现在,您可以reduxStore
在控制台中键入以获取对象-并将copy(reduxStore)
其复制到剪贴板。
Object.defineProperty(window, 'reduxStore', {
get() {
return store.getState();
},
});
您可以将其包装在中if (process.env.NODE_ENV === 'development')
以在生产中禁用它。
LogMonitor
可视化你的行动和结果状态。