欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

React JS:如何動畫化有條件渲染的組件?

錢斌斌2年前8瀏覽0評論

示例是一個功能組件,我在其中有條件地呈現(xiàn)一個div。我希望這個div在有條件渲染時淡入,反之亦然。

為此,我維護(hù)了兩個本地狀態(tài)變量:render和fadeIn,它們是基于傳遞給示例組件的show prop計算的。

我所做的是:

當(dāng)show prop it true時,我將render設(shè)置為true,因此div有條件地呈現(xiàn),在10毫秒的超時后,我將fadeIn設(shè)置為true,這將為我的div設(shè)置CSS classname作為show。 當(dāng)show prop it false時,我將fadeIn設(shè)置為false,這將把我的div的CSS classname設(shè)置為hide,在超時200 ms(CSS中的過渡時間)后,我將render設(shè)置為false,以便有條件地隱藏div。 代碼:

interface Props {
  show: boolean;
}

const Example: React.FC<Props> = ({ show, }) => {
  const [render, setRender] = useState(false);
  const [fadeIn, setFadeIn] = useState(false);

  useEffect(() => {
    if (show) {
      // render component conditionally
      setRender(show);

      // change state to for conditional CSS classname which will
      // animate opacity, I had to give a timeout of 10ms else the
      // component shows up abruptly
      setTimeout(() => {
        setFadeIn(show);
      }, 10);
    } else {
      // change state to change component classname for opacity animation
      setFadeIn(false);

      // hide component conditionally after 200 ms
      // because that's the transition time in CSS
      setTimeout(() => {
        setRender(false);
      }, 200);
    }
  }, [
    show,
  ]);

  return (
    <div>
      {render && (
        <div className={`container ${fadeIn ? 'show' : 'hide'}`} />
      )}
    </div>
  );
};

樣式表:

.container {
  width: 100px;
  height: 100px;
  background-color: black;
  transition: opacity 0.2s ease;
}

.show {
  opacity: 1;
}

.hide {
  opacity: 0;
}

我認(rèn)為這不是實現(xiàn)該功能的好的編碼實踐,應(yīng)該在我的組件中只維護(hù)一個本地狀態(tài)。我需要你的建議,告訴我如何在不使用任何第三方庫的情況下更好地解決這個問題。 謝謝:)

Css:

.render {
  ...,
  visibility: hidden;
  opacity: 0;
  transition: all 0.6s ease;
}

.show {
  visibility: visible;
  opacity: 1;
}

希望有幫助。

實際上,這種情況有一個HTML屬性,叫做onAnimationEnd或onAnimationStart。

示例:

export default function App() {
  const [isMounted, setIsMounted] = useState(false);
  const [showDiv, setShowDiv] = useState(false);
  return (
    <div className="App">
      <button onClick={() => {
        setIsMounted(!isMounted)
        if (!showDiv) setShowDiv(true); //We should Render our Div
      }
      }>Show/Hide</button>

      { //Conditional Rendering
        showDiv && <div
        className="transitionDiv"
        style={isMounted ? mountedStyle : unmountedStyle}
        onAnimationEnd={() => { if (!isMounted) setShowDiv(false) }}
      ></div>}
    </div>
  );
}

更多信息可以在這篇文章中找到