<template> <!--<transition :name="transition">--> <div v-show="showModal" :class="active" class="modal-backdrop" @touchstart="hideModal"> <div class="modal-backdrop-bg"/> <div :class="[modalClass,cusClass]" class="modal slide-in-up" @touchstart="start" @mousedown="start"> <slot/> </div> </div> <!--</transition>--> </template> <script> export default { name: 'Modal', props: { value: Boolean, // eslint-disable-line position: { type: String, default: 'bottom', }, cusClass: { type: String, default: '', }, }, data () { return { showModal: false, state: 0, } }, computed: { transition () { return this.position === 'bottom' ? 'slide-in-up' : 'slide-in-down' }, active () { return this.showModal ? 'active' : 'hide' }, modalClass () { let mclass if (this.state === 1) { mclass = 'active' } else if (this.state === 2) { mclass = 'ng-enter ng-enter-active active' } else if (this.state === 3) { mclass = 'ng-leave ng-leave-active' } return mclass }, }, watch: { value (val) { this.showModal = val this.state = 1 setTimeout(() => { this.state = 2 setTimeout(() => { }, 400) }, 50) }, showModal (val) { // 标签用法时需要发射一个input事件,修改v-model绑定的属性值 this.$emit('input', val) }, }, methods: { preventDefault (e) { // e.stopPropagation(); }, start (e) { e.stopPropagation() }, hideModal () { this.state = 3 setTimeout(() => { this.state = 0 this.showModal = false }, 250) }, }, } </script> <style scoped lang="less"> </style>