| <template> | |
| 	<u-transition | |
| 		mode="slide-down" | |
| 		:customStyle="containerStyle" | |
| 		:show="open" | |
| 	> | |
| 		<view | |
| 			class="u-notify" | |
| 			:class="[`u-notify--${tmpConfig.type}`]" | |
| 			:style="[backgroundColor, $u.addStyle(customStyle)]" | |
| 		> | |
| 			<u-status-bar v-if="tmpConfig.safeAreaInsetTop"></u-status-bar> | |
| 			<view class="u-notify__warpper"> | |
| 				<slot name="icon"> | |
| 					<u-icon | |
| 						v-if="['success', 'warning', 'error'].includes(tmpConfig.type)" | |
| 						:name="tmpConfig.icon" | |
| 						:color="tmpConfig.color" | |
| 						:size="1.3 * tmpConfig.fontSize" | |
| 						:customStyle="{marginRight: '4px'}" | |
| 					></u-icon> | |
| 				</slot> | |
| 				<text | |
| 					class="u-notify__warpper__text" | |
| 					:style="{ | |
| 						fontSize: $u.addUnit(tmpConfig.fontSize), | |
| 						color: tmpConfig.color | |
| 					}" | |
| 				>{{ tmpConfig.message }}</text> | |
| 			</view> | |
| 		</view> | |
| 	</u-transition> | |
| </template> | |
|  | |
| <script> | |
| 	import props from './props.js'; | |
| 	/** | |
| 	 * notify 顶部提示 | |
| 	 * @description 该组件一般用于页面顶部向下滑出一个提示,尔后自动收起的场景 | |
| 	 * @tutorial | |
| 	 * @property {String | Number}	top					到顶部的距离 ( 默认 0 ) | |
| 	 * @property {String}			type				主题,primary,success,warning,error ( 默认 'primary' ) | |
| 	 * @property {String}			color				字体颜色 ( 默认 '#ffffff' ) | |
| 	 * @property {String}			bgColor				背景颜色 | |
| 	 * @property {String}			message				展示的文字内容 | |
| 	 * @property {String | Number}	duration			展示时长,为0时不消失,单位ms ( 默认 3000 ) | |
| 	 * @property {String | Number}	fontSize			字体大小 ( 默认 15 ) | |
| 	 * @property {Boolean}			safeAreaInsetTop	是否留出顶部安全距离(状态栏高度) ( 默认 false ) | |
| 	 * @property {Object}			customStyle			组件的样式,对象形式 | |
| 	 * @event {Function}	open	开启组件时调用的函数 | |
| 	 * @event {Function}	close	关闭组件式调用的函数 | |
| 	 * @example <u-notify message="Hi uView"></u-notify> | |
| 	 */ | |
| 	export default { | |
| 		name: 'u-notify', | |
| 		mixins: [uni.$u.mpMixin, uni.$u.mixin,props], | |
| 		data() { | |
| 			return { | |
| 				// 是否展示组件 | |
| 				open: false, | |
| 				timer: null, | |
| 				config: { | |
| 					// 到顶部的距离 | |
| 					top: uni.$u.props.notify.top, | |
| 					// type主题,primary,success,warning,error | |
| 					type: uni.$u.props.notify.type, | |
| 					// 字体颜色 | |
| 					color: uni.$u.props.notify.color, | |
| 					// 背景颜色 | |
| 					bgColor: uni.$u.props.notify.bgColor, | |
| 					// 展示的文字内容 | |
| 					message: uni.$u.props.notify.message, | |
| 					// 展示时长,为0时不消失,单位ms | |
| 					duration: uni.$u.props.notify.duration, | |
| 					// 字体大小 | |
| 					fontSize: uni.$u.props.notify.fontSize, | |
| 					// 是否留出顶部安全距离(状态栏高度) | |
| 					safeAreaInsetTop: uni.$u.props.notify.safeAreaInsetTop | |
| 				}, | |
| 				// 合并后的配置,避免多次调用组件后,可能会复用之前使用的配置参数 | |
| 				tmpConfig: {} | |
| 			} | |
| 		}, | |
| 		computed: { | |
| 			containerStyle() { | |
| 				let top = 0 | |
| 				if (this.tmpConfig.top === 0) { | |
| 					// #ifdef H5 | |
| 					// H5端,导航栏为普通元素,需要将组件移动到导航栏的下边沿 | |
| 					// H5的导航栏高度为44px | |
| 					top = 44 | |
| 					// #endif | |
| 				} | |
| 				const style = { | |
| 					top: uni.$u.addUnit(this.tmpConfig.top === 0 ? top : this.tmpConfig.top), | |
| 					// 因为组件底层为u-transition组件,必须将其设置为fixed定位 | |
| 					// 让其出现在导航栏底部 | |
| 					position: 'fixed', | |
| 					left: 0, | |
| 					right: 0, | |
| 					zIndex: 10076 | |
| 				} | |
| 				return style | |
| 			}, | |
| 			// 组件背景颜色 | |
| 			backgroundColor() { | |
| 				const style = {} | |
| 				if (this.tmpConfig.bgColor) { | |
| 					style.backgroundColor = this.tmpConfig.bgColor | |
| 				} | |
| 				return style | |
| 			}, | |
| 			// 默认主题下的图标 | |
| 			icon() { | |
| 				let icon | |
| 				if (this.tmpConfig.type === 'success') { | |
| 					icon = 'checkmark-circle' | |
| 				} else if (this.tmpConfig.type === 'error') { | |
| 					icon = 'close-circle' | |
| 				} else if (this.tmpConfig.type === 'warning') { | |
| 					icon = 'error-circle' | |
| 				} | |
| 				return icon | |
| 			} | |
| 		}, | |
| 		created() { | |
| 			// 通过主题的形式调用toast,批量生成方法函数 | |
| 			['primary', 'success', 'error', 'warning'].map(item => { | |
| 				this[item] = message => this.show({ | |
| 					type: item, | |
| 					message | |
| 				}) | |
| 			}) | |
| 		}, | |
| 		methods: { | |
| 			show(options) { | |
| 				// 不将结果合并到this.config变量,避免多次调用u-toast,前后的配置造成混乱 | |
| 				this.tmpConfig = uni.$u.deepMerge(this.config, options) | |
| 				// 任何定时器初始化之前,都要执行清除操作,否则可能会造成混乱 | |
| 				this.clearTimer() | |
| 				this.open = true | |
| 				if (this.tmpConfig.duration > 0) { | |
| 					this.timer = setTimeout(() => { | |
| 						this.open = false | |
| 						// 倒计时结束,清除定时器,隐藏toast组件 | |
| 						this.clearTimer() | |
| 						// 判断是否存在callback方法,如果存在就执行 | |
| 						typeof(this.tmpConfig.complete) === 'function' && this.tmpConfig.complete() | |
| 					}, this.tmpConfig.duration) | |
| 				} | |
| 			}, | |
| 			// 关闭notify | |
| 			close() { | |
| 				this.clearTimer() | |
| 			}, | |
| 			clearTimer() { | |
| 				this.open = false | |
| 				// 清除定时器 | |
| 				clearTimeout(this.timer) | |
| 				this.timer = null | |
| 			} | |
| 		}, | |
| 		beforeDestroy() { | |
| 			this.clearTimer() | |
| 		} | |
| 	} | |
| </script> | |
| 
 | |
