![Vue.js의 렌더링과 가정문](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3DVue.js%25EC%259D%2598%2520%25EB%25A0%258C%25EB%258D%2594%25EB%25A7%2581%25EA%25B3%25BC%2520%25EA%25B0%2580%25EC%25A0%2595%25EB%25AC%25B8%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Dvosw1&w=2048&q=75)
1. 렌더링
- 특정 조건에 따라 요소를 화면에 나타내거나 숨기는 작업
- 조건부 렌더링을 통해 특정 조건이 만족될 때만 HTML 요소를 DOM에 추가하거나 제거 가능
2. v-if
- 조건이 참일 때만 요소를 렌더링
- 조건이 거짓일 때는 요소가 DOM에서 제거
- 새롭게 생성할 경우 사용
- 같은 레벨(한 부모안에 형제)로 이어져있어야 함
- 조건문 안에 다른 태그가 들어가면 에러 발생
<template> <h2>당신의 나이는 {{ age }}입니다</h2> <p v-if="age > 18">당신은 어른입니다</p> <p v-else-if="age >50">당신은 어르신입니다</p> <p v-else>당신은 아이입니다</p> <!--같은 레벨이어야 함--> </template>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F6acadf67-53c2-4b37-a0e1-e0a64981b66c%252Fimage.png%3Ftable%3Dblock%26id%3D6d72a23a-e795-4df9-9cf6-2be8ecd81ad3%26cache%3Dv2&w=2048&q=75)
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F0a83aad1-385d-48f5-861e-35ae0dca26d3%252F094f953f-ba45-4679-ab83-24f558b6803b.png%3Ftable%3Dblock%26id%3D3946f76c-c105-4c52-95b9-300aa6f72411%26cache%3Dv2&w=2048&q=75)
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252Fd98e01f4-3498-4441-84e3-53e8835bbb18%252F1f05c52d-521f-47b9-8e33-c0746acda7cb.png%3Ftable%3Dblock%26id%3D8e107b80-b517-44ae-99ab-bef7b85f8ac6%26cache%3Dv2&w=2048&q=75)
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F7176c721-6c84-47f5-bea9-94343238d1a7%252Fcde1334b-0e48-4ad8-b133-86a76b01f153.png%3Ftable%3Dblock%26id%3Df42a2b83-0dba-4096-bcd2-71ea926b2acb%26cache%3Dv2&w=2048&q=75)
3. v-show
- 조건에 따라 요소의
display
CSS 속성을 변경
- 요소는 항상 DOM에 존재하지만, 조건이 거짓일 때는 숨겨짐
- true일 경우
<!--HTML 코드 작성--> <template> <h2 v-if="display">true -> 보입니다</h2> <h2 v-show="display">true -> 보입니다</h2> </template>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F389d2a54-f8d2-4063-8a88-5b3d395c8fa0%252Fimage.png%3Ftable%3Dblock%26id%3D3f38290c-04df-4cd9-9100-660f4ff13b6e%26cache%3Dv2&w=2048&q=75)
- false일 경우
- show는 태그만 생성이 됨
- 컴포넌트라고 많은 기능이 담긴 코드를 가져올 경우가 있음
- if와 달리 한번 생성해놓고 display만 닫았다가 열 수 있음
- 렌더링 하는데 시간이 많이 걸릴 경우 이용하면 좋음
<!--HTML 코드 작성--> <template> <h2 v-if="display">v-if 보입니다</h2> <h2 v-show="display">v-show 보입니다</h2> </template> <!--Java Script 코드 작성--> <script> export default { name: 'App', // 컴포넌트의 이름 components: {}, data() { return { age: 10, display: false }; } } </script>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F963b8e8a-76a3-4577-a50e-be487bd8b502%252Fimage.png%3Ftable%3Dblock%26id%3Db8552900-916f-4e56-9b97-97927e7c2e4c%26cache%3Dv2&w=2048&q=75)
4. 반복문
- 데이터를 기반으로 리스트나 배열의 요소를 반복해서 렌더링하는 데 사용
v-for
- 배열이나 객체의 각 항목을 반복하여 DOM 요소를 렌더링
- 반복할 데이터와 각 항목에 대한 키를 지정해야 함
- 키 속성 (
:key
) v-for
를 사용하여 반복적으로 생성되는 요소의 고유성을 식별하기 위해 사용- 각 반복 항목에 대해 고유한 값을 가짐
- 이 키를 사용하여 어떤 항목이 변경되었는지, 추가되었는지, 삭제되었는지를 추적
- 장점
- 성능 최적화
key
를 사용하여 가상 DOM과 실제 DOM 간의 차이를 더 효율적으로 계산할 수 있음- 불필요한 DOM 업데이트를 방지하고, 렌더링 성능을 향상
- 안정성
- 동일한 컴포넌트가 동일한 데이터를 가지더라도,
key
를 통해 Vue는 각 항목의 위치와 상태를 정확히 추적할 수 있음 - 데이터 변경 시에 예상치 못한 UI 문제를 방지
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252Fe7b52ba8-2388-439c-ad16-939b16be1c16%252Fimage.png%3Ftable%3Dblock%26id%3D4af5c002-e9ee-4563-a4e8-76021004f389%26cache%3Dv2&w=2048&q=75)
<!--HTML 코드 작성--> <template> <h2>{{ animals }}</h2> </template> <!--Java Script 코드 작성--> <script> export default { name: 'App', // 컴포넌트의 이름 components: {}, data() { return { age: 10, display: false, animals: ['cat', 'dog', 'rabbit', 'bird'] }; } } </script>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252Fe7d785a9-6f03-4216-98dc-3588fdb83795%252Fimage.png%3Ftable%3Dblock%26id%3D3cc69de5-0a5c-4952-8526-5f01d6820f05%26cache%3Dv2&w=2048&q=75)
- key값 사용
<template> <h2 v-for="animal in animals" :key="animal">{{ animal }}</h2> </template>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F69510db7-0dd6-46cd-a99b-6b65f36de65e%252Fimage.png%3Ftable%3Dblock%26id%3D4ed38dad-8da4-4f00-95ec-879c35cc959c%26cache%3Dv2&w=2048&q=75)
- 배열의 요소가 중복될 수 있기 때문에 배열의 인덱스를 파라미터로 받아 키로 사용
<template> <h2 v-for="(animal, index) in animals" :key="animal">{{ animal }} 인덱스는 {{ index }}</h2> </template>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F75e02700-14c1-4194-b08c-bd3675b5ee30%252Fimage.png%3Ftable%3Dblock%26id%3Ddcc28d7a-a42d-4e20-88de-44b50aa7f5da%26cache%3Dv2&w=2048&q=75)
- 오브젝트들의 배열과 인덱스를 파라미터로 받아 키로 사용
<!--HTML 코드 작성--> <template> <h2 v-for="(animal, index) in animals" :key="animal">{{ animal }} 인덱스는 {{ index }}</h2> <ul> <li v-for="(user, index) in users" :key="index">{{ user.name }}</li> </ul> </template> <!--Java Script 코드 작성--> <script> export default { name: 'App', // 컴포넌트의 이름 components: {}, data() { return { age: 10, display: false, animals: ['cat', 'dog', 'rabbit', 'bird'], users: [ {name: 'min', age: 32, gender:'woman'}, {name: 'sue', age: 30, gender:'man'} ] }; } } </script>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252Fcaf02f42-6a6a-4a75-8997-c7ee031a620e%252Fimage.png%3Ftable%3Dblock%26id%3D3ef57eb3-b560-4610-b7aa-f58a13b2a16a%26cache%3Dv2&w=2048&q=75)
<template> <h2 v-for="(animal, index) in animals" :key="animal">{{ animal }} 인덱스는 {{ index }}</h2> <ul> <li v-for="(user, index) in users" :key="index">이름은 {{ user.name }}, 나이는 {{ user.age }}, 성별은 {{ user.gender }}</li> </ul> </template>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F6f911f85-11ea-4263-be2f-c4932d707904%252Fimage.png%3Ftable%3Dblock%26id%3D79ec70b0-cad9-4981-bc70-9eb56d6d2de1%26cache%3Dv2&w=2048&q=75)
- 오브젝트 안에 배열 요소 사용
<!--HTML 코드 작성--> <template> <h2 v-for="(animal, index) in animals" :key="animal">{{ animal }} 인덱스는 {{ index }}</h2> <ul> <li v-for="(user, index) in users" :key="index">이름은 {{ user.name }}, 나이는 {{ user.age }}, 성별은 {{ user.gender }} <p v-for="hobby in user.hobbies" :key="hobby">{{ hobby }}</p> </li> </ul> </template> <!--Java Script 코드 작성--> <script> export default { name: 'App', // 컴포넌트의 이름 components: {}, data() { return { age: 10, display: false, animals: ['cat', 'dog', 'rabbit', 'bird'], users: [ {name: 'min', age: 32, gender:'woman', hobbies:["sports", "k-pop"]}, {name: 'sue', age: 30, gender:'man', hobbies:["eating", "swimming"]} ] }; } } </script>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F9765a915-991c-4857-a2ab-5dd9890126ac%252Fimage.png%3Ftable%3Dblock%26id%3Dc5aa6d8c-5517-4b7f-b693-1e63825aadc0%26cache%3Dv2&w=2048&q=75)
- v-if와 v-for는 함께 사용할 수 없음
<template> <h2 v-if="animal !='cat'" v-for="(animal, index) in animals" :key="animal">{{ animal }} 인덱스는 {{ index }}</h2> <ul> <li v-for="(user, index) in users" :key="index">이름은 {{ user.name }}, 나이는 {{ user.age }}, 성별은 {{ user.gender }} <p v-for="hobby in user.hobbies" :key="hobby">{{ hobby }}</p> </li> </ul> </template>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F178dfa03-7642-4d42-9b2d-454c8413b1ea%252Fimage.png%3Ftable%3Dblock%26id%3D24276029-a0af-44e2-aa4e-5d1c3472354b%26cache%3Dv2&w=2048&q=75)
- v-for 안에 태그를 추가하여 v-if 사용하기
<template> <h2 v-for="(animal, index) in animals" :key="animal"> <span v-if="animal != 'cat'">{{ animal }} 인덱스는 {{ index }}</span></h2> <ul> <li v-for="(user, index) in users" :key="index">이름은 {{ user.name }}, 나이는 {{ user.age }}, 성별은 {{ user.gender }} <p v-for="hobby in user.hobbies" :key="hobby">{{ hobby }}</p> </li> </ul> </template>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F1d49cb70-6989-492c-a25f-753c2db9cafc%252Fimage.png%3Ftable%3Dblock%26id%3Dae8b6c44-cff7-4120-9478-983083b2da44%26cache%3Dv2&w=2048&q=75)
- 템플릿 안에 템플릿 사용
- <template> 태그를 사용하면 반복 요소(v-for)와 조건부 렌더링(v-if)을 함께 사용할 수 있음
- <template>은 DOM에서 제거되므로 실제로 렌더링되지 않음
- 복잡한 구조를 깔끔하게 유지 가능
- HTML 구조에서 중첩된 태그를 생성하지 않고도 복잡한 구조 구성
- 추가적인 불필요한 태그가 생성되지 않아서 HTML이 더 깔끔해짐
<template> <template v-for="(animal, index) in animals" :key="animal"> <h2 v-if="animal != 'cat'">{{ animal }} 인덱스는 {{ index }}</h2> </template> </template>
![notion image](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F8a47dc81-2a0f-4b7c-854a-6cd86ec3b678%252F4c23c6d6-4579-4fe0-9b43-29a49f0da3cf%252Fimage.png%3Ftable%3Dblock%26id%3Df98883d6-6a0e-45b5-af6f-aeeb71382a11%26cache%3Dv2&w=2048&q=75)
Share article