组件更新时重置 Snackbar 上的 autoHideDuration 计时器

Posted

技术标签:

【中文标题】组件更新时重置 Snackbar 上的 autoHideDuration 计时器【英文标题】:Reset autoHideDuration timer on Snackbar when component updates 【发布时间】:2021-10-17 16:16:55 【问题描述】:

我希望小吃栏仅在组件未更新时在 2 秒内超时。如果它更新,我希望计时器在尚未达到 2 秒时重置。

useEffect(() => 
          setOpen(true)
        
    ,[props.single_message])

        return(
           
        <div>
            props.single_message.length !== 0 
                    ?
                    <Snackbar open=open autoHideDuration=2000 
                        onClose=() => setOpen(false) 
                        anchorOrigin= vertical: 'top', horizontal: 'center'  >
                            <SnackbarContent aria-describedby="message-id2"
                                className=classes.snackbarStyleViaNestedContent
                                message=props.single_message[0]
                                action=action
                            />
                    </Snackbar>

                    :
                    null
            
                
                
        </div>
    )

如果 autoHideDuration 尚未完成,如何在组件更新时重置 autoHideDuration。如果 autoHideDuration 无法实现,还有其他方法吗?

【问题讨论】:

【参考方案1】:

我认为最好的方法是这样的:

var timeout;
const [open, setOpen] = useState(false);

<Button
  onClick=() => 
    setOpen(true);
    clearTimeout(timeout);
    timeout = setTimeout(function () 
      setOpen(false);
    , 2000);
  
/>
<Snackbar
  open=open
  onClose=() => setOpen(false)
  message="Test snackbar"
/>

但是也许这样的事情(使用当前时间)可以工作:

const [closeTime, setCloseTime] = useState(0);

<Button onClick=() => setCloseTime(Date.now() + 2000) />
<Snackbar
  open=closeTime > Date.now()
  onClose=() => setCloseTime(0)
  message="Test snackbar"
/>

【讨论】:

很棒的东西。第一部分按预期工作。

以上是关于组件更新时重置 Snackbar 上的 autoHideDuration 计时器的主要内容,如果未能解决你的问题,请参考以下文章

React 上的 Material-UI Snackbar 固定在页面底部

如何在服务上使用 SnackBar 以在 Angular 2 中的每个组件中使用

Vuetify 小吃吧超时时更新父状态

如何使 Snackbar 在类组件中工作?

如何重置组件的状态值?

Redux dispatch 导致组件本地状态重置