【发布时间】:2014-08-19 04:54:31
【问题描述】:
我希望能够弄清楚哪个 React 组件与某个 DOM 元素相关联。
例如,假设我有一个 div,并且我正在使用 React 渲染我的整个应用程序。 div 必须由 React 组件呈现 - 但是哪个?
我知道 React 提供方法“getDOMNode”来获取与 React 组件关联的 DOM 节点,但我想做相反的事情。
这可能吗?
【问题讨论】:
标签: javascript dom reactjs
我希望能够弄清楚哪个 React 组件与某个 DOM 元素相关联。
例如,假设我有一个 div,并且我正在使用 React 渲染我的整个应用程序。 div 必须由 React 组件呈现 - 但是哪个?
我知道 React 提供方法“getDOMNode”来获取与 React 组件关联的 DOM 节点,但我想做相反的事情。
这可能吗?
【问题讨论】:
标签: javascript dom reactjs
没有。
React 的一个核心概念是您实际上在 DOM 中没有控件。相反,您的控制是工厂功能。 DOM 中的内容是控件的当前渲染。
如果你真的需要这个,你可以把一个对象作为一个全局变量,它的键是工厂函数名称的字符串表示,它的值是工厂函数,然后在你的可渲染div上,保留一个包含的属性工厂函数的名称。
但这很可能是 XY 问题的问题(需要 X,与 Y 一起寻找方法,然后询问如何做 Y。)如果你解释你的目标,可能会有更好的方法更适合 React 的顶部-下概念模型。
一般来说,请求从其渲染中访问控件就像请求从其缓存的 PNG 渲染中访问 SVG。这是可能的,但它通常是一个危险信号,表明其他东西在概念上是错误的。
【讨论】:
如果您的情况需要从 DOM 节点获取 react 元素,这里有一种方法,“通过事件通信并回调”
您应该在 DOM 元素上触发一个自定义事件,并在 React 组件中为该自定义事件设置事件监听器。这会将 DOM 元素映射回反应组件。
【讨论】:
.trigger('custom_event', data) 并在 componentDidMount 中监听该 custom_event,这真是太棒了。
这是我在 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});
【讨论】:
null)。虽然我使用的是带有 react-rails 的 React 15.3.0——也许这就是原因。
fiber 的发布而中断。在像 React 一样频繁更改的库中使用未记录的内部结构可能是不明智的