강의 목표 : v-if
를 이용하여 조건에 따라 다른 HTML 요소를 표시하기.
1. main.js에 양말의 재고 여부를 위한 data object, inStock boolean,을 만든다. boolean은 true
//main.js
const app = Vue.createApp({
data(){
return{
product: "Socks",
image: "./assets/images/socks_blue.jpg",
inStock: true
}
}
})
2. p
tag 두 개를 만들고 하나는 In Stock, 다른 하나는 Out of Stock 만들기
//index.html
<p> In Stock <p>
<p> Out of Stock </p>
3. p
tag에 v-if
, v-else
directive 연결
v-else
에 inStock 문구 삽입은 생략해도 된다. 또한, 간단한 조건문이기 때문에 v-else
directive가 없어도 된다. //index.html
<p v-if="inStock"> In Stock <p>
<p v-else> Out of Stock </p>
v-show
v-if
처럼 DOM에서 엘레먼트를 추가/삭제 하는 대신v-show
는 단순히 요소의 visibility를 toggle한다.
예를 들어 모달과 같이 자주 꺼지고 화면에 표시되는 항목이 있는 경우 더 성능이 좋은 옵션임.
<p v-show="inStock"> In Stock </p>
element가 DOM에서 삭제된거 아님. 그냥 숨어있음
인생도 쇼핑몰도 true, false 값으로 간단하면 참 좋겠지만 얽힌 실타래 같이 복잡한게 우리네 인생 조건부.... 그러므로 이 코드에 조건부 로직을 만듭니다.
1. data object에 inStock을 inventory로 대체 후 integer(정수)값을 넣는다.
//main.js
const app = Vue.createApp({
data(){
return{
product: "Socks",
image: "./assets/images/socks_blue.jpg",
inventory: 100 //양말 재고 100 켤레
}
}
})
2. 재고 유무 표시을 위한 조건 만들기
: 만약 inventory가 10보다 크면 In Stock, 10 보다 작으면 Out of Stock을 브라우저에 띄운다
//index.html
<p v-if="inventory > 10"> In Stock <p>
<p v-else> Out of Stock </p>
3. v-if
와 v-else
사이에 v-else-if
삽입
: 만약 inventory가 10보다 작거나 같고 0보다 크면 Almost Sold out !! 이라고 재고가 거의 없음을 알린다.
//index.html
<p v-if="inventory > 10"> In Stock <p>
<p v-else-if="inventory <= 10 && inventory > 0"> Almost Sold out!! </p>
<p v-else> Out of Stock </p>
재고 88, 아직 여유있다.
7 켤레 남음.. 고민은 품절을 일으킬 뿐
하얗게 다 팔았습니다..
p
tag that says: 'On sale', whenever 'onSale' is true.code challenge 정답
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Vue Mastery</title>
<!-- Import Styles -->
<link rel="stylesheet" href="./assets/styles.css" />
<!-- Import Vue.js -->
<script src="https://unpkg.com/vue@3.0.11/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<div class="nav-bar"></div>
<div class="product-display">
<div class="product-container">
<div class="product-image">
<img v-bind:src="image">
</div>
<div class="product-info">
<h1>{{ product }}</h1>
<!-- <p v-if="onSale">onSale</p> -->
<p v-if="inventory > 10">In Stock</p>
<p v-else-if="inventory <= 10 && inventory > 0">Almost sold out</p>
<p v-else>Out of Stock</p>
<p v-if="onSale"> On Sale! </p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Import App -->
<script src="./main.js"></script>
<!-- Mount App -->
<script>
const mountedApp = app.mount('#app')
</script>
</body>
</html>
//main.js
const app = Vue.createApp({
data() {
return {
product: "Socks",
image: "./assets/images/socks_blue.jpg",
inventory: 100,
onSale: true,
};
},
});