본문 바로가기

Frontend/Vue3

[Vue3] 리스트 렌더링 (v-for)

728x90
반응형

v-for 특징

- alias in expression 형식의 특수 구문을 사용하여 반복되는 현재 요소에 대한 별칭(alias) 제공

<div v-for="item in items">
  {{ item.text }}
</div>

 

- 배열에서 인덱스에 대한 별칭을 지정할 수 있음

<body>
    <div id="app">
      <div v-for="(item, index) in myArr">{{ index }} / {{ item.name }}</div>
    </div>

    <script>
      const { createApp, ref } = Vue;

      const app = createApp({
        setup() {
          const myArr = ref([
            { name: "Alice", age: 20 },
            { name: "Bella", age: 21 },
          ]);

          return {
            myArr,
          };
        },
      });

      app.mount("#app");
    </script>
  </body>

- 객체에서는 키, 인덱스에 대한 별칭을 지정할 수 있음

<body>
    <div id="app">
      <div v-for="(value, key, index) in myObj">{{ index }} / {{ key }} / {{ value }}</div>
    </div>

    <script>
      const { createApp, ref } = Vue;

      const app = createApp({
        setup() {
          const myObj = ref({
            name: "Cathy",
            age: 30,
          });

          return {
            myObj,
          };
        },
      });

      app.mount("#app");
    </script>
  </body>

 

여러 요소에 대한 v-for 적용

- template 요소에 v-for을 적용하여 하나 이상의 요소에 반복 렌더링 할 수 있음

<body>
    <div id="app">
      <ul>
        <template v-for="item in myArr">
          <li>{{ item.name }}</li>
          <li>{{ item.age }}</li>
          <hr />
        </template>
      </ul>
    </div>

    <script>
      const { createApp, ref } = Vue;

      const app = createApp({
        setup() {
          const myArr = ref([
            { name: "Alice", age: 20 },
            { name: "Bella", age: 21 },
          ]);

          return {
            myArr,
          };
        },
      });

      app.mount("#app");
    </script>
  </body>

 

중첩된 v-for

- 각 v-for 범위는 상위 범위에 접근할 수 있다.

<body>
    <div id="app">
      <ul v-for="item in myInfo">
        <li v-for="friend in item.friends">{{ item.name }} - {{ friend }}</li>
      </ul>
    </div>

    <script>
      const { createApp, ref } = Vue;

      const app = createApp({
        setup() {
          const myInfo = ref([
            { name: "Alice", age: 20, friends: ["Bella", "Cathy", "Dan"] },
            { name: "Bella", age: 21, friends: ["Alice", "Cathy"] },
          ]);

          return {
            myInfo,
          };
        },
      });

      app.mount("#app");
    </script>
  </body>

v-for와 key

- 데이터의 예측 가능한 행동을 유지하기 위해 반드시 v-for와 key를 함께 사용해야 한다!!

- key는 반드시 각 요소에 대한 고유한 값을 나타낼 수 있는 식별자여야 한다.

<body>
    <div id="app">
      <div v-for="item in items" :key="item.id">
        {{item.id}} - {{item.name}}
      </div>
    </div>

    <script>
      const { createApp, ref, computed } = Vue;

      const app = createApp({
        setup() {
          let id = 0;

          const items = ref([
            { id: id++, name: "Alice" },
            { id: id++, name: "Bella" },
          ]);

          return {
            items,
          };
        },
      });

      app.mount("#app");
    </script>
  </body>

v-for with v-if

- 동일 요소에 v-for와 v-if를 함께 사용하지 않는다.

- 동일한 요소에서 v-if가 v-for보다 우선순위가 더 높기 때문

- v-if 조건은 v-for 범위의 변수에 접근할 수 없다.

 

문제 상황) v-if가 더 높은 우선순위를 가지므로 v-for의 todo 요소를 v-if에서 사용할 수 없음

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

 

-> v-for와 template 요소를 사용하여 v-if 이동

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

 

728x90
반응형

'Frontend > Vue3' 카테고리의 다른 글

[Vue3] Lifecycle Hooks  (0) 2024.05.06
[Vue3] watch  (0) 2024.05.06
[Vue3] 조건부 렌더링 (v-if, v-show)  (0) 2024.05.06
[Vue3] Computed Property  (0) 2024.05.06
[Vue3] Form 입력 바인딩 (v-model)  (0) 2024.05.05