Example is a functional component in which I am rendering a div conditionally. I want this div to fade-in when rendered conditionally and fade-out vice versa.
For that, I have maintained two local state variables: render and fadeIn which are computed based on show prop passed down to the Example component.
What I've done is:
- When showprop it true, I setrenderas true, so thedivrenders conditionally and after a timeout of10msI setfadeInas true which will set CSS classname for my div asshow.
- When showprop it false, I setfadeInas false, which will set CSS classname for my div ashideand after a timeout of200ms(transition time in CSS) I setrenderas false so thedivis hidden conditionally.
Code:
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>
  );
};
Stylesheet:
.container {
  width: 100px;
  height: 100px;
  background-color: black;
  transition: opacity 0.2s ease;
}
.show {
  opacity: 1;
}
.hide {
  opacity: 0;
}
I believe this is not a good coding practice to achieve the functionality and should maintain only one local state in my component. I need your suggestions on how I can solve this in a better way without using any 3rd Party Library. Thanks :)
 
     
     
    