【发布时间】:2019-08-19 19:49:17
【问题描述】:
我正在尝试创建一个自定义上下文菜单,当用户右键单击我页面的某个部分时激活该菜单(我希望页面其余部分上的浏览器默认上下文菜单)。
我从父元素调用子元素:
<ContextMenu clickDomain={this.parentRef}>
(当然,在构造函数中我创建了参考:this.parentRef = React.createRef();)。
在子 <ContextMenu> 组件中,我尝试使用传递的 ref 为 contextmenu 事件设置域:
componentDidMount() {
const self = this;
console.log(this.props);
console.log(!!self.props.clickDomain);
console.log(!!self.props.clickDomain.current);
const domain = self.props.clickDomain && self.props.clickDomain.current
? self.props.clickDomain.current : document;
console.log(domain);
domain.addEventListener('contextmenu',
this.openContextMenu(self));
}
(除其他外,openContextMenu 设置状态 visible: true 以及 x 和 y 坐标。)
但!!self.props.clickDomain.current 为假(self.props.clickDomain.current 为空),domain 为document。
所以即使父 ref 不在 DOM 中,子组件已经“挂载”了?
如何将对父组件的实时引用传递给子组件,以便我可以在子组件中在父组件上设置事件侦听器?
【问题讨论】:
-
嘿,如果你要投票给我,请至少在评论中说明原因!
-
你有理由使用
domain.addEventListener('contextmenu')吗?看起来您可以简单地监视父组件上的onClick,设置一个状态,例如将isContext状态设置为true,然后将其传递给<ContextMenu isOpen={this.state.isOpen} />。在ContextMenu.render内,如果this.props.isOpen === true,那么你可以简单地render你的元素。 -
@SungM.Kim,感谢您的支持和回复!您的建议肯定会更直接,但在我看来,组件的可见性是该组件状态的一部分,而不是真正的父状态。我正在尝试使我的上下文菜单组件自包含,因此我可以轻松地重用它,而无需对主机/父级进行大量更改。
标签: javascript reactjs event-handling addeventlistener