본문 바로가기
Front-end/Vue3

14. Vue - 리스트 렌더링(= 배열 처리)

by devraphy 2021. 5. 19.

0. 시작하기 전에

  • 이전 포스팅에서 간단하게 v-for를 사용하여 반복처리를 해보았다. 
  • 리스트 렌더링이란, 간단하게 말해서 반복문을 사용한 배열 처리 과정을 말한다. 
  • 오늘은 반복문을 사용한 배열 처리 과정에 대해서 알아보자. 

 

공식문서 바로가기

 


1. index

a) 예제코드

<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>

<style>
  li {
    font-size: 50px;
  }
</style>

 

b) 출력화면

 

c) 해설

  • 예제코드에서 v-for 디렉티브를 사용한 곳을 살펴보자. 
  • 반복문을 사용하다보면 다양한 이유로 index가 필요한 경우가 있다. 
  • 이때 v-for 디렉티브에서 제공하는 표현식을 사용하면 인덱스를 쉽게 얻을 수 있다. 
  • 배열의 요소와 index를 위의 예제코드에서 처럼 괄호()를 이용하여 묶어주면 된다. 
  • 인덱스의 이름은 반드시 index일 필요는 없다. 필요에 따라서 자유롭게 원하는 명칭을 사용할 수 있다. 
  • 다만, 반드시 괄호를 사용하여 배열의 요소와 인덱스를 표현하는 변수를 묶어주어야 한다는 것이 중요하다. 

2. computed를 활용한 리스트 렌더링 

a) 예제코드

<template>
  <ul>
    <li
      v-for="fruit in newFruits"
      :key="fruit.id">
      {{ 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>

<style>
  li {
    font-size: 50px;
  }
</style>

 

b) 출력화면

 

c) 해설

  • 위의 코드를 간단하게 설명하자면, computed를 이용해 배열 데이터를 후처리하는 과정이다. 
  • fruits 배열을 map() 메소드를 통해 id와 name이라는 key를 갖는 key : value의 객체형태로 재구성 한 것이다. 
  • v-for 디렉티브를 사용할 때에는 반드시 고유값을 key로 설정해야 하기 때문에 고유값인 fruit.id를 key로 설정하였다. 

3. 고유한 key값을 만드는 방법 (shortid 패키지)

a) shortid 패키지 설치

  • 터미널 입력: npm i -D shortid

 

b) 예제코드

<template>
  <ul>
    <li
      v-for="fruit in newFruits"
      :key="fruit.id">
      {{ fruit.id }} = {{ fruit.name }}
    </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(), // generate() => shortid를 생성해주는 메소드
        name: fruit
      }))
    }
  }
}
</script>

<style>
  li {
    font-size: 50px;
  }
</style>

 

c) 출력화면

 

d) 해설

  • 설치한 패키지를 script 태그 내부에서 import 한다. 
  • computed 부분에서 index 매개변수를 지워준다. 
  • 매개변수가 fruit 하나이기 때문에, 괄호가 생략이 가능하다. 
  • id라는 key값에 generate() 메소드를 사용하여 key값을 생성해준다. 

4. 객체 구조 분해 

  • 배열 안에 들어있는 요소가 객체의 형태라면, 이 부분을 분해할 수 있다. 
  • 다음 사진을 참고하자  

  • newFruits 라는 배열 안에는 id와 name이라는 key와 value로 구성된 객체 데이터가 들어있다. 
  • 이 객체 데이터를 fruit in fruits로 명시하는 것이 아니라, 위의 사진처럼 직접 key명으로 작성할 수 있다. 

 

출력화면

  • 문제없이 잘 출력되는 것을 확인할 수 있다. 

5. 배열에 객체 데이터 추가하기 

  • 이 과정에는 반응성의 개념이 나옵니다. 
  • 반응성 = 데이터가 갱신되면 화면이 바뀌는 성질

 

a) 예제코드

<template>
  <button @click="handler">
    Click me!!!
  </button>
  <ul>
    <li
      v-for="{id, name} in newFruits"
      :key="id">
      {{ id }} = {{ name }}
    </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(), // generate() => shortid를 생성해주는 메소드
        name: fruit
      }))
    }
  },
  methods: {
    handler() {
      this.fruits.push('Orange')
    }
  }
}
</script>

<style>
  button, li {
    font-size: 50px;
  }
</style>

 

b) 출력화면

 

c) 해설

  • handler라는 메소드는 'Orange'라는 문자열을 배열에 추가하는 기능이다. 
  • 이를 버튼에 연결시켜, 클릭할 때마다 'Orange'라는 요소가 배열에 추가된다. 
  • 당연히 각각의 'Orange' 요소는 다른 key값(= shortid)을 갖게 된다.
  • 데이터가 추가되면 화면이 갱신되는 특성을 반응성이라고 하는데, 리스트 렌더링에는 반응성을 일으키는 트리거 메소드가 존재한다. 

 

d) 변이 메소드

  • 위의 사진은 리스트 렌더링에서 반응성을 일으키는 메소드다. 
  • 배열의 변이란, 배열의 요소를 삭제/추가/수정/정렬 등을 의미한다. 
  • 배열 변이의 기능을 갖는 메소드를 사용하면 반응성이라는 특성으로 화면이 갱신된다는 것을 의미한다. 

 

e) 배열교체, 비 변이 메소드

 

'Front-end > Vue3' 카테고리의 다른 글

16. Vue - 이벤트 수식어  (0) 2021.05.20
15. Vue - 이벤트 핸들링  (0) 2021.05.19
13. Vue - 조건부 렌더링  (0) 2021.05.19
12. Vue - 클래스와 스타일바인딩  (0) 2021.05.18
11. Vue - watch 속성  (0) 2021.05.18

댓글