【问题标题】:React, onMouseEnter event trigger all items instead of one hovered?React,onMouseEnter 事件触发所有项目而不是一个悬停?
【发布时间】:2021-06-12 06:36:45
【问题描述】:

我现在有两张卡片,当我将鼠标悬停在一张卡片上时,它会在所有两张卡片上触发悬停 (onMouseEnter) 这是我的解决方案

import React, { useState } from "react";

const Buttons = () => {

  const [isShown, setIsShown] = useState(false);

  return (
    <div>
      <div
        onMouseEnter={() => setIsShown(true)}
        onMouseLeave={() => setIsShown(false)}
        className="wrapper-btn"
      >
        {isShown && <button> test 1 </button>}
      </div>
      <div
        onMouseEnter={() => setIsShown(true)}
        onMouseLeave={() => setIsShown(false)}
        className="wrapper-btn"
      >
        {isShown && <button> test 2 </button>}
      </div>
    </div>
  );
};

export default Buttons;

这里有什么问题?

【问题讨论】:

    标签: javascript reactjs react-hooks jsx


    【解决方案1】:

    两者共享相同的状态,您可以将代码抽象到另一个组件中,每个组件都有一个独立的状态:

    import React, { useState } from "react";
    
    const Buttons = () => {
      return (
        <div>
          <ButtonDisplay btnContent='test 1' />
          <ButtonDisplay btnContent='test 2' />
        </div>
      );
    };
    
    export default Buttons;
    
    const ButtonDisplay = ({ btnContent }) => {
      const [isShown, setIsShown] = useState(false);
    
      return (
        <div
          onMouseEnter={() => setIsShown(true)}
          onMouseLeave={() => setIsShown(false)}
          className="wrapper-btn"
        >
          {isShown && <button> { btnContent } </button>}
        </div>
    )}
    

    这将是我将采用的方法,因为它可以让您的代码保持干燥。

    可能的其他方法会将isShown 状态更改为跟踪每个按钮isShown 状态的数组,其中onMouseEnter|Leave 将更新该数组的特定索引并从该数组读取,因此您将呈现基于按钮根据您所在州的索引中的特定值。或者您可以为每个按钮创建一个状态,当您有多个按钮时,这将是最不理想的。

    【讨论】:

    • 这是最好的解决方案还是有比这更好的方法?因为假设我以后会有 10 张卡片,
    • 这将是我保持干燥的方法。如果您需要,我还指出了其他选项。
    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多