Timers
As said in the previous section, the user should understand that things are happening when they submit the form. Timers gives us a way of providing feedback at the right time, based upon human perception research.
Usage
const { form, enhance, submitting, delayed, timeout } = superForm(data.form, {
delayMs: number = 500
timeoutMs: number = 8000
})
Submit state
The delayMs
and timeoutMs
decides how long before the submission changes state. The states are:
Idle → submitting → delayed → timeout 0 ms 500 ms 8000 ms
These states affect the readable stores submitting
, delayed
and timeout
returned from superForm
. They are not mutually exclusive, so submitting
won’t change to false
when delayed
becomes true
.
Loading indicators
A perfect use for these timers is to show a loading indicator while the form is submitting:
src/routes/+page.svelte
<script lang="ts">
const { form, errors, enhance, delayed } = superForm(data.form);
</script>
<div>
<button>Submit</button>
{#if $delayed}<span class="delayed">Working...</span>{/if}
</div>
The reason for using delayed
instead of submitting
is based on the article Response Times: The 3 Important Limits, which states that for short waiting periods, no feedback is required except to display the result. Therefore, delayed
is used to show a loading indicator after a little while.
Visualizing the timers
Try submitting this form and see how different delay times affect the timers. Loading spinners are set to display when delayed
and timeout
are true. The request itself is set to timeout with an error after 10 seconds.
Click multiple times to see the effect of multipleSubmits = 'prevent'
as well.
Idle → submitting → delayed → timeout 0 ms 500 ms 8000 ms
Experimenting with these three timers and the delay between them, it’s certainly possible to prevent the feeling of unresponsiveness in many cases. Please share your results on Discord or Github, if you do!