😗
React: 多重クリック防止に関する実装
React: 多重クリック防止に関する実装
多重クリックとは
formのbuttonにおいて、通常の実装で記載すると、処理時間内にbuttonが謳歌された回数だけ、処理が走ってしまう。
例えば、Amazonなどのショッピングサイトなどで、「購入する」をクリックしたとする。
そこで「多重クリック防止」処理が適切に実装されていなければ、2重にクリックした際に、2回処理が走ってしまう。
そうなると、2回購入したことになってしまい、余計に代金を支払うリスクも出てくる。
今回の「多重クリック防止に関する実装」では、そういったことを防ぐための実装である。
多重クリック防止のポイント
処理中フラグの判定を useRef
にし、値を変更しても再レンダリングを発生させないようにする。
const SubmitForm = () => {
const processing = useRef(false)
const handleSubmit = (e) => {
e.preventDefault()
e.stopPropagation()
processing.current && return
processing.current = true
setTimeout(() => {
process.current = false
}, 3000)
}
return (
<form onSubmit={handleSubmit}>
<button type="submit">Submit</button>
</form>
)
}
- processing: 処理中のフラグ。
-
e.preventDefault
: submitした際の本来のイベントである「ページのリロード」をキャンセル。 -
e.stopPropagation
: イベントの伝播をキャンセル。 - processingの現在の状態(
processing.current
)がtrue(処理中)の場合は、非同期処理せずに抜ける -
setTimeout
で、3000msは処理状態をfalseして非同期処理。
Discussion