Vue/Vue.js 문법
Vue.js 문법 - 리스트 렌더링
IT Blue
2021. 7. 14. 15:20
v-for
- v-for 디렉티브를 사용하여 배열을 기반으로 리스트를 렌더링
- item in items 형태로 특별한 문법이 필요
- items는 원본 데이터 배열, item은 반복되는 배열 엘리먼트의 별칭
예제1
<!-- App.vue -->
<template>
<ul>
<li
v-for="(fruit, index) in fruits"
:key="fruit">
{{ fruit }}-{{ index }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
fruits: ['Apple', 'Banana', 'Cherry']
}
}
}
</script>
결과
예제2
<!-- App.vue -->
<template>
<ul>
<li
v-for="fruit in newFruits"
:key="fruit.id">
{{ fruit.name }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
fruits: ['Apple', 'Banana', 'Cherry'],
}
},
computed: {
newFruits() {
return this.fruits.map((fruit, index) => {
return {
id: index,
name: fruit
}
})
}
}
}
</script>
코드 이해하기
- computed 속성을 통해 정렬된(계산된) 배열을 반환
- 배열 데이터 내부에는 객체 데이터 (id, name)가 들어있음
- :key 값으로 배열의 아이템을 구분 가능한 고유한 속성(id)을 부여
shortid 패키지
# 각각의 아이디를 고유하게 만들어주는 패키지
$ npm i -D shortid
예제3
<!-- App.vue -->
<template>
<ul>
<li
v-for="fruit in newFruits"
:key="fruit.id">
{{ fruit.name }}-{{ fruit.id }}
</li>
</ul>
</template>
<script>
import shortid from 'shortid'
export default {
data() {
return {
fruits: ['Apple', 'Banana', 'Cherry'],
}
},
computed: {
newFruits() {
return this.fruits.map(fruit => ({
id: shortid.generate(),
name: fruit
}))
}
}
}
</script>
결과
객체 구조 분해
<template>
<ul>
<li
v-for="{ id, name} in newFruits"
:key="id">
{{ name }}-{{ id }}
</li>
</ul>
</template>
- 예제3 <template> 부분을 객체 구조 분해를 통해 위와 같이 작성 가능
배열 변경 감지
변이 메소드
- Vue는 감시중인 배열의 변이 메소드를 래핑하여 뷰 갱신을 트리거 (반응성)
- 배열 데이터가 바뀌면 뷰가 갱신된다는 의미
래핑된 메소드
- push() - 배열 데이터 가장 마지막에 아이템을 삽입
- pop() - 배열 데이터 가장 마지막 아이템을 반환
- shift() - 배열 데이터 가장 앞에 아이템을 반환
- unshift() - 배열 데이터 가장 앞에 아이템을 삽입
- splice() - 인덱스를 이용해서 데이터를 삽입, 반환, 삭제
- sort() - 배열을 정렬
- reverse() - 배열을 뒤집어줌
배열 교체
- 변이 메소드는 호출된 원래 배열을 변경
- filter(), concat(), slice()와 같은 원래 배열을 변경하지 않고 항상 새 배열을 반환하는 메소드도 존재
- 이러한 메소드를 비-변이 메소드라 부름
- 비-변이 메소드로 작업할때 이전 배열을 새 배열로 바꿀수도 있다
/* 예제 */
example1.items = example1.items.filter(item => item.message.match(/Foo/))