You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
5.7 KiB
256 lines
5.7 KiB
<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>
|
|
|