0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MUIのSnackbarがなかなか消えないのは、autoHideDurationの勘違いが原因だった

0
Last updated at Posted at 2026-09-04

きっかけ

「コピーしました」のような一瞬で消えるToastを、MUIのSnackbarで出す実装をしていた時なんですが、なんだか想定より長く画面に残っている気がして、実際に測ってみたらautoHideDurationに3000を渡しているのに倍の6秒間も表示されていました。

エラーが出ているわけでもないので、この手の細かい挙動はつい後回しにしがちなんですが、6秒も残るとなるとさすがに気になったので原因を調べてみました。
同じように詰まった人がすぐ抜けられるよう、記事に残しておきます。

元のコード

const showSnackbar = (message: string) => {
  setSnackbarMessage(message)
  setSnackbarOpen(true)
}

const resetSnackbar = () => {
  setTimeout(() => {
    setSnackbarOpen(false)
    setSnackbarMessage('')
  }, 3000)
}

JSX側ではこう使っていました。

<Snackbar
  open={snackbarOpen}
  autoHideDuration={3000}
  onClose={resetSnackbar}
  message={snackbarMessage}
/>

3000msで閉じると書いてあるのでパッと見はおかしくないはずです。

タイマーが二重に走っていた

引っかかっていたのはautoHideDuration={3000}のほうでした。
ドキュメントを見ると、これはMUIのSnackbarが自前で持っているタイマーで、「開いてから3秒経ったらonCloseを呼ぶ」という意味のようです。
閉じるのではなく、あくまでonCloseを呼ぶだけ、というところがポイントでした。自動で閉じるための仕組みは、MUI側にすでにあるわけです。

ところが、そのonCloseに渡したresetSnackbarのほうも、さらにsetTimeoutで3秒待ってからopenをfalseにしていました。

流れを整理するとこうなります。

  • 開く
  • MUIが3秒カウントしてonClose(=resetSnackbar)を呼ぶ
  • resetSnackbarがそこからさらに3秒待ってsetSnackbarOpen(false)

3秒 + 3秒 で6秒かかっていた、ということです。
autoHideDurationは「何秒後にonCloseを呼ぶか」であって「何秒後に閉じるか」ではない、というところを取り違えていました。

修正後

onCloseは即座に閉じるだけにして、ディレイはMUIに任せるようにしました。

const resetSnackbar = () => {
  setSnackbarOpen(false)
  setSnackbarMessage('')
}

比較

修正前と修正後を並べてみました。左がタイマーを二重に持っていたころで、右がsetTimeoutを消したあとです。

左(修正前)は6秒、右(修正後)は3秒で消える比較

こうして並べると、たった3秒の違いでも、左のほうはずいぶん長く感じます。
トーストが残りすぎると、次の操作の邪魔になったり「まだ処理中かな」と勘違いさせたりと、ユーザー体験を損ねてしまいます。
こういう細かいところの積み重ねが使い心地に影響するので、面倒でも一つずつ潰していきたいですね。

振り返り

原因はautoHideDurationを「閉じるまでの時間」だと思い込んでいたことで、直したのはsetTimeoutを一行消しただけでした。
ライブラリが自前でタイマーを持っているところに同じ役割の処理をもう一枚足すと二重になってしまうので、どこまで任せられるかは先に確かめておきたいところです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?