提问者:小点点

在React中悬停时如何更改类而不使用useState,或者不触发所有元素


当元素(span)处于悬停状态时,我想在React中应用悬停效果,但是当我对多个元素执行此操作并悬停其中一个元素时,所有元素都会被触发。 我想做多个这样的跨度元素,但是当我悬停一个时,所有的元素都在改变。

import React, { useState } from "react";
import { Link } from "react-router-dom";
import { Animated } from "react-animated-css";

// styles
import styles from "./Intro.module.css";

function Intro() {
  const [hovered, setHovered] = useState(false);
  const toggleHover = () => setHovered(!hovered);
  const toggleHover2 = () =>
    setTimeout(() => {
      setHovered(!hovered);
    }, 700);

  return (
    <section className={styles.container}>
      <div className={styles.inner}>
        <span className={styles.hello}>hello,</span>
        <h1 className={styles.title}>
          My name is

          <!-- This bit -->

          <span
            className={hovered ? "animated rubberBand" : ""}
            onMouseEnter={toggleHover}
            onMouseLeave={toggleHover2}
          >
            D
          </span>

        <!-- This bit -->
          mytro Bula
        </h1>
        <h1 className={styles.title}>
          I turn <span className={styles.titleCoffee}>coffee</span> into code
        </h1>
        <p className={styles.para}>
          I'm a <span className={styles.paraRed}>front-end web developer</span>
          <span className={styles.paraBlue}>/designer</span> from Ukraine based
          in London, I love creating beatiful and functional{" "}
          <span className={styles.paraRed}>websites</span>,{" "}
          <span className={styles.paraRed}>applications</span>, and everything
          in between.
        </p>
        <Link to="/Contact" className={styles.btn}>
          Get in touch
        </Link>
      </div>
    </section>
  );
}

export default Intro;

共3个答案

匿名用户

我建议使用CSS的:hover伪类在悬停时更改元素的样式--这样性能更好,而且不太可能导致像您看到的那样的bug。

但是,如果您希望在React中继续执行此操作,则应将span拆分为一个新组件,并将所有hover相关的状态移到该组件中。 此刻,所有元素都有一个“悬停”状态,这就是为什么当其中一个元素悬停时,它们都发生了变化。 通过将setstate放在单独的组件中,并在此intro组件中重用该组件,每个组件都将拥有自己版本的hover。 :)

匿名用户

因此,在React中找到一些东西之前,我想知道如何在HTML/CSS或普通JavaScript中实现这一点。 您可以将HTML看作是一个树状结构。

   ROOT
   /  \
CHILD CHILD

因此,您只需将一个新类应用于相对于您希望应用效果的所有子元素的最顶部元素。

HTML

<div class="add_effect">
  <!-- MY Child Elements that need the effect here -->
</div> 
  

CSS

.add_effect .my_element {
 // Styles here
}

现在要在React中做到这一点,只需将状态提升。

当您的状态被挂起时,当触发悬停时,只需挂接到此状态以在最顶层添加css类。 CSS将负责将样式应用于所有子元素。

匿名用户

只是我的两美分,但你试过,悬停与CSS-->; https://www.w3schools.com/cssref/sel_hover.asp。 它可以在不创建不同状态的情况下完成您需要的工作,但是您可能需要将类添加到跨度中,以便它们能够自行悬停。 例如,您可以在CSS:.span1:Hover{your class changes For the 1st span}.span2:Hover{your class changes For the 2nd one}

如果不是,您将不得不为不同的元素创建不同的状态。 当一个状态用于少数元素时,所有元素都将遵循它,这就是为什么您需要为每个想要与其他元素分离的元素提供一个状态(在您的情况中是span)。

这对你有帮助吗?