【发布时间】:2015-11-02 09:15:00
【问题描述】:
我想在子组件中获取父组件名称,以便在验证该子组件的属性时显示错误消息。 我正在创建一个可重用的组件,所以任何人都可以在他们的组件中使用我的组件。当他们使用我的组件时,我想显示带有父组件名称的警告消息。
是否有特定方法可以在反应中获取父名称。任何形式的帮助将不胜感激。
【问题讨论】:
标签: reactjs
我想在子组件中获取父组件名称,以便在验证该子组件的属性时显示错误消息。 我正在创建一个可重用的组件,所以任何人都可以在他们的组件中使用我的组件。当他们使用我的组件时,我想显示带有父组件名称的警告消息。
是否有特定方法可以在反应中获取父名称。任何形式的帮助将不胜感激。
【问题讨论】:
标签: reactjs
孩子们可以通过以下方式看到他们组成的上下文:
this._reactInternalInstance._currentElement._owner._instance.__proto__.constructor.name
例如:
import React, { Component } from 'react';
class Warning extends Component {
render() {
return (
<div>{
"WARNING: " + this._reactInternalInstance._currentElement._owner._instance.__proto__.constructor.name + " has an error."
}</div>
);
}
}
export default Warning;
不要相信这是亲子交流。这就像站在一个房间里,从你所在的地方看到围墙。这不是与您(子)通信的容器(父),而是与上下文相关的子。
如果你必须使用它,但请注意它是 React 内部实例的一部分并且可能会发生变化(请相信它在今天已经足够稳定了)。
【讨论】:
this._reactInternalInstance._currentElement._owner.getName()
你可以从this._reactInternalFiber._debugOwner.type.name获取父组件
【讨论】:
您可以使用以下方式访问组件的父节点:
this._reactInternalFiber.return.stateNode
【讨论】:
使用react@^17.0.1,这在调试模式下对我有用:
const parentName = this._reactInternals?._debugOwner?.elementType?.name;
如果您使用的是其他版本的 react,您可以尝试使用 console.log(this) 并在对象中导航,直到找到您想要的。
【讨论】:
如果你使用Functional Components(在 React 16+ 中),你可以通过这种方式访问父级:
React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner.return.type
而且你可以在嵌套对象中继续往前击中每个祖先。
注意:使用道具当然是正确的方法。但是,可能会有一些调试用例(或全局插件?)来执行此操作。例如
why-did-you-render使用这种方法here。
【讨论】:
我正在使用带有功能组件的 React 18,ReactCurrentOwner 对我来说是 null。相反,我使用了:
const stack = React["__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED"].ReactDebugCurrentFrame.getCurrentStack()
在我的组件渲染函数内部(实际上在我的自定义钩子内部),它捕获了该组件的完整堆栈跟踪。对于调试哪些组件触发了某些操作非常有用,因为事件处理程序可以引用stack function-local var。
【讨论】: