v-if
v-if
디렉티브는 조건에 따른 블록을 렌더링한다.
v-if는 디렉티브이기 때문에 하나의 엘리먼트에 추가해야 한다.
리액트 컴포넌트가 하나의 루트를 갖는것으로 이해하면될까?
하나 이상의 엘리먼트를 트랜지션하려면 보이지 않는 래퍼 역할을 하는 <template>
엘리먼트에 v-if를 사용할 수 있다. 리액트에서 React.Fragment와 같은 역할을 하는 것 같다. 최종 렌더링 결과에는 <template>
엘리먼트가 포함되지 않는다.
v-if
, v-else
, v-else-if
가 있다.
key
의 역할vue는 엘리먼트를 처음부터 리렌더링하지 않고, 재사용하면서 엘리먼트를 최대한 효율적으로 렌더링하고자 한다.
하지만, 이것을 의도하지 않을 때도 있다. 따라서 key
속성을 추가하여, 두 엘리먼트는 완전히 별개이니 재사용하지 않아야 함을 알려야 한다.
Key 값은 유니크해야 한다.
<template v-if="loginType === 'username'">
<label>사용자 이름</label>
<input placeholder="사용자 이름을 입력하세요" key="username-input">
</template>
<template v-else>
<label>이메일</label>
<input placeholder="이메일 주소를 입력하세요" key="email-input">
</template>
여기서 <label>
엘리먼트는 key
속성이 없기 때문에, 효율적으로 재사용된다.
v-show
v-show 또한 마찬가지로 조건부 렌더링을 해준다.
<h1 v-show="ok">Hello!</h1>
v-if
v-if는 이벤트 리스너와 자식 컴포넌트가 완전히 제거되거나 새로 생성되도록 한다. 또한, v-if는 lazy하다. 처음 렌더링될때 초기 조건이 false라면 조건 블락은 렌더링되지 않는다.
v-show
초기 조건 여부와 관계없이 무조건 렌더링된다. 토글은 css의 display 속성을 변경시킴으로써 이루어지게 된다.
결론
v-if는 토글하는데 비용이 크고, v-show는 초기 렌더링하는데 비용이 크다. 따라서 토글이 많이 일어나는 경우는 v-show, 토글이 자주 안일어나고 조건이 자주 안변경될 것 같으면 v-if를 사용하면 된다.
v-if와 v-for를 같이 사용하는것은 권장되지 않는다.
만약 둘을 같이 사용한다면, v-for가 더 우선순위가 높다.
v-for을 이용해서 리스트를 렌더링하낟.
item in items
형태로 반복된다.
두 번째 인자에 인덱스가 전달된다.
<ul id="example-2">
<li v-for="(item, index) in items">
{{ parentMessage }} - {{ index }} - {{ item.message }}
</li>
</ul>
객체를 순회해서 보여줄 수 있다.
순서는 value, key, index이다.
<ul id="v-for-object" class="demo">
<li v-for="(value, key, index) in object">
{{ value }} - {{key}} - {{index}}
</li>
</ul>
const objectList = new Vue({
el: '#v-for-object',
data: {
object: {
title: 'How to do lists in Vue',
author: 'Jane Doe',
publishedAt: '2016-04-10',
},
},
});
in-place patch
Vue가 v-for에서 렌더링된 엘리먼트의 목록을 갱신할 때, in-place patch 전략을 사용한다.
데이타의 순서가 변경되었을 때, DOM 엘리먼트를 옮기기보다는, 뷰는 엘리먼트를 적절한 위치에서 patch시키고, 해당 인덱스에서 렌더링할 내용을 반영하는지를 확인한다.
이 기본 모드가 효율적이지만, 리스트의 결과가 자식 컴포넌트 상태에 의존적이지 않고, 임시의 DOM 상태(e.g. form input values)에 의존하지 않을 때 적합하다.
=> 왜❓
DOM은 개별 요소를 추적하고, 기존 엘리먼트를 재사용, 재정렬하기 위해 고유한 key
를 각각 제공해야 한다. key는 고유한 아이디여야 하며, primitive type이어야 한다.
<div v-for="item in items" v-bind:key="item.id">
<!-- content -->
</div>
or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Syncing