# v-for
소스 데이터를 기반으로 요소 또는 템플릿 블록을 여러번 렌더링
구조는 "alias(별칭) in expression"의 형식
인덱스에 대한 별칭을 지정할 수 있음
<div v-for="item in items">
{{ item.text }}
</div>
<div v-for="(item, index) in items"></div>
객체에서는 갯수에 따라 순서가 정해져있음
<div v-for="value in object"></div>
<div v-for="(value, key) in object"></div>
<div v-for="(value, key, index) in object"></div>
1. 배열에서 v-for
<div v-for="(item, index) in myArr">
{{ index }} // {{item.name}}
</div>
2. 객체에서 v-for
<div v-for="(value, key, index) in myObj">
{{ index }} / {{ key }} / {{ value }}
</div>
3. template에서 v-for
여러 요소를 한번에 반복하려면 template을 이용 → 포장해주자
<ul>
<template v-for="item in myArr">
<li>{{ item.name }}</li>
<li>{{ item.age }}</li>
<hr>
</template>
</ul>
4. 중첩 v-for
각 v-for 범위는 상위 범위에 접근 가능
const myInfo = ref([
{ name: 'Alice', age: 20, friends: ['Bella', 'Cathy', 'Dan'] },
{ name: 'Bella', age: 21, friends: ['Alice', 'Cathy'] }
])
<ul v-for="item in myInfo">
<li v-for="friend in item.friends">
{{friend}}
</li>
</ul>
반드시, v-for와 key는 함께 사용해야한다!
데이터의 예측 가능한 행동을 유지
# key?
각 요소에 대한 고유한 값을 나타낼 수 있는 식별자여야 한다
let id = 0
const items = ref([
{ id: id++, name: 'Alice' },
{ id: id++, name: 'Bella' },
])
<div v-for="item in items" :key="item.id">
{{ item }}
</div>
사실 key가 있던 없던 당장 보이는 차이는 없다
하지만, view의 내부 처리에 아주 중요한 요소이므로 써줘야한다.
※ v-for의 key를 배열의 인덱스는 쓰지 말기
→ 인덱스는 식별자가 아닌 배열 항목의 위치만을 나타내기 때문에
중간에 새로운 항목이 삽입되는 등의 상황이 발생하면 문제가 생김
직접 고유한 값을 만들어내는 메서드를 만들거나, 외부 라이브러리 등을 활용하는 등 식별자 역할을 하는 값을 넣자
# v-for와 v-if 같이 쓰지 않기
동일요소에는 같이 쓰지 않는다
왜? 동일 요소에서는 v-if가 v-for보다 우선순위가 높기 때문에
그럼 어떻게 같이 쓰냐?
→ v-for와 template를 같이 써서 v-if를 안에 써줌
<template v-for="item in items" :key="item.id">
<li v-if="!todo.isCompelte"></li>
{{ todo.name }}
</template>
원본 배열이 안바뀌게 조심할 것
예를 들어 push, pop, shift, unshift, splice, sort, reverse 등의 메서드들은 원본 배열을 수정함
그러므로 filter, concat, slice등의 원본 배열을 수정하지 않고 새 배열을 반환하는 메서드를 쓰거나
computed를 사용하자
'FrontEnd > Vue' 카테고리의 다른 글
[Vue] Lifecycle Hooks (0) | 2023.11.06 |
---|---|
[Vue] Watchers (0) | 2023.11.06 |
[Vue] Conditional Rendering(v-if, v-show) (1) | 2023.11.06 |
[Vue] Computed 속성 (0) | 2023.11.06 |
[Vue] TodoList 만들어보기 (0) | 2023.11.02 |