<template> <view class="uni-popup-dialog"> <view class="uni-dialog-title"> <text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{titleText}}</text> </view> <view v-if="mode === 'base'" class="uni-dialog-content"> <slot> <text class="uni-dialog-content-text">{{content}}</text> </slot> </view> <view v-else class="uni-dialog-content"> <slot> <input class="uni-dialog-input" v-model="val" :type="inputType" :placeholder="placeholderText" :focus="focus" > </slot> </view> <view class="uni-dialog-button-group"> <view class="uni-dialog-button" @click="closeDialog"> <text class="uni-dialog-button-text">{{closeText}}</text> </view> <view class="uni-dialog-button uni-border-left" @click="onOk"> <text class="uni-dialog-button-text uni-button-color">{{okText}}</text> </view> </view> </view> </template> <script> import popup from '../uni-popup/popup.js' import { initVueI18n } from '@dcloudio/uni-i18n' import messages from '../uni-popup/i18n/index.js' const { t } = initVueI18n(messages) /** * PopUp 弹出层-对话框样式 * @description 弹出层-对话框样式 * @tutorial https://ext.dcloud.net.cn/plugin?id=329 * @property {String} value input 模式下的默认值 * @property {String} placeholder input 模式下输入提示 * @property {String} type = [success|warning|info|error] 主题样式 * @value success 成功 * @value warning 提示 * @value info 消息 * @value error 错误 * @property {String} mode = [base|input] 模式、 * @value base 基础对话框 * @value input 可输入对话框 * @property {String} content 对话框内容 * @property {Boolean} beforeClose 是否拦截取消事件 * @event {Function} confirm 点击确认按钮触发 * @event {Function} close 点击取消按钮触发 */ export default { name: "uniPopupDialog", mixins: [popup], emits:['confirm','close'], props: { inputType:{ type: String, default: 'text' }, value: { type: [String, Number], default: '' }, placeholder: { type: [String, Number], default: '' }, type: { type: String, default: 'error' }, mode: { type: String, default: 'base' }, title: { type: String, default: '' }, content: { type: String, default: '' }, beforeClose: { type: Boolean, default: false }, cancelText:{ type: String, default: '' }, confirmText:{ type: String, default: '' } }, data() { return { dialogType: 'error', focus: false, val: "" } }, computed: { okText() { return this.confirmText || t("uni-popup.ok") }, closeText() { return this.cancelText || t("uni-popup.cancel") }, placeholderText() { return this.placeholder || t("uni-popup.placeholder") }, titleText() { return this.title || t("uni-popup.title") } }, watch: { type(val) { this.dialogType = val }, mode(val) { if (val === 'input') { this.dialogType = 'info' } }, value(val) { this.val = val } }, created() { // 对话框遮罩不可点击 this.popup.disableMask() // this.popup.closeMask() if (this.mode === 'input') { this.dialogType = 'info' this.val = this.value } else { this.dialogType = this.type } }, mounted() { this.focus = true }, methods: { /** * 点击确认按钮 */ onOk() { if (this.mode === 'input'){ this.$emit('confirm', this.val) }else{ this.$emit('confirm') } if(this.beforeClose) return this.popup.close() }, /** * 点击取消按钮 */ closeDialog() { this.$emit('close') if(this.beforeClose) return this.popup.close() }, close(){ this.popup.close() } } } </script> <style lang="scss" > .uni-popup-dialog { width: 300px; border-radius: 11px; background-color: #fff; } .uni-dialog-title { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: row; justify-content: center; padding-top: 25px; } .uni-dialog-title-text { font-size: 16px; font-weight: 500; } .uni-dialog-content { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: row; justify-content: center; align-items: center; padding: 20px; } .uni-dialog-content-text { font-size: 14px; color: #6C6C6C; } .uni-dialog-button-group { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: row; border-top-color: #f5f5f5; border-top-style: solid; border-top-width: 1px; } .uni-dialog-button { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex: 1; flex-direction: row; justify-content: center; align-items: center; height: 45px; } .uni-border-left { border-left-color: #f0f0f0; border-left-style: solid; border-left-width: 1px; } .uni-dialog-button-text { font-size: 16px; color: #333; } .uni-button-color { color: #007aff; } .uni-dialog-input { flex: 1; font-size: 14px; border: 1px #eee solid; height: 40px; padding: 0 10px; border-radius: 5px; color: #555; } .uni-popup__success { color: #4cd964; } .uni-popup__warn { color: #f0ad4e; } .uni-popup__error { color: #dd524d; } .uni-popup__info { color: #909399; } </style>