Reactjs React高阶组件,用于检测将功能组件作为参数的dom事件
我有一个场景,我想创建一个检测鼠标事件(例如,Reactjs React高阶组件,用于检测将功能组件作为参数的dom事件,reactjs,higher-order-components,Reactjs,Higher Order Components,我有一个场景,我想创建一个检测鼠标事件(例如,mouseenter,mouseleave)的HOC,当它们发生在HOC的WrappedComponent上时,然后将WrappedComponent传递给一个特殊的道具(例如,Component)。我通过使用ref回调获取包装的组件实例,然后在我的HOC中向包装的实例添加事件侦听器,实现了这一点 import React,{Component}来自“React” 从“react dom”导入react dom 导出默认值(WrappedCompo
mouseenter
,mouseleave
)的HOC,当它们发生在HOC的WrappedComponent
上时,然后将WrappedComponent
传递给一个特殊的道具(例如,Component
)。我通过使用ref
回调获取包装的组件实例,然后在我的HOC中向包装的实例添加事件侦听器,实现了这一点
import React,{Component}来自“React”
从“react dom”导入react dom
导出默认值(WrappedComponent)=>{
返回类DetectOver扩展组件{
建造师(道具){
超级(道具)
this.handleMouseEnter=this.handleMouseEnter.bind(this)
this.handleMouseLeave=this.handleMouseLeave.bind(this)
this.bindListeners=this.bindListeners.bind(this)
this.state={componenticsheppered:false}
this.wrappedComponent=null
}
组件将卸载(){
if(此.wrappedComponent){
this.wrappedComponent.removeEventListener('mouseenter',this.HandleMouseCenter)
this.wrappedComponent.removeEventListener('mouseleave',this.handleMouseLeave)
}
}
HandleMouseCenter(){
this.setState({componenticshepped:true})
}
手袋{
this.setState({componenticshepped:false})
}
bindListeners(wrappedComponentInstance){
log('wrappedComponentInstance',wrappedComponentInstance)
如果(!wrappedComponentInstance){
返回
}
this.wrappedComponent=ReactDOM.findDOMNode(wrappedComponentInstance)
this.wrappedComponent.addEventListener('mouseenter',this.HandleMouseCenter)
this.wrappedComponent.addEventListener('mouseleave',this.handleMouseLeave)
}
render(){
const props=Object.assign({},this.props,{ref:this.bindListeners})
返回(
)
}
}
}
您可以将css选择器和所需的特定样式传递给高阶组件,如下所示:
import React, {Component} from 'react';
const Hoverable = (WrappedComponent, wrapperClass = '', hoveredStyle=
{}, unhoveredStyle={}) => {
class HoverableComponent extends Component {
constructor(props) {
super(props);
this.state = {
hovered: false,
}
}
onMouseEnter = () => {
this.setState({hovered: true});
};
onMouseLeave = () => {
this.setState({hovered: false});
};
render() {
return(
<div
className={wrapperClass}
onMouseEnter= { this.onMouseEnter }
onMouseLeave= { this.onMouseLeave }
>
<WrappedComponent
{...this.props}
hovered={this.state.hovered}
/>
</div>
);
}
}
return HoverableComponent;
};
export default Hoverable;
您可以将css选择器和所需的特定样式传递给高阶组件,如下所示:
import React, {Component} from 'react';
const Hoverable = (WrappedComponent, wrapperClass = '', hoveredStyle=
{}, unhoveredStyle={}) => {
class HoverableComponent extends Component {
constructor(props) {
super(props);
this.state = {
hovered: false,
}
}
onMouseEnter = () => {
this.setState({hovered: true});
};
onMouseLeave = () => {
this.setState({hovered: false});
};
render() {
return(
<div
className={wrapperClass}
onMouseEnter= { this.onMouseEnter }
onMouseLeave= { this.onMouseLeave }
>
<WrappedComponent
{...this.props}
hovered={this.state.hovered}
/>
</div>
);
}
}
return HoverableComponent;
};
export default Hoverable;
const HoverableSomeComponent = Hoverable(SomeComponent, 'css-selector');