v-if는 조건이 참(true)일 때만 해당 HTML 요소를 화면에 그리고, 거짓(false)이면 아예 그리지 않습니다.
정말로 DOM 트리에서 요소를 제거하거나 추가하는 방식입니다.
예를 들어, 사용자가 로그인했는지 여부를 나타내는 isLoggedIn이라는 데이터가 있다고 상상해 봅시다.
<button v-if="isLoggedIn">로그아웃</button>
위 코드에서 isLoggedIn이 true이면 '로그아웃' 버튼이 화면에 보입니다.
만약 false가 되면, 버튼은 DOM에서 완전히 사라져서 마치 처음부터 없었던 것처럼 됩니다.
v-else와 v-else-if를 함께 사용하면 더 다양한 조건을 처리할 수 있습니다.
마치 자바스크립트의 if-else if-else 구문과 같습니다.
v-show도 v-if처럼 조건에 따라 요소를 보여주거나 숨깁니다. 하지만 결정적인 차이가 있습니다.
v-show는 조건이 false가 되어도 요소를 DOM에서 제거하지 않습니다.
대신 CSS의 display: none; 속성을 이용해 화면에서 보이지 않게 숨길 뿐입니다.
항상 DOM에 존재하기 때문에, 초기 렌더링 비용은 v-if보다 높을 수 있습니다.
<h1 v-show="isOk">안녕하세요!</h1>
위 코드는 isOk 값에 따라 '안녕하세요!'라는 텍스트를 보여주거나 숨깁니다.
isOk가 false여도 개발자 도구로 보면 h1 태그는 존재하고 style="display: none;"이 적용된 것을 확인할 수 있습니다.
면접에서 이 둘의 차이점을 묻는 경우가 종종 있습니다.
핵심을 정리해 드릴 테니 잘 기억해 두세요.
v-if
조건이 자주 바뀌지 않을 때 사용합니다.
예를 들어, 사용자의 등급에 따라 한 번 화면이 그려지면 잘 바뀌지 않는 경우에 적합합니다.
토글(보여주고 숨기는 것) 비용이 v-show보다 높습니다.
왜냐하면 DOM 요소를 직접 추가하고 제거하는 과정이 CSS 속성을 바꾸는 것보다 더 많은 연산을 필요로 하기 때문입니다.
v-show
매우 자주 보여주고 숨겨야 하는 요소에 사용합니다.
예를 들어, 사용자가 버튼을 클릭할 때마다 나타났다 사라지는 모달 창 같은 경우입니다.
초기 렌더링 비용은 더 들지만, 토글 비용이 훨씬 낮습니다.
결국,
성능
과 관련이 있습니다.
컴퓨터가 일을 덜 하도록 상황에 맞는 도구를 선택하는 것이 좋은 개발자의 덕목이라고 할 수 있습니다.
에만 적용됩니다.
다른 컴포넌트에서 똑같이 .message라는 클래스 이름을 사용하더라도 서로의 스타일에 전혀 영향을 주지 않습니다.
Vue는 이 기능을 구현하기 위해 컴파일 과정에서 HTML 요소에 data-v-xxxx 형태의 고유한 속성을 추가하고, CSS 셀렉터에도 해당 속성을 추가하여 스타일의 범위를 제한합니다.
따라서 개발자는 다른 컴포넌트와의 충돌 걱정 없이 편안하게 스타일을 작성할 수 있습니다.
물론 프로젝트 전체에서 공통으로 사용될 버튼 스타일이나 폰트 설정 등은 전역으로 관리하는 것이 효율적입니다.
이런 경우, assets 폴더 등에 main.css 같은 파일을 만들고, 이를 main.js 파일에서 import하여 전역으로 적용할 수 있습니다.
대부분의 프로젝트는 전역 스타일과 컴포넌트별 scoped 스타일을 함께 사용하는 방식을 택합니다.