u-alert.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <u-transition
  3. mode="fade"
  4. :show="show"
  5. >
  6. <view
  7. class="u-alert"
  8. :class="[`u-alert--${type}--${effect}`]"
  9. @tap.stop="clickHandler"
  10. :style="[$u.addStyle(customStyle)]"
  11. >
  12. <view
  13. class="u-alert__icon"
  14. v-if="showIcon"
  15. >
  16. <u-icon
  17. :name="iconName"
  18. size="18"
  19. :color="iconColor"
  20. ></u-icon>
  21. </view>
  22. <view
  23. class="u-alert__content"
  24. :style="[{
  25. paddingRight: closable ? '20px' : 0
  26. }]"
  27. >
  28. <text
  29. class="u-alert__content__title"
  30. v-if="title"
  31. :style="[{
  32. fontSize: $u.addUnit(fontSize),
  33. textAlign: center ? 'center' : 'left'
  34. }]"
  35. :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
  36. >{{ title }}</text>
  37. <text
  38. class="u-alert__content__desc"
  39. v-if="description"
  40. :style="[{
  41. fontSize: $u.addUnit(fontSize),
  42. textAlign: center ? 'center' : 'left'
  43. }]"
  44. :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
  45. >{{ description }}</text>
  46. </view>
  47. <view
  48. class="u-alert__close"
  49. v-if="closable"
  50. @tap.stop="closeHandler"
  51. >
  52. <u-icon
  53. name="close"
  54. :color="iconColor"
  55. size="15"
  56. ></u-icon>
  57. </view>
  58. </view>
  59. </u-transition>
  60. </template>
  61. <script>
  62. import props from './props.js';
  63. import mixin from '../../libs/mixin/mixin'
  64. import mpMixin from '../../libs/mixin/mpMixin';
  65. /**
  66. * Alert 警告提示
  67. * @description 警告提示,展现需要关注的信息。
  68. * @tutorial https://uview.d3u.cn/components/alertTips.html
  69. *
  70. * @property {String} title 显示的文字
  71. * @property {String} type 使用预设的颜色 (默认 'warning' )
  72. * @property {String} description 辅助性文字,颜色比title浅一点,字号也小一点,可选
  73. * @property {Boolean} closable 关闭按钮(默认为叉号icon图标) (默认 false )
  74. * @property {Boolean} showIcon 是否显示左边的辅助图标 ( 默认 false )
  75. * @property {String} effect 多图时,图片缩放裁剪的模式 (默认 'light' )
  76. * @property {Boolean} center 文字是否居中 (默认 false )
  77. * @property {String | Number} fontSize 字体大小 (默认 14 )
  78. * @property {Object} customStyle 定义需要用到的外部样式
  79. * @event {Function} click 点击组件时触发
  80. * @event {Function} close 点击关闭按钮时触发
  81. * @example <u-alert :title="title" type = "warning" :closable="closable" :description = "description"></u-alert>
  82. */
  83. export default {
  84. name: 'u-alert',
  85. mixins: [mpMixin, mixin, props],
  86. data() {
  87. return {
  88. show: true,
  89. iconColor:'',
  90. iconName:'',
  91. }
  92. },
  93. watch: {
  94. effect: {
  95. immediate: true,
  96. handler(newVal) {
  97. this.getIconColor()
  98. }
  99. },
  100. type: {
  101. immediate: true,
  102. handler(newVal) {
  103. this.getIconName()
  104. }
  105. }
  106. },
  107. // #ifdef VUE3
  108. emits: ["click", "close"],
  109. // #endif
  110. methods: {
  111. getIconColor() {
  112. this.iconColor = this.effect === 'light' ? this.type : '#fff'
  113. },
  114. // 不同主题对应不同的图标
  115. getIconName() {
  116. switch (this.type) {
  117. case 'success':
  118. this.iconName = 'checkmark-circle-fill';
  119. break;
  120. case 'error':
  121. this.iconName = 'close-circle-fill';
  122. break;
  123. case 'warning':
  124. this.iconName = 'error-circle-fill';
  125. break;
  126. case 'info':
  127. this.iconName = 'info-circle-fill';
  128. break;
  129. case 'primary':
  130. this.iconName = 'more-circle-fill';
  131. break;
  132. default:
  133. this.iconName = 'error-circle-fill';
  134. }
  135. },
  136. // 点击内容
  137. clickHandler(e) {
  138. this.$emit('click', e)
  139. },
  140. // 点击关闭按钮
  141. closeHandler() {
  142. this.show = false
  143. this.$emit('close')
  144. }
  145. }
  146. }
  147. </script>
  148. <style lang="scss" scoped>
  149. @import "../../libs/css/components.scss";
  150. .u-alert {
  151. position: relative;
  152. background-color: $u-primary;
  153. padding: 8px 10px;
  154. @include flex(row);
  155. align-items: center;
  156. border-top-left-radius: 4px;
  157. border-top-right-radius: 4px;
  158. border-bottom-left-radius: 4px;
  159. border-bottom-right-radius: 4px;
  160. &--primary--dark {
  161. background-color: $u-primary;
  162. }
  163. &--primary--light {
  164. background-color: #ecf5ff;
  165. }
  166. &--error--dark {
  167. background-color: $u-error;
  168. }
  169. &--error--light {
  170. background-color: #FEF0F0;
  171. }
  172. &--success--dark {
  173. background-color: $u-success;
  174. }
  175. &--success--light {
  176. background-color: #f5fff0;
  177. }
  178. &--warning--dark {
  179. background-color: $u-warning;
  180. }
  181. &--warning--light {
  182. background-color: #FDF6EC;
  183. }
  184. &--info--dark {
  185. background-color: $u-info;
  186. }
  187. &--info--light {
  188. background-color: #f4f4f5;
  189. }
  190. &__icon {
  191. margin-right: 5px;
  192. }
  193. &__content {
  194. @include flex(column);
  195. flex: 1;
  196. &__title {
  197. color: $u-main-color;
  198. font-size: 14px;
  199. font-weight: bold;
  200. color: #fff;
  201. margin-bottom: 2px;
  202. }
  203. &__desc {
  204. color: $u-main-color;
  205. font-size: 14px;
  206. flex-wrap: wrap;
  207. color: #fff;
  208. }
  209. }
  210. &__title--dark,
  211. &__desc--dark {
  212. color: #FFFFFF;
  213. }
  214. &__text--primary--light,
  215. &__text--primary--light {
  216. color: $u-primary;
  217. }
  218. &__text--success--light,
  219. &__text--success--light {
  220. color: $u-success;
  221. }
  222. &__text--warning--light,
  223. &__text--warning--light {
  224. color: $u-warning;
  225. }
  226. &__text--error--light,
  227. &__text--error--light {
  228. color: $u-error;
  229. }
  230. &__text--info--light,
  231. &__text--info--light {
  232. color: $u-info;
  233. }
  234. &__close {
  235. position: absolute;
  236. top: 11px;
  237. right: 10px;
  238. }
  239. }
  240. </style>