| <style lang="scss" scoped> | |
| 	@import "../../libs/css/components.scss"; | |
| 
 | |
| 	$u-notify-padding: 8px 10px !default; | |
| 	$u-notify-text-font-size: 15px !default; | |
| 	$u-notify-primary-bgColor: $u-primary !default; | |
| 	$u-notify-success-bgColor: $u-success !default; | |
| 	$u-notify-error-bgColor: $u-error !default; | |
| 	$u-notify-warning-bgColor: $u-warning !default; | |
| 
 | |
| 
 | |
| 	.u-notify { | |
| 		padding: $u-notify-padding; | |
| 
 | |
| 		&__warpper { | |
| 			@include flex; | |
| 			align-items: center; | |
| 			text-align: center; | |
| 			justify-content: center; | |
| 
 | |
| 			&__text { | |
| 				font-size: $u-notify-text-font-size; | |
| 				text-align: center; | |
| 			} | |
| 		} | |
| 
 | |
| 		&--primary { | |
| 			background-color: $u-notify-primary-bgColor; | |
| 		} | |
| 
 | |
| 		&--success { | |
| 			background-color: $u-notify-success-bgColor; | |
| 		} | |
| 
 | |
| 		&--error { | |
| 			background-color: $u-notify-error-bgColor; | |
| 		} | |
| 
 | |
| 		&--warning { | |
| 			background-color: $u-notify-warning-bgColor; | |
| 		} | |
| 	} | |
| </style>
 |