【问题标题】:How can I access a hover state in reactjs?如何在 reactjs 中访问悬停状态?
【发布时间】:2015-11-14 12:51:59
【问题描述】:

我与一群篮球队有一个sidenav。因此,当其中一个团队悬停时,我想为每个团队显示不同的东西。另外,我正在使用 Reactjs,所以如果我可以有一个变量,我可以将它传递给另一个很棒的组件。

【问题讨论】:

标签: hover reactjs


【解决方案1】:

React 组件在其顶级接口中公开所有标准的 Javascript 鼠标事件。当然,您仍然可以在 CSS 中使用:hover,这可能足以满足您的某些需求,但对于由悬停触发的更高级的行为,您需要使用 Javascript。因此,要管理悬停交互,您需要使用onMouseEnteronMouseLeave。然后将它们附加到组件中的处理程序,如下所示:

<ReactComponent
    onMouseEnter={() => this.someHandler}
    onMouseLeave={() => this.someOtherHandler}
/>

然后,您将使用 state/props 的某种组合将更改的状态或属性传递给您的子 React 组件。

【讨论】:

  • 好的,我认为这会奏效。让我测试一下。另外,如何将此变量传递给不同/未连接的组件?
  • 这实际上变得很棘手,React 并没有完全提供这一点。在 Web 应用程序的架构中,这涉及到所选择的全局、总体通信方法。许多人会选择事件总线类型的解决方案,其中一些全局事件管理器在不同的组件中发布和接收事件。这些事件消息将包含您要作为参数传递的数据。这是 Facebook 在他们的文档中关于该主题的建议:facebook.github.io/react/tips/…
  • 我想补充一点,onMouseEnteronMouseLeave 是 DOM 事件。它们不适用于自定义ReactComponent,您需要将事件作为道具传递并将这些事件绑定到该ReactComponent 中的DOM 元素,例如&lt;div onMouseOver={ () =&gt; this.props.onMouseOver }&gt;
  • github.com/cht8687/react-hover 可以轻松完成这项工作
【解决方案2】:

ReactJs 为鼠标事件定义了以下合成事件:

onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp

如您所见,没有悬停事件,因为浏览器本身并没有定义悬停事件。

您需要为 onMouseEnter 和 onMouseLeave 添加处理程序以实现悬停行为。

ReactJS Docs - Events

【讨论】:

    【解决方案3】:

    为了获得悬停效果,你可以简单地试试这个代码

    import React from "react";
      import "./styles.css";
    
        export default function App() {
    
          function MouseOver(event) {
            event.target.style.background = 'red';
          }
          function MouseOut(event){
            event.target.style.background="";
          }
          return (
            <div className="App">
              <button onMouseOver={MouseOver} onMouseOut={MouseOut}>Hover over me!</button>
            </div>
          );
        }
    

    或者如果你想使用 useState() 钩子来处理这种情况,那么你可以试试这段代码

    import React from "react";
    import "./styles.css";
    
    
    export default function App() {
       let [over,setOver]=React.useState(false);
    
       let buttonstyle={
        backgroundColor:''
      }
    
      if(over){
        buttonstyle.backgroundColor="green";
      }
      else{
        buttonstyle.backgroundColor='';
      }
    
      return (
        <div className="App">
          <button style={buttonstyle}
          onMouseOver={()=>setOver(true)} 
          onMouseOut={()=>setOver(false)}
          >Hover over me!</button>
        </div>
      );
    }
    

    以上代码都可以实现悬停效果,但第一个过程更容易编写和理解

    【讨论】:

      【解决方案4】:

      我知道接受的答案很好,但对于任何正在寻找悬停感觉的人来说,您可以在mouseover 上使用setTimeout 并将句柄保存在地图中(比如说列表ID 到setTimeout 句柄)。在mouseover 上清除 setTimeout 中的句柄并将其从地图中删除

      onMouseOver={() => this.onMouseOver(someId)}
      onMouseOut={() => this.onMouseOut(someId)
      

      并按如下方式实现地图:

      onMouseOver(listId: string) {
        this.setState({
          ... // whatever
        });
      
        const handle = setTimeout(() => {
          scrollPreviewToComponentId(listId);
        }, 1000); // Replace 1000ms with any time you feel is good enough for your hover action
        this.hoverHandleMap[listId] = handle;
      }
      
      onMouseOut(listId: string) {
        this.setState({
          ... // whatever
        });
      
        const handle = this.hoverHandleMap[listId];
        clearTimeout(handle);
        delete this.hoverHandleMap[listId];
      }
      

      地图就是这样,

      hoverHandleMap: { [listId: string]: NodeJS.Timeout } = {};
      

      我更喜欢onMouseOveronMouseOut,因为它也适用于HTMLElement 中的所有孩子。如果不需要,您可以分别使用onMouseEnteronMouseLeave

      【讨论】:

        【解决方案5】:

        您可以使用上面 stolli 和 BentOnCoding 建议的那些事件来实现自己的组件逻辑,或者使用名为 react-hover 的模块

        如果我可以有一个变量,我可以将它传递给另一个很棒的组件。

        那么你可以简单地包装另一个组件

         <ReactHover options={optionsCursorTrueWithMargin}>
          <Trigger type="trigger">
            <TriggerComponent />
          </Trigger>
          <Hover type="hover">
            <HoverComponent />
          </Hover>
        </ReactHover>
        

        或您的纯 HTML:

        <ReactHover options={optionsCursorTrueWithMargin}>
          <Trigger type="trigger">
            <h1 style={{ background: '#abbcf1', width: '200px' }}> Hover on me </h1>
          </Trigger>
          <Hover type="hover">
            <h1> I am hover HTML </h1>
          </Hover>
        </ReactHover>
        

        这里的演示代码:demo

        【讨论】:

          【解决方案6】:

          这对 OP 不起作用,因为他们想要一个变量,但对于那些只想要 UI 悬停效果的人来说,坚持使用 CSS 通常更容易。

          以下示例将在将鼠标悬停在某个项目上时显示一个删除按钮:

          <div className="revealer">
            <div>
              {itemName}
            </div>
            <div className="hidden">
              <Btn label="Delete"/>
            </div>
          </div>
          
          
          .hidden {
            display: none;
          }
          
          .revealer:hover .hidden {
            display: block;
          }
          

          父 div 有 revealer 类。当它悬停在上面时,它会显示hidden div。隐藏的 div 必须嵌套在显示器 div 中。

          【讨论】:

            猜你喜欢
            • 2016-10-10
            • 1970-01-01
            • 2018-11-07
            • 1970-01-01
            • 2020-03-04
            • 1970-01-01
            • 2012-09-19
            • 2023-03-03
            相关资源
            最近更新 更多