我希望能够找出与特定DOM元素相关联的React组件。
例如,假设我有一个div,在整个应用程序中使用React进行渲染。这个div必须由一个React组件进行渲染 - 但是它是哪一个呢?
我知道React提供了方法“getDOMNode”来获取与React组件关联的DOM节点,但是我想做相反的事情。
这可能吗?
我希望能够找出与特定DOM元素相关联的React组件。
例如,假设我有一个div,在整个应用程序中使用React进行渲染。这个div必须由一个React组件进行渲染 - 但是它是哪一个呢?
我知道React提供了方法“getDOMNode”来获取与React组件关联的DOM节点,但是我想做相反的事情。
这可能吗?
在React中,一个核心概念是你实际上没有DOM中的控制权。相反,你的控制是工厂函数。DOM中的内容是控制的当前渲染。
如果你真的需要这个功能,你可以将一个对象保留为全局变量,其键是工厂函数名称的字符串表示形式,值是工厂函数。然后在可呈现的div上,保留包含工厂函数名称的属性。
但很可能这是XY问题(需要X,看到了Y的方法,然后问如何执行Y)。如果您解释清楚您的目标,可能有更好的方法更适合React的自上而下的概念模型。
一般来说,要求从渲染中访问控件就像要求从缓存的PNG渲染中访问SVG一样。这是可能的,但通常是其他概念性错误的红旗。
以下是我在使用 React 15.3.0 时所使用的内容:
window.FindReact = function(dom) {
for (var key in dom) {
if (key.startsWith("__reactInternalInstance$")) {
var compInternals = dom[key]._currentElement;
var compWrapper = compInternals._owner;
var comp = compWrapper._instance;
return comp;
}
}
return null;
};
然后使用它:
var someElement = document.getElementById("someElement");
FindReact(someElement).setState({test1: test2});
fiber
的发布而破裂。在React这样频繁更改的库中使用未记录的内部可能是不明智的。 - John Haugeland.trigger('custom_event', data)
结合使用非常棒,并在componentDidMount
中监听该自定义事件。 - Ross The Boss