'Is it possible to delay Fade's transition?
Goal: I want Fade's transition to happen after a certain time has passed (ex: 4000 milliseconds).
Here is a fragment of my code:
<Fade in timeout={{ enter: 8000 }}>
  <Box display="flex" justifyContent="center">
    <IconButton href="https://soundcloud.com/jyillamusic">
      <Soundcloud />
    </IconButton>
    <IconButton href="https://www.instagram.com/justinyum98/">
      <Instagram />
    </IconButton>
  </Box>
</Fade>
Expected result: With enter: 8000, I expect the transition to happen after 8000 milliseconds.
Actual result: The transition starts at 0 milliseconds, finishes after 8000 milliseconds.
Does Fade support delaying the Fade transition by some specified time?
(Looking at Fade's API, I assumed that duration.enteringScreen meant that it was the amount of milliseconds before the transition occurs, but I'm probably mistaken.)
Solution 1:[1]
Fade does not implement a delay feature, however you can manually handle your transition status using in.
in
Show the component; triggers the enter or exit states
type: boolean
default: false
In code you could do :
<Fade in={this.state.in} timeout={{ enter: 8000 }}>
  <Box display="flex" justifyContent="center">
    <IconButton href="https://soundcloud.com/jyillamusic">
      <Soundcloud />
    </IconButton>
    <IconButton href="https://www.instagram.com/justinyum98/">
      <Instagram />
    </IconButton>
  </Box>
</Fade>
And on display run a timeout to wait and create the delay
this.state = {
    in: false
};
setTimeout(() => {
    setState({ in: true });
}, 8000);
    					Solution 2:[2]
In "Components > Transitions > Zoom demo" of Material UI doc there are some examples in order to achieve it; a bit more elegant than touch the state!
In esence, you can pass a style attribute to Fade component and set the delay (transitionDelay). In the code below we iterate a result array and causes each individual element be showed with a 100ms delay from previous.
 {profileItems.map((pi, index) => (
    <Fade in={profileItems.length > 0}
          timeout={{ enter: 500, exit: 250 }}
          style={{ transitionDelay: `${index * 100}ms` }}
          key={`asi-${pi.key}-${index}`}>
       <span>
         <DisplayItem profileItem={pi} />
       </span>
   </Fade>))}
    					Solution 3:[3]
To piggyback off of sebastienbarbier, you could create a custom transition component that will handle the state for you by simply passing a delay prop.
Here is what the component would look like (I added additional useful props):
const MyFade = ({
   children,
   in: In = true,
   timeout = 1000,
   delay = 0
}) => {
   const [isIn, setIsIn] = useState(In && delay === 0)
   useEffect(() => {
      if (delay > 0) {
         setTimeout(() => setIsIn(true), delay)
      }
   })
   return (
      <Fade in={isIn} timeout={timeout}>
         {children}
      </Fade>
   )
}
And then for your specific issue to have it wait 4000ms:
<MyFade in timeout={{ enter: 8000 }} delay={4000}>
  <Box display="flex" justifyContent="center">
    <IconButton href="https://soundcloud.com/jyillamusic">
      <Soundcloud />
    </IconButton>
    <IconButton href="https://www.instagram.com/justinyum98/">
      <Instagram />
    </IconButton>
  </Box>
</MyFade>
    					Solution 4:[4]
This seem to work for me without Fade:
const [open, setOpen] = React.useState(false);
<List>
                  {[
                    'Inbox',
                    'Starred',
                    'Send email',
                    'Drafts',
                    'foo',
                    'bar',
                    'baz',
                  ].map((text, index) => (
    <ListItem
     key={text}                 
     sx={{
     transitionProperty: 'all',
                                transitionDuration: '750ms',
                                ...(open && {
                                  opacity: 1,
                                  transform: 'translateY(0)',
                                  transitionDelay: `${index * 150}ms`,
                                }),
                                ...(!open && {
                                  opacity: 0,
                                  transform: 'translateY(100%)',
                                }),
                              }}
                            >
or
<ListItem
 key={text}
 style={{ transitionDelay: open ? `${index * 150}ms` : '0ms' }}                     
>
    					Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | sebastienbarbier | 
| Solution 2 | equintas | 
| Solution 3 | |
| Solution 4 | atazmin | 
