cover

Vue는 데이터들을 보고 특정 태그들을 다시 렌더링하곤 합니다. 하지만 한번 렌더링한 이후 변할 필요없는 경우 Vue가 계속 관리하는 것은 성능에 좋지 않습니다. 그래서 이를 정적 컨텐츠로 만들고 생략하도록 하는 디렉티브가 v-once 입니다. 자세히 알아보겠습니다.


v-once 미리보기

v-once

한 번(once)이라는 뜻에 맞게, 데이터 바인딩으로 일어난 렌더링을 한 번만 하도록 하는 디렉티브입니다.

v-once 문법

다른 디렉티브와 다른 점은 값을 넣지 않고 속성 자체만 들어갑니다.

html
      <태그 v-once></태그>
    

v-once가 들어간 태그 내에도 동일하게 적용됩니다.

html
      <div v-once>
	<h1> {{ title }} </p> <!-- v-once 적용 -->
	<h2>
		<span> {{ subTitle }} <span> <!-- v-once 적용 -->
	</div>
</div>
    

v-once 예제

예를 들어 title이라는 값이 있다고 해보겠습니다.

javascript
      data() {
	return {
		title: "Welcome to Vue!"
	}
}
    

그리고 v-once를 적용한 것과 아닌 것을 비교해보겠습니다. 버튼을 클릭하면 Bye라고 문자가 바뀝니다.

html
      <h1 v-once>{{ title }}</h1>
<h1>{{ title }}</h1>

<button @click="title = 'Bye'">Button</button>
    
image

버튼 클릭시 글자가 Bye로 바뀌게 됩니다.

image

v-once 용도

데이터 바인딩을 해서 렌더링한 후 정적 컨텐츠로 바꾸는 이 기능은 어디에 쓰면 좋을까요?

v-for로 테이블, 사이드바와 같이 여러 정보를 디스플레이 하지만 바뀔 필요가 없는 경우
html
      <ul>
	<li v-for="item of list" v-once>{{ item }}</li>
</ul>
    
v-html로 렌더링할 때
html
      <article v-html="doc" v-once></article>
    

v-once 가 Vue 3부터는…

그대로 사용할 수도 있지만 v-memo라는 디렉티브가 생기면서 좀 더 다양한 용도로 사용할 수 있는데요. v-memo에 넣은 배열 중 하나의 값이라도 바뀌면 그 때서야 업데이트 합니다.

html
      <태그 v-memo="[value1, value2, ...]"></태그>