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.
|
|
<template> <u-transition mode="fade" :show="show" > <view class="u-alert" :class="[`u-alert--${type}--${effect}`]" @tap.stop="clickHandler" :style="[$u.addStyle(customStyle)]" > <view class="u-alert__icon" v-if="showIcon" > <u-icon :name="iconName" size="18" :color="iconColor" ></u-icon> </view> <view class="u-alert__content" :style="[{ paddingRight: closable ? '20px' : 0 }]" > <text class="u-alert__content__title" v-if="title" :style="[{ fontSize: $u.addUnit(fontSize), textAlign: center ? 'center' : 'left' }]" :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]" >{{ title }}</text> <text class="u-alert__content__desc" v-if="description" :style="[{ fontSize: $u.addUnit(fontSize), textAlign: center ? 'center' : 'left' }]" :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]" >{{ description }}</text> </view> <view class="u-alert__close" v-if="closable" @tap.stop="closeHandler" > <u-icon name="close" :color="iconColor" size="15" ></u-icon> </view> </view> </u-transition> </template>
<script> import props from './props.js'; /** * Alert 警告提示 * @description 警告提示,展现需要关注的信息。 * @tutorial https://www.uviewui.com/components/alertTips.html
* * @property {String} title 显示的文字 * @property {String} type 使用预设的颜色 (默认 'warning' ) * @property {String} description 辅助性文字,颜色比title浅一点,字号也小一点,可选 * @property {Boolean} closable 关闭按钮(默认为叉号icon图标) (默认 false ) * @property {Boolean} showIcon 是否显示左边的辅助图标 ( 默认 false ) * @property {String} effect 多图时,图片缩放裁剪的模式 (默认 'light' ) * @property {Boolean} center 文字是否居中 (默认 false ) * @property {String | Number} fontSize 字体大小 (默认 14 ) * @property {Object} customStyle 定义需要用到的外部样式 * @event {Function} click 点击组件时触发 * @example <u-alert :title="title" type = "warning" :closable="closable" :description = "description"></u-alert> */ export default { name: 'u-alert', mixins: [uni.$u.mpMixin, uni.$u.mixin, props], data() { return { show: true } }, computed: { iconColor() { return this.effect === 'light' ? this.type : '#fff' }, // 不同主题对应不同的图标
iconName() { switch (this.type) { case 'success': return 'checkmark-circle-fill'; break; case 'error': return 'close-circle-fill'; break; case 'warning': return 'error-circle-fill'; break; case 'info': return 'info-circle-fill'; break; case 'primary': return 'more-circle-fill'; break; default: return 'error-circle-fill'; } } }, methods: { // 点击内容
clickHandler() { this.$emit('click') }, // 点击关闭按钮
closeHandler() { this.show = false } } } </script>
<style lang="scss" scoped> @import "../../libs/css/components.scss";
.u-alert { position: relative; background-color: $u-primary; padding: 8px 10px; @include flex(row); align-items: center; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px;
&--primary--dark { background-color: $u-primary; }
&--primary--light { background-color: #ecf5ff; }
&--error--dark { background-color: $u-error; }
&--error--light { background-color: #FEF0F0; }
&--success--dark { background-color: $u-success; }
&--success--light { background-color: #f5fff0; }
&--warning--dark { background-color: $u-warning; }
&--warning--light { background-color: #FDF6EC; }
&--info--dark { background-color: $u-info; }
&--info--light { background-color: #f4f4f5; }
&__icon { margin-right: 5px; }
&__content { @include flex(column); flex: 1;
&__title { color: $u-main-color; font-size: 14px; font-weight: bold; color: #fff; margin-bottom: 2px; }
&__desc { color: $u-main-color; font-size: 14px; flex-wrap: wrap; color: #fff; } }
&__title--dark, &__desc--dark { color: #FFFFFF; }
&__text--primary--light, &__text--primary--light { color: $u-primary; }
&__text--success--light, &__text--success--light { color: $u-success; }
&__text--warning--light, &__text--warning--light { color: $u-warning; }
&__text--error--light, &__text--error--light { color: $u-error; }
&__text--info--light, &__text--info--light { color: $u-info; }
&__close { position: absolute; top: 11px; right: 10px; } } </style>
|