Vue

by Yurik Elmanov

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <h2>Pics ({{ pics.length }}):</h2>
  <main>
    <div v-for="(pic, idx) in pics" :key="idx">
      <img :src="pic.src"/>
      <!-- <div>Loaded in: {{ pic.loadTime }} ms</div> -->
    </div>
  </main>
</div>

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

main {
  margin: 0 auto;
  width: min-content;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 16px;
}

Vue

new Vue({
  el: "#app",
  async created () {
  	this.pics = await this.loadPics(20);
  },
  data: {
    pics: []
  },
  methods: {
  	async loadPics (picsNumber) {
    	const result = [];
      
    	for (let i = 0; i < picsNumber; i++) {
      	result.push(fetch('https://picsum.photos/200/300')); 
      }
      
      const data = await Promise.all(result);
      
      console.log(data)
      
      return data.map(({ url }) => ({ src: url }));
    }
  }
})