728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ค๋์ ๋ชจ๋ฌ์ฐฝ UI ์ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด์๋ค.
- ์ด๋ฏธ ๋ชจ๋ฌ์ฐฝ UI ์ ๊ด๋ จํด์๋ JavaScript ๋ React ๋ก๋ ๋ง์ด ๋ง๋ค์ด๋ดค๊ธฐ ๋๋ฌธ์ ๋ง๋๋ ๊ณผ์ ๋ง ์ ๊ธฐ์ตํ๊ณ ์์ผ๋ฉด ๋ฌธ๋ฒ๋ง ์กฐ๊ธ์ฉ ๋ฐ๊ฟ์ฃผ๋ฉด ๋์ด ์ด๋ ค์ด ์ ์ ์์๋ค.
- ๊ทธ๋์ ์ํ๋ช ์ ํด๋ฆญํ๋ฉด ๋ชจ๋ฌ์ฐฝ UI ๋ฅผ ๋์ฐ๊ณ , ๋ชจ๋ฌ์ฐฝ ๋ด์์ ๋ซ๊ธฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ชจ๋ฌ์ฐฝ UI ๋ฅผ ์จ๊ธฐ๋ ๊ฒ์ ๊ทธ์น์ง ์๊ณ ๊ตฌ๊ธ๋ง์ ํตํด ์ด๋์ด ๋ฐฐ๊ฒฝ์ ํด๋ฆญํ์ ๋์๋ ๋ชจ๋ฌ์ฐฝ์ด ๋ซํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ ํด์ฃผ์๋ค.
- ์ฒ์์ ์๋๋ฅผ ํ์ ๋์๋ ๋ซ๊ธฐ ๋ฒํผ๊ณผ ๋ชจ๋ฌ์ฐฝ์ ํ์ ๋ฐฐ๊ฒฝ๋ง ํด๋ฆญํด๋ด์ ์ ๋๋ ์ค ์์๋๋ฐ, ์ด๊ฒ์ ๊ฒ ๋๋ฅด๋ค๋ณด๋ ์ฝ๋๋ฅผ ์๋ชป ์์ฑํ๋์ง ๋ชจ๋ฌ์ฐฝ ๋ด์ ๋ด์ฉ์ ํด๋ฆญํ๋ฉด ๋ชจ๋ฌ์ฐฝ์ด ๋ซํ๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๋ ๋ฐ์ํด์ ๋นํฉ์ค๋ฌ์ ์ง๋ง ์ฝ๋๋ฅผ ๋ค์ ์์ฑํด์ ์ด์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ ์ ์ ์๋ค.
๐ ๋ค์ด๊ฐ๊ธฐ ์ ์
- ์ค๋์ ์ํ๋ช ์ ํด๋ฆญํ๋ฉด ์์ธ ํ์ด์ง๊ฐ ๋ชจ๋ฌ์ฐฝ์ ํํ๋ก ๋จ๋๋ก ๋ง๋ค์ด๋ณด์๋ค.
- ๋ชจ๋ฌ์ฐฝ์ด๋ ์์ ๊ฐ์ด ๊ธฐ์กด ํ์ด์ง๊ฐ ์ด๋ก๊ฒ ๋ฐฐ๊ฒฝ์ฒ๋ผ ๋ฐ๋๊ณ ๊ทธ ์์ ํ์ ์ฐฝ์ด ๋ณด์ด๋ UI ๋ฅผ ๋งํ๋ค.
- Vue ๋ก ๋ชจ๋ฌ์ฐฝ๊ณผ ๊ฐ์ด ๋์ ์ธ UI ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋จผ์ HTML UI ๋ ์ด์์์ html ๋ฐ css ๋ก ์์ฑํ์ฌ ๋์์ธํ๋ค.
- ๋ง๋ HTML UI ์ ์ํ๋ฅผ ๋ฐ์ดํฐ๋ก ์ ์ฅํด๋๋ค.
(์๋ฅผ ๋ค์ด ๋ชจ๋ฌ์ฐฝ์ด ๋ณด์ด๋ ์ํ๋ true, ์ ๋ณด์ด๋ ์ํ๋ false!) - HTML UI ๋ฅผ ์ธ์ ๋ณด์ฌ์ฃผ๊ณ ์ธ์ ๋ณด์ฌ์ฃผ์ง ์์์ง๋ฅผ Vue ๋ฌธ๋ฒ์ ์ด์ฉํด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๐ Vue ๋ก ๋ง๋๋ ํ๋ก์ ํธ์ ์ด๋ฏธ์ง ๋ฃ๊ธฐ
<img src='./์ด๋ฏธ์ง๊ฒฝ๋ก'>
- ์ด๋ฏธ์ง๋ฅผ src ํด๋ ์์ ๊ทธ๋ฅ ๋ฃ๋ ์ง, ํ์ ํด๋๋ฅผ ์์ฑํด์ ๋ฃ๋ ์ง ์ํ๋ ๋ฐฉ์๋๋ก ๋ฃ์ด์ค ํ์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ด๋ฏธ์ง๊ฐ ๋์จ๋ค.
- Vue ํ๋ก์ ํธ ํด๋ ์์๋ src ํด๋ ๋ง๊ณ ๋ public ํด๋๊ฐ ์๋๋ฐ, public ํด๋์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ ๊ฑฐ๋ผ๋ฉด '/์ด๋ฏธ์ง๊ฒฝ๋ก' ์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
- ์ฐธ๊ณ ๋ก public ํด๋์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ผ๋ฉด ๋์ค์ ๋ฐํํ ๋ ์ด๋ฏธ์ง์ ์ด๋ฆ์ด ๋ณํ์ง ์๋ ๋ฐ๋ฉด, src ํด๋์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ผ๋ฉด ์์๋ก ์ด๋ฏธ์ง์ ์ด๋ฆ์ด ๋ฐ๋๋ค.
๐ ๋ชจ๋ฌ์ฐฝ ๋ง๋ค๊ธฐ
๐ค ๋ชจ๋ฌ์ฐฝ UI ๋ ์ด์์ ๋ง๋ค๊ธฐ
- ๋ญ๊ฐ ๋ฒํผ์ ๋๋ ์ ๋ ๋ชจ๋ฌ์ฐฝ์ ๋์ฐ๊ณ ์ถ๋ค๋ฉด ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ ์ ๋ชจ๋ฌ์ฐฝ UI ๋ ์ด์์๋ถํฐ html, css ๋ก ๋์์ธ์ ํด์ฃผ์ด์ผ ํ๋ค.
- ์๋ํ๋ฉด ๊ฐ์๊ธฐ ๋ฑ์ฅํ๋ ๋์ ์ธ UI ๋ค์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ ์ ๋ณด์ด๊ฒ ์จ๊ฒจ๋์๋ค๊ฐ ์ํ๋ ๋์ UI ๋ฅผ ๋ณด์ด๊ฒ ๋์์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
<div class="black-bg">
<div class="white-bg">
<h4>์์ธํ์ด์ง</h4>
<p>์์ธํ์ด์ง ๋ด์ฉ</p>
<button class="close">๋ซ๊ธฐ</button>
</div>
</div>
- ๋ชจ๋ฌ์ฐฝ html ์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ํ๋ฉด ์ ์ฒด๋ฅผ ๋ฎ๋ ํ์์ผ๋ก ๋ง๋ค์ด์ ธ์ผ ํ๋ฏ๋ก ๋ค๋ฅธ html ํ๊ทธ๋ค๋ณด๋ค ์๋จ์ ์ ์ด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
.black-bg {
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.6);
position: fixed;
}
.white-bg {
width: 90%;
margin: 80px auto;
background: white;
border-radius: 5px;
padding: 20px 0;
}
.close {
cursor: pointer;
border: none;
background: #6667AB;
color: white;
font-weight: bold;
border-radius: 5px;
padding: 5px 15px;
}
.close:hover {
color:white;
font-weight: bold;
transform: scale(1.1);
transition: all 0.5s;
}
๐ค ๋ชจ๋ฌ์ฐฝ UI ์ํ๋ฅผ ๋ฐ์ดํฐ๋ก ์ ์ฅํ๊ธฐ
data(){
return {
openModal : false,
}
- ๋ชจ๋ฌ์ฐฝ์ ๊ฒฝ์ฐ ๋ณด์ด๊ฑฐ๋ / ๋ณด์ด์ง ์๊ฑฐ๋, ์ด๋ ๊ฒ ๋ ๊ฐ์ง์ ์ํ๋ง ์กด์ฌํ๋ค.
- ๋ฐ๋ผ์ ๋ณด์ด๋ ์ํ๋ฅผ true, ๋ณด์ด์ง ์๋ ์ํ๋ฅผ false ๋ก ์ ํ ํ์, ์ด๊ธฐ๊ฐ์ผ๋ก๋ ๋ณด์ด์ง ์๋๋ก false ๋ก data ๋ณด๊ดํจ์ openModal ์ ์ ์ฅํด๋์๋ค.
- ๋๋ boolean ํํ๊ฐ ์ต์ํด์ ์์ ๊ฐ์ด true/false ๋ก ์ํ๋ฅผ ์ ํ ๊ฑฐ์ง, ์ด ๋ถ๋ถ์ ์ ํ๋ ์ฌ๋ ๋ง์์ด๋ผ ์ฌ์ค 0 ๊ณผ 1 ์ด๋ฐ ์์ผ๋ก ํํํด๋ ์๊ด ์๋ค.
๐ค ๋ชจ๋ฌ์ฐฝ UI ๋ฅผ ์ธ์ ๋ณด์ฌ์ค์ง/๋ณด์ฌ์ฃผ์ง ์์์ง Vue ๋ฌธ๋ฒ์ผ๋ก ์์ฑํ๊ธฐ
<div class="black-bg" v-if="openModal == true">
<div class="white-bg">
<h4>์์ธํ์ด์ง</h4>
<p>์์ธํ์ด์ง ๋ด์ฉ</p>
<button class="close">๋ซ๊ธฐ</button>
</div>
</div>
- ๋ชจ๋ฌ์ฐฝ์ ๋ณด์ฌ์ฃผ๋ ๊ฒฝ์ฐ์ ์ํ๋ฅผ true, ๋ณด์ฌ์ฃผ์ง ์์ ๊ฒฝ์ฐ์ ์ํ๋ฅผ false ๋ผ๊ณ ํ๊ธฐ๋ก ์ ํ๋ค.
- ๋ฐ๋ผ์ ์ด์ ๋ฐ๋ผ html ํ๊ทธ ์์ v-if='์กฐ๊ฑด์' ์ ์์ฑํด์ฃผ๋ฉด ๋๋๋ฐ, ์ด ๋ฌธ๋ฒ์ ์กฐ๊ฑด์์ด ์ฐธ์ผ ๋์๋ง html ์ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ฏ๋ก ์กฐ๊ฑด์์ openModal == true ๋ก ์์ฑํ๋ฉด ๋๋ค.
- ์ด ๋ ๋ฑํธ๋ฅผ 1๊ฐ ์ฐ๋ ๊ฒ๊ณผ 2๊ฐ ์ฐ๋ ๊ฒ์ ๋ค๋ฅด๋ ์ฃผ์ํด์ผ ํ๋ค.
- ๋ฑํธ๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ์๋ openModal ์ ์ ์ฅ๋ ๊ฐ์ ๋ฐ๋ก true ๋ก ๋ฐ๊พธ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋๊ณ , ๊ทธ์ ๋ฐ๋ผ ๋ชจ๋ฌ์ฐฝ์ด ๋ฐ๋ก ๋ณด์ฌ์ง๊ฒ ๋๋ค.
- ๋ฑํธ๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ด๋ค ์กฐ๊ฑด์ ์ํด openModal ์ด true ๋ก ๋ฐ๋๋ ๊ฒฝ์ฐ์๋ง ๋ชจ๋ฌ์ฐฝ์ ๋ณด์ฌ์ค๋ค๋ ์๋ฏธ๊ฐ ๋๋ค.
๐ค ๋ชจ๋ฌ์ฐฝ UI ๋ฅผ ๋์ฐ๊ณ ๋ซ์ ์ ์๋ ์ค์์น ๋ง๋ค๊ธฐ
// template ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ํ์ํ ๋ถ๋ถ๋ง ๋น ๋ฅด๊ฒ ๋ณผ ์ ์๋๋ก ๋ถํ์ํ ๋ด์ฉ์ ์ ์ธํ๋ค.
<div class="black-bg" v-if="openModal == true" @click="close($event)">
<div class="white-bg">
<h4>์์ธํ์ด์ง</h4>
<p>์์ธํ์ด์ง ๋ด์ฉ</p>
<button class="close">๋ซ๊ธฐ</button>
</div>
</div>
<div class="card">
<img src="./assets/images/room0.jpg" class="room-image">
<h4 class="room-name" @click="openModal = true">{{rooms[0]}}</h4>
<p>{{ prices[0] }}๋ง์</p>
<button @click="increase(0)">ํ์๋งค๋ฌผ์ ๊ณ </button> <span>์ ๊ณ ์: {{ report[0] }}</span>
</div>
// script ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ํ์ํ ๋ถ๋ถ๋ง ๋น ๋ฅด๊ฒ ๋ณผ ์ ์๋๋ก ๋ถํ์ํ ๋ด์ฉ์ ์ ์ธํ๋ค.
<script>
export default {
name: "App",
data(){
return {
openModal : false,
}
},
methods: {
close(event){
if(event.target.classList.contains('black-bg') || event.target.classList.contains('close')){
this.openModal = false;
} else if (event.target.classList.contains('white-bg')){
this.openModal = true;
}
}
},
};
</script>
- ๋ชจ๋ฌ์ฐฝ UI ์ ๋ํ ๋ชจ๋ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์๋ฃํ๊ณ ์ด์ ํน์ ํ์ ํน์ ์กฐ๊ฑด์ ์ํด ๋ชจ๋ฌ์ฐฝ UI ๊ฐ ๋ณด์ด๊ฒ ํน์ ๋ณด์ด์ง ์๋๋ก ํด๋ณด์๋ค.
- ๋ด๊ฐ ์๊ฐํ ๋ฐฉ๋ฒ์ ์ํ๋ช ์ ํด๋ฆญํ์ ๋๋ ๋ชจ๋ฌ์ฐฝ์ ๋์ฐ๊ณ , ๋ชจ๋ฌ์ฐฝ ๋ด์ ๋ซ๊ธฐ ๋ฒํผ์ด๋ ์ด๋์ด ๋ฐฐ๊ฒฝํ๋ฉด์ ํด๋ฆญํ๋ฉด ๋ชจ๋ฌ์ฐฝ์ด ๋ซํ๊ฒ ํ๋ ๊ฒ์ด์๋ค.
- ๋จผ์ , html ์ฝ๋์์ ๋ชจ๋ฌ์ฐฝ ์ต์๋จ์ ํด๋นํ๋ black-bg ๋ผ๋ class ๋ฅผ ๊ฐ์ง div ํ๊ทธ์ @click=close($event) ๋ผ๊ณ ์์ฑํด์ฃผ์๋ค.
- ๋ชจ๋ฌ์ฐฝ์ด ๋์์ง ์ํ์์ ๋ด๊ฐ ํด๋ฆญํ ์์๊ฐ black-bg ๋ผ๋ class ์ ํด๋นํ๊ฑฐ๋ close ๋ผ๋ class ์ ํด๋นํ๋ฉด ๋ชจ๋ฌ์ฐฝ์ด ๋ซํ์ผ ํ๊ณ , white-bg ์ ํด๋นํ๋ฉด ๊ณ์ ๋ชจ๋ฌ์ฐฝ์ด ์ด๋ ค์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ํด๋ฆญํ ์์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
- ๊ตฌ๊ธ๋งํ ๊ฒฐ๊ณผ $event ๊ฐ ํด๋ฆญํ ์์์ ํด๋นํจ์ ์ ์ ์์๊ณ ์ด๊ฑธ close() ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๋๋จธ์ง ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
- close ๋ผ๋ class ๋ฅผ ๊ฐ์ง button ํ๊ทธ์ ๋ฐ๋ก @click ์์ฑ์ ๋ถ์ฌํ์ง ์์ ์ด์ ๋ ์ด์ฐจํผ ์ต์๋จ ํ๊ทธ์ @click ์์ฑ์ด ํ์ ํ๊ทธ๋ค์ ์ํฅ์ ๋ฏธ์ณ์ ํ์์ฑ์ด ์์ด์ก๊ธฐ ๋๋ฌธ์ด๋ค.
- data ๋ณด๊ดํจ์ ์ ์ฅ๋ openModal ์ close() ํจ์์์ ์ฌ์ฉํ๋ ค๋ฉด this ๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํด์ฃผ๋ ๊ฒ๋ ์์ด์๋ ์๋๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] ๋ชจ๋ฌ์ฐฝ ๋ด์ ์์ธ ํ์ด์ง ๋ง๋ค๊ธฐ (0) | 2022.04.01 |
---|---|
[Vue.js] import / export ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํ๊ธฐ (0) | 2022.04.01 |
[Vue.js] Vue ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก click ๊ฐ์งํ๊ธฐ (0) | 2022.04.01 |
[Vue.js] Vue ๋ฐ๋ณต๋ฌธ v-for ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.31 |
[Vue.js] Vue ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํ๊ธฐ (0) | 2022.03.31 |