reactjs - 在悬停时为从数组呈现的列表项呈现单个图标

aro*_*llo 2 javascript css hover reactjs

我有这种从对象数组呈现的卡片。

父组件:

[{foo: 'bar', baz: [{ name: string, path: string: '/'}]

state = {isHovering: false}

handleMouseHover = () => {
    const { isHovering } = this.state;
    this.setState({ isHovering: !isHovering });
}
Run Code Online (Sandbox Code Playgroud)

;

我传递下来handleMouseHover(),并isHovering辞去道具子组件。

结果是这样的:

子组件

<LinkContainer
  onMouseEnter={handleMouseHover}
  onMouseLeave={handleMouseHover}
  className="linkContainer"
>

 {isHovering && (
   <FontAwesomeIcon
     icon="copy"
     className="copyIcon"
     onClick={copyToClipboard}
   />
 )}
Run Code Online (Sandbox Code Playgroud)

结果是包含 3 个链接的 4 张卡片。每次我将鼠标悬停在链接上时,我都希望显示复制到剪贴板图标。然而,在那一刻,我将鼠标悬停在任何项目将其设置isHoveringtrue从而使所有的图标可见。理想情况下,我只希望我悬停在其上的链接图标变得可见。有人可以帮助我找出更好的解决方案或改进我已经编写的代码。

非常感激!

Tho*_*lle 9

您可以将一个对象保持在您的状态而不是布尔值,它有一个键,指示以该特定键作为索引的对象是否悬停。

例子

class App extends React.Component {
  state = {
    arr: [{ text: "foo" }, { text: "bar" }],
    isHovered: {}
  };

  handleMouseEnter = index => {
    this.setState(prevState => {
      return { isHovered: { ...prevState.isHovered, [index]: true } };
    });
  };

  handleMouseLeave = index => {
    this.setState(prevState => {
      return { isHovered: { ...prevState.isHovered, [index]: false } };
    });
  };

  render() {
    const { arr, isHovered } = this.state;

    return (
      <div>
        {arr.map((el, index) => (
          <Child
            onMouseEnter={() => this.handleMouseEnter(index)}
            onMouseLeave={() => this.handleMouseLeave(index)}
            text={el.text}
            isHovering={isHovered[index]}
            key={index}
          />
        ))}
      </div>
    );
  }
}

function Child({ onMouseEnter, onMouseLeave, text, isHovering }) {
  return (
    <div onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
      {text} {isHovering && " (hovering!)"}
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>
Run Code Online (Sandbox Code Playgroud)