【发布时间】:2019-05-19 20:03:10
【问题描述】:
我正在尝试为单击其空间之外的关闭元素构建一个通用 HOC(外部解决方案的通用关闭)。
在我看来,这可以通过 forwardRef 和 HOC 实现来实现,虽然官方文档中有一个示例,但我似乎无法正确理解。
所以我希望我的 HOC 创建对组件容器的引用。它是包装的,因为它有处理程序来跟踪点击并对其采取行动。例如,假设我们有一个通用的 Dropdown 组件,人们会期望我可以在该组件区域外的任何单击时关闭它。
我目前拥有的代码:
import React from 'react';
function withClose(Component) {
class ClickContainer extends React.Component {
constructor() {
super();
this.handleClose = this.handleClose.bind(this);
}
componentDidMount() {
document.addEventListener('click', this.handleClose);
}
componentWillUnmount() {
document.removeEventListener('click', this.handleClose);
}
handleClose(e) {
// I expect having here context of container of wrapped component to do something like
const { forwardedRef } = this.props; // <- I expect having context in forwardedRef variable
}
render() {
const { forwardedRef, ...rest } = this.props;
return <Component ref={forwardedRef} {...rest} />;
}
}
return React.forwardRef((props, ref) => {
return <ClickContainer {...props} forwardedRef={ref} />;
});
}
export default withClose;
我在这里缺少什么?我不能让它工作,我只得到包装组件的上下文而不是元素本身。
非常感谢!
【问题讨论】:
-
什么是
this.containerRef?您需要将this.props.forwardedRef传递给元素 -
@Orar 是的,对不起,这只是我尝试过的东西,我把它改成了正确的代码......
标签: javascript reactjs higher-order-components