Vue - 렌더링

2023. 11. 28. 18:35· 📗 Vue.js
목차
  1. 조건부 렌더링
  2. 리스트 렌더링

조건부 렌더링

  • v-if, v-else-if, v-else를 형제 요소로 사용할 수 있다
    <div id="app">
      <h1 v-if="isShow">Hello Vue!</h1>
      <h2 v-else-if="[]">Application..</h2>
      <h2 v-else>Good Morning~</h2>
    </div>
  • template 태그를 사용하면 template 안에 있는 내용만 출력된다
    <div id="app">
      <h1 v-if="isShow">Hello Vue!</h1>
      <template v-else-if="[]">
        <h2>Application..</h2>
        <p>1234</p>
        <span>987</span>
      </template>
      <h2 v-else>Good Morning~</h2>
    </div>

v-show

  • true/false 값에 상관없이 해당요소를 구조적으로 출력하고 화면에 보이는지 아닌지는 CSS로 제어를 한다.
  • 연결된 데이터의 true/false값에 따라 css의 display: none으로 바꾸거나 속성과 값을 제거하며 화면에 요소를 보여지거나 보여지지 않게 한다
  • 초기 렌더링 비용이 높고 전환 비용이 낮다
  • 보여지거나 보여지지 않는 구조가 많을 때 적합
  • v-cloak 디렉티브와 함께 사용 권장
    <div id="app">
      <button @click="toggle">Toggle</button>
      <h1 v-show="isShow">Hello Vue!</h1>
    </div>

v-cloak

  • 렌더링되어 바인딩 되기 전에 {{}}태그를 숨길 수 있다
    <style>
      [v-clock] {
        display: none;
      }
    </style>
    <div id="app">
      <button @click="toggle">Toggle</button>
      <h1 v-show="isShow" v-cloak>{{ msg }}</h1>
    </div>

v-if

  • 조건이 true인 경우에는 해당 요소를 자리에 구조화해서 출력하고 조건이 false인 경우에는 해당 요소를 구조적으로 만들지도 않는다(생성X)
  • 초기 렌더링 비용이 낮고 전환 비용이 높다
  • 보여지거나 보여지지 않는 구조가 적을 때 적합
    <div id="app">
      <button @click="toggle">Toggle</button>
      <h1 v-if="isShow">Hello Vue!</h1>
    </div>

v-if와 v-for 동시 사용

  • v-for를 쓴 앨리먼트에 v-if 사용하는 것을 권장하지 않는다
<ul>
  <li 
    v-for="user in users" 
    v-if="user.isActive" 
    :key="user.id">
    {{user.name}}
</li>
</ul>
  • template 태그를 사용하여 같이 사용하면 괜찮다
<ul>
  <template v-for="user in users" :key="user.id">
    <li v-if="user.isActive">{{user.name}}</li>
  </template>
</ul>

리스트 렌더링

v-for로 엘리먼트에 배열 매핑하기

<ul id="array-rendering">
  <li v-for="item in items">
    {{item.message}}
  </li>
</ul>
  • v-for는 두번째 전달인자에 현재 항목의 인덱스를 제공한다
<ul id="array-rendering">
  <li v-for="(item, index) in items">
    {{parentMessage}} -{{index}} {{item.message}}
  </li>
</ul>

v-for를 사용하여 객체의 속성 반복

<ul id="v-for-object" class="demo">
  <li v-for="value in myObject">{{value}}</li>
</ul>
  • 키에 대한 두번째 전달 인자를 제공할 수도 있다
<ul id="v-for-object" class="demo">
  <li v-for="(value, name) in myObject">{{name}}: {{value}}</li>
</ul>

상태유지

  • 데이터 항목의 순서가 변경된 경우 항목의 순서와 일치하도록 DOM 요소를 이동하는 대신 Vue는 각 요소를 적절한 위치에 패치하고 해당 인덱스에서 렌더링할 내용을 반영하는지 확인
  • 반복되는 DOM 내용이 단순한 경우나 의도적인 성능 향상을 위해 기본 동작에 의존하지 않는 경우를 제외하면 v-for에 key를 추가하는 것이 좋다
