According to the tutorial, tick()
is a function that returns a promise that resolves as soon as any pending state changes have been applied to the DOM.
But, how is this tick()
function useful, why do you need tick()
, and when you'll use tick()
?
Here's 2 great examples of using tick()
that you should't miss out on!
1. Waiting for reactive declared variables to get updated
Say you reactively declared a variable
$: double = value * 2
updating value
won't immediately update double
.
👉 watch me explained why is that so on youtube:
So, here's how tick()
can help. tick()
returns a promise that resolves when svelte finishes the upcoming update cycle.
Meaning, by the time tick()
resolves, you double
is updated too!
<script> import { tick } from 'svelte'; let count = 1; $: double = count * 2; async function increment() { count ++; // double is still 2 await tick(); // 🎉 double is now 4! console.log(double); // 4 } </script>
2. Waiting for svelte to update the DOM elements
Say you update a variable, svelte updates the DOM asynchronously.
💡 This allow Svelte to batch DOM updates.
However, that means, if you try to read the content / attribute of the DOM element immediately, you are out of luck!
<script> import { tick } from 'svelte'; let count = 1; let div; async function increment() { count ++; // div still shows '1' console.log(div.textContent); // '1' } </script> <div bind:this={div}>{count}</div>
tick()
comes in handy in this case.
So, await
for tick()
, by the time it resolves, the DOM has updated!
<script> import { tick } from 'svelte'; let count = 1; let div; async function increment() { count ++; // div still shows '1' console.log(div.textContent); // '1' await tick(); // 🎉 div now showing '2' console.log(div.textContent); // '2' } </script> <div bind:this={div}>{count}</div>
📹 Watch me breaking it down in my YouTube video
Bonus
Here's a few more examples when tick()
comes in handy!
Querying dynamic content created using {@html}
<script> import { tick } from 'svelte'; let div; let dynamicContent = '<div></div>'; async function updateContent(newContent) { dynamicContent = newContent; await tick(); // div is now updated // you can query the new elements div.querySelector('div').forEach(doSomething); } </script> <div bind:this={div}>{@html dynamicContent}</div>
Restoring input cursor position after updating input value
<script> import { tick } from 'svelte'; let value = ''; async function onInput(event) { const input = this; let selectionStart = input.selectionStart; let selectionEnd = input.selectionEnd; value = input.value.toUpperCase(); await tick(); input.selectionStart = selectionStart; input.selectionEnd = selectionEnd; } </script> <input on:input={onInput} {value} />
Top comments (0)