Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React高阶组件,用于检测将功能组件作为参数的dom事件_Reactjs_Higher Order Components - Fatal编程技术网

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');