Skip to content

List Rendering

v-for

html
<div v-for="(item, index) in items" :key="item.id">
  <!-- 내용 -->
</div>

<template v-for="(todo, index) in todos" :key="todo.name">
  <li>{{ todo.name }}</li>
</template>

<span v-for="n in 10">{{ n }}</span>

<li v-for="(value, key, index) in myObject" :key="index">
  {{ index }}. {{ key }}: {{ value }}
</li>

v-if가 v-for 보다 우선순위가 높음으로 동시에 쓰는 것을 권장하지 않습니다. 하지만 아래와 같은 방식으로 쓸 수 있습니다.

html
<template v-for="todo in todos">
  <li v-if="!todo.isComplete">{{ todo.name }}</li>
</template>

배열감지

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse() 해당 메소드를 감지하여 반응형 업데이트 합니다.

배열교채

filter(), concat(), slice()는 원본 배열을 수정하지 않고 항상 새 배열을 반환함으로 for문의 경우 이전 배열을 새 배열로 교체해야 합니다.

typescript
items.value = items.value.filter((item) => item.message.match(/Foo/));

필터링/정렬 결과 표시

computed를 이용하여 배열을 반환

vue
<script setup>
const numbers = ref([1, 2, 3, 4, 5]);

const evenNumbers = computed(() => {
  return numbers.value.filter((n) => n % 2 === 0);
});
</script>
<template>
  <li v-for="n in evenNumbers">{{ n }}</li>
</template>

중첩된 v-for문의 경우

vue
<script setup>
const sets = ref([
  [1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10],
]);

function even(numbers) {
  return numbers.filter((number) => number % 2 === 0);
}
</script>
<template>
  <ul v-for="numbers in sets">
    <li v-for="n in even(numbers)">{{ n }}</li>
  </ul>
</template>

WARNING

reverse()와 sort()의 경우 원본 배열을 수정함으로 computed를 이용할 때는 원본배열을 복사해서 return 해야 합니다.
return [...numbers].reverse()