(준)공식 문서/Vue.js

[ Vue.js 3 공식 문서 ] 2. Essentials - List Rendering (v-for)

Je-chan 2022. 2. 21. 16:14

 

[ Reference ] 

https://vuejs.org/guide/essentials/list.html

 

List Rendering | Vue.js

 

vuejs.org

 

1. v-for 

  ** v-for ** 디렉티브는 배열에서 item들을 렌더링할 때 사용할 수 있다. ** v-for ** 디렉티브는 ** item in items ** 라는특별한 구문을 필요로 한다. 여기서 items 는 array 를 의미하고 item 은 각 array 의 요소 별칭이다. 

 

const items = ref([{ message: 'Foo' }, { message: 'Bar' }])
<li v-for="item in items">
  {{ item.message }}
</li>

 

  ** v-for ** 는 상위 범위 속성에 모두 접근할 수 있고, 내부에서 만들 수 있는 두 번째 별칭은 index 값이다. (* v-for 는 아무래도 배열의 메소드, forEach 등과 유사하게 작동하는 것 같다.) 

 

const parentMessage = ref('Parent')
const items = ref([{ message: 'Foo' }, { message: 'Bar' }])
<li v-for="(item, index) in items">
  {{ parentMessage }} - {{ index }} - {{ item.message }}
</li>

 


2. v-for with an Object

  ** v-for ** 는 객체도 반복문으로 돌릴 수 있도록 도와준다. 

const myObject = reactive({
  title: 'How to do lists in Vue',
  author: 'Jane Doe',
  publishedAt: '2016-04-10'
})
<li v-for="(value, key, index) in myObject">
  {{ index }}. {{ key }}: {{ value }}
</li>

 

  여기서는 첫 번째 인자가 value 의 별칭이 되고, 두 번째 인자가 key 의 별칭이 된다. 세 번째 인자는 index 값이다.  객체는 배열과 다르게 iterable 하지는 않지만 ** Object.keys( ) ** 로 돌렸을 때의 순서를 기반으로 돌릴 수 있도록 해준다. 한계점은 아무래도 일관성이 100% 보장되지 않다는 점이다. 

 

 


3. v-for 기타 정보

  먼저, ** v-for ** 는 <template> 에서도 사용이 가능하다.

 

v-for 와  v-if 함께 사용하기

  두 번째로, v-for 와 v-if 는 동시에 사용이 가능하다. 하지만 암시적 우선 순위 때문에 v-if 와 v-for 를 동일한 요소에서 사용하지 않는 것을 권장한다. 암시적 우선 순위란 v-if 가 v-for 보다 우선순위가 높다는 것을 의미한다. 즉, v-if 조건이 v-for 범위의 변수에 접근할 수 없다. (* v-for 에서 사용하는 변수를 이용해서 v-if 로 조건을 걸 수 없다는 의미) 차라리 <template> 태그에 v-for 를 돌리고, li 나 div 등 실제 태그에 v-if 문을 걸어주는 것이 좋다. 

 

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

  이걸 아래와 같이 변경해야 한다.

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

 

key 값 설정하기

  v-for 를 돌릴 때는 key 값을 반드시 부여해줘야 한다. vue 동작 원리에 의해 데이터 항목의 순서가 변경되면 노드의 key 값을 추적해서 기존의 요소를 재사용하며 순서를 변경할 수 있도록 한다. key 값이 있고 없고의 차이는 효율적인 측면에서 두드러지게 나타나므로 v-for 로 돌렸을 때는 key 값을 줘야만 한다. (* 마치 리액트에서 key 값을 주는 것처럼) 

 

컴포넌트에서 v-for 사용하기

  컴포넌트에서도 ** v-for ** 사용이 가능하다. 마찬가지로 key 값은 제공해야 한다. 다만, ** v-for ** 를 통해서 얻을 수 있는 데이터들은 props 로 전달해줘야 한다. 

 

<my-component
  v-for="(item, index) in items"
  :item="item"
  :index="index"
  :key="item.id"
></my-component>