您如何在控制台中检查反应元素的道具和状态?

Posted

技术标签:

【中文标题】您如何在控制台中检查反应元素的道具和状态?【英文标题】:How do you inspect a react element's props & state in the console? 【发布时间】:2015-05-23 04:25:32 【问题描述】:

React Developer Tools 提供了很多功能来检查 React 组件树,并查看道具、事件处理程序等。但是,我真正想做的是能够在浏览器中检查这些数据结构控制台。

在 chrome 中,我可以使用 $0 在控制台中使用当前选定的 DOM 元素。有没有办法从 $0 中提取 React 组件信息,或者是否可以使用 React 开发工具做类似的事情?

【问题讨论】:

为什么不直接在组件中记录状态和道具? 因为这需要更多时间 我自己还没有尝试过,但是在 React 0.13 中他们引入了React. findDOMNode。从理论上讲,可以选择您的 DOM 元素,通过 React.findDOMNode($0) 将其转换为 React 元素并通过该 ReactElement 访问您的状态和道具? @trekforever 它只返回相同的原生 DOM 节点。 考虑到这个问题是先问的,新问题不会是重复的吗? 【参考方案1】:

您可以像这样附加对窗口对象的引用

import  useSelector  from "react-redux";
function App() 

    // Development only
    window.store = useSelector((state) => state);

    return (
        <div className="App">
        </div>
    );


export default App;

然后从控制台访问它

store
states: …
states:
someProperty: false
[[Prototype]]: Object
[[Prototype]]: Object

[控制台][1] [1]:https://i.stack.imgur.com/A4agJ.png

【讨论】:

【参考方案2】:

虽然接受的答案有效,而且是一个很好的方法,但在 2020 年,您现在可以在不使用 $r 方法的情况下进行大量检查。 React DevTools 的 Components 选项卡将在您选择相关组件时显示道具和详细状态(确保您处于正确的级别),并允许您执行其他操作,例如暂停它或检查匹配的 DOM 元素(很少右上角的图标)。

【讨论】:

【参考方案3】:

打开控制台(Firefox、Chrome)并找到任何 reactjs 渲染的 DOM 元素,或者执行 js 脚本来定位它:

document.getElementById('ROOT')

然后在对象属性查看器中检查元素属性以查找名称以“__reactInternalInstace$....”开头的属性展开 _DebugOwner 并查看 stateNode。

找到的 stateNode 将包含(如果有的话)'state' 和 'props' 属性,这些属性在 reactjs 应用程序中被大量使用。

【讨论】:

【参考方案4】:

使用React Developer Tools,您可以使用$r 获取对选定React 组件的引用。

以下屏幕截图显示我使用React Developer Tools 选择一个组件(Explorer),该组件具有一个名为nodeList 的状态对象。在控制台中,我现在可以简单地编写$r.state.nodeList 来引用状态中的这个对象。同样适用于道具(例如:$r.props.path

【讨论】:

看起来 $ri 只是 DOM 节点,而不是 react 组件实例。 不确定你的意思。但问题是“如何检查反应组件的数据结构”。我认为$r 可以让你做到这一点。【参考方案5】:

将状态或道具对象分配给窗口对象:

window.title = this.state.title

然后从开发工具控制台中,您可以在暴露的对象上尝试不同的方法,例如:

window.title.length

8

【讨论】:

是的,纯粹是为了调试,比如:window.reacjs = React; window.reacjsStore = 商店;【参考方案6】:

您的问题的答案可以在我问的类似问题中找到: React - getting a component from a DOM element for debugging

我在这里提供答案是因为我没有必要的信誉点来标记为重复或在上面发表评论。

基本上,如果您使用 react 的开发版本,这是可能的,因为您可以利用 TestUtils 来实现您的目标。

你只需要做两件事:

静态存储从 React.render() 获得的根级组件。 创建一个全局调试辅助函数,您可以在控制台中使用 $0 访问您的静态组件。

所以控制台中的代码可能类似于:

> getComponent($0).props

getComponent 的实现可以使用React.addons.TestUtils.findAllInRenderedTree 在所有找到的组件上调用getDOMNode 并与传入的元素匹配来搜索匹配。

【讨论】:

以上是关于您如何在控制台中检查反应元素的道具和状态?的主要内容,如果未能解决你的问题,请参考以下文章

列表项没有正确删除(反应)

反应孩子正在通过道具改变父母状态......我不清楚原因

如何解构道具

对某些案例问题做出反应警告计算匹配?

将所有状态和道具传递给孩子们反应

反应简单代码错误:目标容器不是DOM元素