리스트 렌더링
v-for
v-for 디렉티브를 사용해 배열기반 리스트 렌더링
item in items 형태로 특별한 문법이 필요험(items은 원본 데이터 배열, item은 반복되는 배열의 값) / in 대신 of 사용 가능
기본 사용방법
//HTML
<ul id="example-1">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
//JavaScript
var example1 = new Vue({
el: "#example-1",
data: {
items: [
{ message: "Foo" },
{ message: "Bar" }
]
}
})
위의 코드는 렌더링 되어 아래와 같은 결과가 나온다
- Foo
- Bar
v-for 블록 안에는 부모 범위 속성에 대한 모든 권한이 있고 현재 항목의 인덱스에 대한 두 번째 전달인자 옵션을 제공
//HTML
<ul id="example-2">
<li v-for="(item, index) in items">
{{ parentMessage }} - {{ index }} - {{ item.message }}
</li>
</ul>
//JavaScript
var example2 = new Vue({
el: "#example-2",
data: {
parentMessage: "Parent",
items: [
{ message: "Foo" },
{ message: "Bar" }
]
}
})
결과는 아래와 같다
- Parent - 0 - Foo
- Parent - 1 - Bar
v-for 템플릿
템플릿 v-if와 마찬가지로, 태그를 사용해 여러 엘리먼트의 블럭을 렌더링 할 수 있음
<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="divivder"></li>
</template>
</ul>
v-for과 객체
v-for을 사용하여 객체의 속성을 반복할 수도 있음
//HTML
<ul id="repeat-object" class="demo">
<li v-for="value in object">
{{ value }}
</li>
</ul>
//JavaScript
new Vue({
el: "#repeat-object",
data: {
object: {
firstName: "John",
lastName: "Doe",
age: 30
}
}
})
결과
- John
- Doe
- 30
Range v-for
v-for은 정수를 사용할 수 있음. 이 경우 템플릿을 여러번 반복 함
<div>
<span v-for="n in 10">{{ n }}</span>
</div>
결과
1 2 3 4 5 6 7 8 9 10
컴포넌트와 v-for
나중에 다시 작성 예정
v-for와 v-if
v-for
와 v-if
가 같은 노드에 존재하면 v-for
이 우선 순위를 가짐.
둘을 같이 쓰는건 아래 코드와 같이 일부 항목만 렌더링 할때 유용함
<li v-for="todo in todos" v-if="!todo.isComplete">
{{ todo }}
</li>
위의 경우는 완료되지 않은 todo가 렌더링 된다
엘리먼트를 전부 렌더링 하고, 조건문으로 보여지고 싶은 부분만 추리고 싶으면
v-if를 래퍼 엘리먼트로 옮기면 된다
<ul v-if="shouldRenderTodos">
<li v-for="todo in todos">
{{ todo }}
</li>
</ul>
key
v-for
에서 렌더링된 엘리먼트 목록을 갱신할 때 “in-place patch” 전략 사용
데이터 항목의 순서가 변경된 경우 항목의 순서와 일치하도록 DOM요소를 이동하는 대신 Vue는 각 요소를 적절한 위치에 패치하고 해당 인덱스에서 렌더링할 내용을 반영하는지 확인함
이때 재정렬 할 수 있도록 각 항목에 고유속성 key
를 제공해야 함
<div v-for="item in items" :key="item.id">
<!-- content -->
</div>
v-for
에는 항상 key
를 추가하는 것이 좋음
예외 : 반복되는 DOM 내용이 단순하지 않거나, 의도적인 성능 향상을 위해 기본 동작에 의존하는 경우 => 그냥 복잡하게 반복문을 썼을때를 제외하고는 key
를 쓰라는 것.
배열 변경 감지
변이 메소드
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
ps. 루비랑 똑같다
배열 대체
filter()
concat()
slice()
위 세가지 메소드를 사용하면 항상 새 배열을 반환
이때 Vue는 기존 DOM을 버리고 새로 렌더링을 하는것이 아니라
겹치는 객체가 포함된 다른 배열로 대체해 효율적임
주의
JavaScript의 제한으로 Vue는 2가지 경우를 감지할 수 없음
1. 인덱스로 배열에 있는 항목을 직접 설정하는 경우 vm.items[indexOfItem] = newValue
=> Vue.set(example1.items, indexOfItem, newValue)
사용
2. 배열의 길이를 수정하는 경우 vm.items.length = newLength
=> splice
사용
'개발 > Vue.js' 카테고리의 다른 글
9. 폼 입력 바인딩 (0) | 2017.03.31 |
---|---|
8. 이벤트 핸들링(v-on) (0) | 2017.03.31 |
6. 조건부 렌더링(v-if, v-else-if, v-else, v-show) (0) | 2017.03.30 |
5. 클래스와 스타일 바인딩(Class and Style Bindings) (0) | 2017.03.29 |
4. 계산된 속성과 감시자 (0) | 2017.03.28 |