<template> <view @click.stop="overCloseCHange" v-if="show" class="tm-dialog fixed flex-center" :style="{ height: sysinfo + 'px' }" > <view @click.stop="" :class="[show ? 'success' : '']"> <view :class="[clickOverlay ? 'clickover' : '']"> <tm-sheet :black="black_tmeme" :padding="[0, 0]" classname="overflow" :width="600" :round="round" shadow="10"> <view class="text-size-g flex-center text-weight-b px-32 pt-32 " :class="[black_tmeme ? 'bk' : '', bottomBorder ? 'border-b-1' : '']"> <slot name="title">{{ title }}</slot> </view> <view class="px-50 py-n12 text-size-n text-align-center" style="max-height:700rpx;overflow-y: auto;"> <slot name="default"> <view > <text :class="[black_tmeme ? 'text-white' : 'text-grey-darken-3']">{{ content }}</text> <view v-if="model == 'confirm'" class="pt-24"> <tm-input bg-color="grey-lighten-5" @input="suren" :placeholder="placeholder" :black="black_tmeme" v-model="inputValSd" :border-bottom="false" :flat="true"></tm-input> </view> </view> </slot> </view> <slot name="button"> <view v-if="theme == 'merge'" class="py-0 flex-between"> <tm-button :fllowTheme="fllowTheme" :height="80" text :black="black_tmeme" @click="concelClick" v-if="showCancel" :theme="black_tmeme ? 'grey-darken-4' : color_tmeme" round="0" shadow="0" style="width: 50%;" block > {{ cancelText }} </tm-button> <tm-button :fllowTheme="fllowTheme" :height="80" :black="black_tmeme" @click="confirmClick" :theme="color_tmeme" round="0" shadow="0" :style="{ width: showCancel ? '50%' : '100%' }" block > {{ confirmText }} </tm-button> </view> <view v-if="theme == 'split'" class="px-40 pb-40 flex-between"> <tm-button :fllowTheme="fllowTheme" text :height="72" :black="black_tmeme" @click="concelClick" v-if="showCancel" :theme="black_tmeme ? 'grey-darken-4' : color_tmeme" round="24" font-size="30" shadow="0" style="width: 46%;" block > {{ cancelText }} </tm-button> <tm-button :fllowTheme="fllowTheme" :height="72" :black="black_tmeme" @click="confirmClick" :theme="color_tmeme" round="24" font-size="30" shadow="0" :style="{ width: showCancel ? '46%' : '100%' }" block > {{ confirmText }} </tm-button> </view> </slot> </tm-sheet> </view> </view> </view> </template> <script> /** * 对话框 * @property {Boolean} value = [] 显示对话框,推荐使用value.sync或者v-model * @property {Boolean} black = [] 暗黑模式。 * @property {Boolean} bottom-border = [] true,是否显示标题正文的边线。 * @property {String} confirmColor = [] 默认:primary,确认按钮的主题颜色 * @property {String} confirmText = [] 默认:确认,确认按钮的文字 * @property {Boolean} showCancel = [] 默认:true,是否显示取消按钮。 * @property {Boolean} disabled = [] 默认:false,禁用后,点击哪都关闭不了,只能通过手动设置v-model来关闭窗体。 * @property {String} cancelColor = [] 默认:primary,取消按钮的主题色。 * @property {String} cancelText = [] 默认:取消,取消按钮显示的文字。 * @property {String} title = [] 默认:提示,标题。 * @property {String} content = [] 默认:'',内容文字 * @property {String} theme = [merge|split] 默认:'merge',merge合并按钮,split分割按钮 * @property {String} model = [dialog|confirm] 默认:'dialog',对话框类型.dialog|confirm * @property {Number|String} round = [] 默认:'4',圆角 * @property {String} input-val = [] 默认:'',model=confirm,显示的输入框内容。confirm * @property {Boolean} over-close = [] 默认:true,点击遮罩是否关闭窗体。 * @property {Function} confirm 确认按钮时触发,注意:如果类型为confirm则返回 的参数包含输入框的内容。 * @property {Function} cancel 点击取消按钮时触发。 * @example <tm-dialog v-model="show" content="这是测试的内容"></tm-dialog> */ import tmSheet from '@/tm-vuetify/components/tm-sheet/tm-sheet.vue'; import tmButton from '@/tm-vuetify/components/tm-button/tm-button.vue'; import tmInput from '@/tm-vuetify/components/tm-input/tm-input.vue'; export default { components: { tmSheet, tmButton, tmInput }, name: 'tm-dialog', model: { prop: 'value', event: 'input' }, props: { placeholder:{ type:String, default:'请输入' }, value: { type: Boolean, default: false }, bottomBorder: { type: Boolean, default: false }, black: { type: Boolean | String, default: null }, confirmColor: { type: String, default: 'primary' }, confirmText: { type: String, default: '确认' }, showCancel: { type: Boolean, default: true }, cancelColor: { type: String, default: 'primary' }, cancelText: { type: String, default: '取消' }, title: { type: String, default: '消息提示' }, content: { type: String, default: '' }, // 样式。 theme: { type: String, default: 'merge' //merge|split merge合并按钮,split分割按钮 }, // 对话框类型.dialog|confirm model: { type: String, default: 'dialog' // dialog|confirm }, round: { type: Number | String, default: 8 }, inputVal: { type: String, default: '' }, // 跟随主题色的改变而改变。 fllowTheme: { type: Boolean | String, default: true }, overClose: { type: Boolean | String, default: false }, //如果为true,需要你手动关闭。点按钮关闭不了。 disabled: { type: Boolean | String, default: false } }, computed: { show: { get: function() { return this.value; }, set: async function(val) { this.$emit('input', val); this.$emit('update:value', val); } }, black_tmeme: function() { if (this.black !== null) return this.black; return this.$tm.vx.state().tmVuetify.black; }, color_tmeme: function() { if (this.$tm.vx.state().tmVuetify.color !== null && this.$tm.vx.state().tmVuetify.color && this.fllowTheme) { return this.$tm.vx.state().tmVuetify.color; } return this.confirmColor; } }, data() { return { inputValSd: '', sysinfo: 0, clickOverlay: false }; }, created() { let sysinfo = uni.getSystemInfoSync(); // #ifdef APP || MP if (sysinfo.windowHeight == sysinfo.screenHeight) { this.sysinfo = sysinfo.screenHeight; } else if (sysinfo.windowHeight < sysinfo.screenHeight) { this.sysinfo = sysinfo.windowHeight; } // #endif // #ifdef H5 if(sysinfo.screenHeight>=sysinfo.windowHeight){ this.sysinfo = sysinfo.windowHeight; }else{ this.sysinfo = sysinfo.screenHeight; } // #endif this.show = this.value; }, methods: { overCloseCHange() { if (this.overClose) { this.concelClick(); } else { this.anifeed(); } }, anifeed() { let t = this; if (this.clickOverlay) this.clickOverlay = !this.clickOverlay; this.clickOverlay = true; uni.$tm.sleep(100).then(() => { t.clickOverlay = false; }); }, confirmClick() { if (this.model == 'confirm') { if (!this.inputValSd) { uni.$tm.toast('请输入内容'); this.anifeed(); return; } this.$emit('confirm', this.inputValSd); } else { this.$emit('confirm'); } if (this.disabled == false) { this.show = false; } }, suren(e) { this.$emit('update:inputVal', this.inputValSd); }, concelClick() { this.$emit('concel');//错误的拼写兼容 this.$emit('cancel');//正常的拼写 if (this.disabled == false) { this.show = false; } } } }; </script> <style lang="scss"> .tm-dialog { width: 100%; z-index: 600; background-color: rgba(0, 0, 0, 0.3); left: 0; top: 0; backdrop-filter: blur(3px); transition: all 0.24s; .success { animation: success 0.24s ease; // transform: scale(1); } .clickover { animation: clickover 0.24s ease; } } @keyframes clickover { 0% { transform: scale(0.95); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } @keyframes success { 0% { transform: scale(0.75); opacity: 0; } 75% { transform: scale(1.05); } 100% { transform: scale(1); opacity: 1; } } </style>