모달 윈도
props
로 제어하는 모달 윈도우입니다.
데모
버튼을 누르면 모달 대화 상자가 열립니다.
사용하고 있는 주요 기능
입력 양식 입력 바인딩 v-model 105페이지
컴포넌트 146페이지
슬롯 169페이지
트랜지션 194페이지
소스 코드
<template>
<transition name="modal" appear>
<div class="modal modal-overlay" @click.self="$emit('close')">
<div class="modal-window">
<div class="modal-content">
<slot/>
</div>
<footer class="modal-footer">
<slot name="footer">
<button @click="$emit('close')">Close</button>
</slot>
</footer>
</div>
</div>
</transition>
</template>
<style lang="stylus" scoped>
.modal {
&.modal-overlay {
display: flex;
align-items: center;
justify-content: center;
position: fixed;
z-index: 30;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
}
&-window {
background: #fff;
border-radius: 4px;
overflow: hidden;
}
&-content {
padding: 10px 20px;
}
&-footer {
background: #ccc;
padding: 10px;
text-align: right;
}
}
// 오버레이 트랜지션
.modal-enter-active, .modal-leave-active {
transition: opacity 0.4s;
// 오버레이에 포함되어 있는 모달 윈도의 트랜지션
.modal-window {
transition: opacity 0.4s, transform 0.4s;
}
}
// 딜레이가 적용된 모달 윈도가 제거된 후에 오버레이가 사라짐
.modal-leave-active {
transition: opacity 0.6s ease 0.4s;
}
.modal-enter, .modal-leave-to {
opacity: 0;
.modal-window {
opacity: 0;
transform: translateY(-20px);
}
}
</style>
<template>
<div class="example-modal-window">
<p>버튼을 누르면 모달 대화 상자가 열립니다.</p>
<button @click="openModal">열기</button>
<!-- 컴포넌트 MyModal -->
<MyModal @close="closeModal" v-if="modal">
<!-- default 슬롯 콘텐츠 -->
<p>Vue.js Modal Window!</p>
<div><input v-model="message"></div>
<!-- /default -->
<!-- footer 슬롯 콘텐츠 -->
<template slot="footer">
<button @click="doSend">제출</button>
</template>
<!-- /footer -->
</MyModal>
</div>
</template>
<script>
import MyModal from './MyModal.vue'
export default {
components: { MyModal },
data() {
return {
modal: false,
message: ''
}
},
methods: {
openModal() {
this.modal = true
},
closeModal() {
this.modal = false
},
doSend() {
if (this.message.length > 0) {
alert(this.message)
this.message = ''
this.closeModal()
} else {
alert('메시지를 입력해주세요.')
}
}
}
}
</script>