<div v-for="item in items" :key="item.id">
  <!-- content-->
</div>

배열 변경 감지

수정 메소드

  • push(), pop(), shift(), unshift(), splice(), sort(), reverse()

배열 교체

  • 변이 메소드는 호출된 원래 배열을 변경
  • filter(), concat(), slice()와 메소드는 배열을 변경하지 않고 새 배열을 반환한다

필터링 / 정렬된 결과 표시

  • 원본 데이터를 실제로 수정하거나 교체하지 않고 필터링되거나 정렬된 결과를 표시
const sets = ref([
  [1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10]
])

function even(numbers) {
  return numbers.filter((number) => number % 2 === 0)
}
<ul v-for="numbers in sets">
  <li v-for="n in even(numbers)">{{ n }}</li>
</ul>

숫자 범위에 v-for 사용하기

  • v-for는 정수를 사용할 수도 있다
  • n은 0부터 시작한다
<span v-for="n in 10">{{ n }}</span>

<template>에서 v-for 사용하기

  • v-if와 유사하게 <template> 태그에 v-for를 사용하여 여러 엘리먼트 블록을 렌더링할 수도 있다
<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

v-if에 v-for 사용하기

  • 같은 노드에 존재할 때 v-if가 v-for보다 우선순위가 높기 때문에 v-if 조건문에서 v-for 변수에 접근할 수 없다
<!--"todo" 속성이 인스턴스에 정의되어 있지 않기 때문에 에러가 발생한다-->
<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo.name }}
</li>

<template> 태그로 감싼 후, v-for를 옮겨서 해결할 수 있다(더 명시적이기도 함)

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

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

컴포넌트에 v-for를 직접 사용할 수 있습니다(key 사용 필수)

<MyComponent v-for="item in items" :key="item.id" />
  • 컴포넌트에는 자체적으로 구분된 범위가 있기 때문에 컴포넌틍 데이터를 자동으로 전달하지 않는다.
  • 반복된 데이터를 컴포넌트에 전달하려면 props를 사용해야 한다
<MyComponent
  v-for="(item, index) in items"
  :item="item"
  :index="index"
  :key="item.id"
/>

 

참고 : https://ko.vuejs.org/guide/essentials/list.html#v-for-with-a-component

'📗 Vue.js' 카테고리의 다른 글

Vue - 이벤트 핸들링  (0) 2023.11.29
Vue - Computed, Watch  (0) 2023.11.27
Vue - 템플릿 문법  (0) 2023.11.24
Vue - 라이프사이클  (0) 2023.11.24
  1. 조건부 렌더링
  2. 리스트 렌더링
'📗 Vue.js' 카테고리의 다른 글
  • Vue - 이벤트 핸들링
  • Vue - Computed, Watch
  • Vue - 템플릿 문법
  • Vue - 라이프사이클
zunwon
zunwon
zunwon
준원의 개발일지
zunwon
전체
오늘
어제
  • 분류 전체보기
    • 📒 JavaScript
    • 📘 TypeScript
    • React.js
    • 📗 Vue.js
    • 💻 알고리즘
      • 프로그래머스
      • 백준
    • ✏ 회고
      • 후기
    • 👨‍💻 TIL
    • 📋 오픈소스
    • 기타

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오픈소스컨트리뷰션
  • udemy
  • 자료구조
  • 인사이드아웃
  • JavaScript
  • 프로그래머스 데브코스
  • 미래내일일경험
  • 알고리즘
  • Vue.js
  • 국비지원교육
  • 데브코스
  • 프로젝트캠프
  • 함수형자바스크립트
  • 부스트캠프
  • 스나이퍼팩토리
  • 함수형 자바스크립트
  • 프론트엔드
  • next.js
  • Vue
  • vercel
  • TypeScript
  • til
  • 회고
  • githru
  • css
  • 코딩부트캠프
  • 프로그래머스
  • fontend
  • mil
  • frontend

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
zunwon
Vue - 렌더링
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.