64

I'm hoping to find a way to iterate over an #each block a set amount of times in Svelte 3. In Vue I would do something like this:

<li v-for="i in 3"><!-- somecontent --></li>

But as I understand Svelte handles loops much differently using the .length property of the array being #eached. Is there some way to pull off something like this in Svelte?

{#each 3 as i}
  <li><!-- somecontent --></li>
{/if}
unloco
  • 6,928
  • 2
  • 47
  • 58
JHeth
  • 7,067
  • 2
  • 23
  • 34

4 Answers4

131

An #each tag can loop anything with a length property, so:

{#each {length: 3} as _, i}
    <li>{i + 1}</li>
{/each}

will also work, if you prefer.

Antony Jones
  • 2,387
  • 1
  • 15
  • 18
113

You can use {#each ...}, like:

{#each Array(3) as _, i}
    <li>{i + 1}</li>
{/each}
CD..
  • 72,281
  • 25
  • 154
  • 163
  • 1
    Is there a way to have this #each block re-render anytime the number variable changes (from 3 to 5 for example?). I'd like to render a certain number of form items based on previous user input. Ex: How many cars do you have? --> Number of Text Inputs created for each Car Make/Model, for example. – Doomd Jan 17 '20 at 02:02
  • 1
    @Doomd: yes, see an example: https://svelte.dev/repl/fef2db8c70064c49913a6608ebf633b9?version=3.18.2 – CD.. Feb 20 '20 at 19:32
  • 1
    If you're going to do that - please key it @doomd so that Svelte can keep track of additions/removals: {#each x as _, i (x.id)} or similar. – Antony Jones Jul 07 '21 at 09:39
1

i Use like this for travelling from a to b in Svelte

{#each Array.from(Array(b+1).keys()).slice(a) as i }
    <h1>{i}</h1>                    
{/each}

example (1 to 100):

{#each Array.from(Array(100+1).keys()).slice(1) as i }
    <h1>{i}</h1>                    
{/each}
  • 2
    Very cool, not as useful for 1-X since you can use one of the other simpler approaches for that. But this has some interesting possibilities for pagination https://svelte.dev/repl/509ac9d542644544a282966aef6879e1?version=3.44.3 – JHeth Dec 18 '21 at 20:52
1

You can use clean variable from the script section (mmm... for a pagination):

// script
export let numOfPages = 10
const pagesArray = Array.from({length: numOfPages}, (x, i) => i+1) // [1,2,3,4,5,6,7,8,9,10]

// template
{#each pagesArray as page}
    <li>{page}</li>
{/each}
MaxWall
  • 195
  • 5