| <template> |
| <view class="u-alert-tips" v-if="show" :class="[ |
| !show ? 'u-close-alert-tips': '', |
| type ? 'u-alert-tips--bg--' + type + '-light' : '', |
| type ? 'u-alert-tips--border--' + type + '-disabled' : '', |
| ]" :style="{ |
| backgroundColor: bgColor, |
| borderColor: borderColor |
| }"> |
| <view class="u-icon-wrap"> |
| <u-icon v-if="showIcon" :name="uIcon" :size="description ? 40 : 32" class="u-icon" :color="uIconType" :custom-style="iconStyle"></u-icon> |
| </view> |
| <view class="u-alert-content" @tap.stop="click"> |
| <view class="u-alert-title" :style="[uTitleStyle]"> |
| {{title}} |
| </view> |
| <view v-if="description" class="u-alert-desc" :style="[descStyle]"> |
| {{description}} |
| </view> |
| </view> |
| <view class="u-icon-wrap"> |
| <u-icon @click="close" v-if="closeAble && !closeText" hoverClass="u-type-error-hover-color" name="close" color="#c0c4cc" |
| :size="22" class="u-close-icon" :style="{ |
| top: description ? '18rpx' : '24rpx' |
| }"></u-icon> |
| </view> |
| <text v-if="closeAble && closeText" class="u-close-text" :style="{ |
| top: description ? '18rpx' : '24rpx' |
| }">{{closeText}}</text> |
| </view> |
| </template> |
| |
| <script> |
| /** |
| * alertTips 警告提示 |
| * @description 警告提示,展现需要关注的信息 |
| * @tutorial https://uviewui.com/components/alertTips.html |
| * @property {String} title 显示的标题文字 |
| * @property {String} description 辅助性文字,颜色比title浅一点,字号也小一点,可选 |
| * @property {String} type 关闭按钮(默认为叉号icon图标) |
| * @property {String} icon 图标名称 |
| * @property {Object} icon-style 图标的样式,对象形式 |
| * @property {Object} title-style 标题的样式,对象形式 |
| * @property {Object} desc-style 描述的样式,对象形式 |
| * @property {String} close-able 用文字替代关闭图标,close-able为true时有效 |
| * @property {Boolean} show-icon 是否显示左边的辅助图标 |
| * @property {Boolean} show 显示或隐藏组件 |
| * @event {Function} click 点击组件时触发 |
| * @event {Function} close 点击关闭按钮时触发 |
| */ |
| export default { |
| name: 'u-alert-tips', |
| props: { |
| // 显示文字 |
| title: { |
| type: String, |
| default: '' |
| }, |
| // 主题,success/warning/info/error |
| type: { |
| type: String, |
| default: 'warning' |
| }, |
| // 辅助性文字 |
| description: { |
| type: String, |
| default: '' |
| }, |
| // 是否可关闭 |
| closeAble: { |
| type: Boolean, |
| default: false |
| }, |
| // 关闭按钮自定义文本 |
| closeText: { |
| type: String, |
| default: '' |
| }, |
| // 是否显示图标 |
| showIcon: { |
| type: Boolean, |
| default: false |
| }, |
| // 文字颜色,如果定义了color值,icon会失效 |
| color: { |
| type: String, |
| default: '' |
| }, |
| // 背景颜色 |
| bgColor: { |
| type: String, |
| default: '' |
| }, |
| // 边框颜色 |
| borderColor: { |
| type: String, |
| default: '' |
| }, |
| // 是否显示 |
| show: { |
| type: Boolean, |
| default: true |
| }, |
| // 左边显示的icon |
| icon: { |
| type: String, |
| default: '' |
| }, |
| // icon的样式 |
| iconStyle: { |
| type: Object, |
| default() { |
| return {} |
| } |
| }, |
| // 标题的样式 |
| titleStyle: { |
| type: Object, |
| default() { |
| return {} |
| } |
| }, |
| // 描述文字的样式 |
| descStyle: { |
| type: Object, |
| default() { |
| return {} |
| } |
| }, |
| }, |
| data() { |
| return { |
| } |
| }, |
| computed: { |
| uTitleStyle() { |
| let style = {}; |
| // 如果有描述文字的话,标题进行加粗 |
| style.fontWeight = this.description ? 500 : 'normal'; |
| // 将用户传入样式对象和style合并,传入的优先级比style高,同属性会被覆盖 |
| return this.$u.deepMerge(style, this.titleStyle); |
| }, |
| uIcon() { |
| // 如果有设置icon名称就使用,否则根据type主题,推定一个默认的图标 |
| return this.icon ? this.icon : this.$u.type2icon(this.type); |
| }, |
| uIconType() { |
| // 如果有设置图标的样式,优先使用,没有的话,则用type的样式 |
| return Object.keys(this.iconStyle).length ? '' : this.type; |
| } |
| }, |
| methods: { |
| // 点击内容 |
| click() { |
| this.$emit('click'); |
| }, |
| // 点击关闭按钮 |
| close() { |
| this.$emit('close'); |
| } |
| } |
| } |
| </script> |
| |
| <style lang="scss" scoped> |
| @import "../../libs/css/style.components.scss"; |
| |
| .u-alert-tips { |
| @include vue-flex; |
| align-items: center; |
| padding: 16rpx 30rpx; |
| border-radius: 8rpx; |
| position: relative; |
| transition: all 0.3s linear; |
| border: 1px solid #fff; |
| |
| &--bg--primary-light { |
| background-color: $u-type-primary-light; |
| } |
| |
| &--bg--info-light { |
| background-color: $u-type-info-light; |
| } |
| |
| &--bg--success-light { |
| background-color: $u-type-success-light; |
| } |
| |
| &--bg--warning-light { |
| background-color: $u-type-warning-light; |
| } |
| |
| &--bg--error-light { |
| background-color: $u-type-error-light; |
| } |
| |
| &--border--primary-disabled { |
| border-color: $u-type-primary-disabled; |
| } |
| |
| &--border--success-disabled { |
| border-color: $u-type-success-disabled; |
| } |
| |
| &--border--error-disabled { |
| border-color: $u-type-error-disabled; |
| } |
| |
| &--border--warning-disabled { |
| border-color: $u-type-warning-disabled; |
| } |
| |
| &--border--info-disabled { |
| border-color: $u-type-info-disabled; |
| } |
| } |
| |
| .u-close-alert-tips { |
| opacity: 0; |
| visibility: hidden; |
| } |
| |
| .u-icon { |
| margin-right: 16rpx; |
| } |
| |
| .u-alert-title { |
| font-size: 28rpx; |
| color: $u-main-color; |
| } |
| |
| .u-alert-desc { |
| font-size: 26rpx; |
| text-align: left; |
| color: $u-content-color; |
| } |
| |
| .u-close-icon { |
| position: absolute; |
| top: 20rpx; |
| right: 20rpx; |
| } |
| |
| .u-close-hover { |
| color: red; |
| } |
| |
| .u-close-text { |
| font-size: 24rpx; |
| color: $u-tips-color; |
| position: absolute; |
| top: 20rpx; |
| right: 20rpx; |
| line-height: 1; |
| } |
| </style> |