93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | |||
|  | 	<view | |||
|  | 		v-if="inited" | |||
|  | 		class="u-transition" | |||
|  | 		ref="u-transition" | |||
|  | 		@tap="clickHandler" | |||
|  | 		:class="classes" | |||
|  | 		:style="[mergeStyle]" | |||
|  | 		@touchmove="noop" | |||
|  | 	> | |||
|  | 		<slot /> | |||
|  | 	</view> | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  | import props from './props.js'; | |||
|  | // 组件的methods方法,由于内容较长,写在外部文件中通过mixin引入
 | |||
|  | import transition from "./transition.js"; | |||
|  | /** | |||
|  |  * transition  动画组件 | |||
|  |  * @description | |||
|  |  * @tutorial | |||
|  |  * @property {String}			show			是否展示组件 (默认 false ) | |||
|  |  * @property {String}			mode			使用的动画模式 (默认 'fade' ) | |||
|  |  * @property {String | Number}	duration		动画的执行时间,单位ms (默认 '300' ) | |||
|  |  * @property {String}			timingFunction	使用的动画过渡函数 (默认 'ease-out' ) | |||
|  |  * @property {Object}			customStyle		自定义样式 | |||
|  |  * @event {Function} before-enter	进入前触发 | |||
|  |  * @event {Function} enter			进入中触发 | |||
|  |  * @event {Function} after-enter	进入后触发 | |||
|  |  * @event {Function} before-leave	离开前触发 | |||
|  |  * @event {Function} leave			离开中触发 | |||
|  |  * @event {Function} after-leave	离开后触发 | |||
|  |  * @example | |||
|  |  */ | |||
|  | export default { | |||
|  | 	name: 'u-transition', | |||
|  | 	data() { | |||
|  | 		return { | |||
|  | 			inited: false, // 是否显示/隐藏组件
 | |||
|  | 			viewStyle: {}, // 组件内部的样式
 | |||
|  | 			status: '', // 记录组件动画的状态
 | |||
|  | 			transitionEnded: false, // 组件是否结束的标记
 | |||
|  | 			display: false, // 组件是否展示
 | |||
|  | 			classes: '', // 应用的类名
 | |||
|  | 		} | |||
|  | 	}, | |||
|  | 	computed: { | |||
|  | 	    mergeStyle() { | |||
|  | 	        const { viewStyle, customStyle } = this | |||
|  | 	        return { | |||
|  | 	            // #ifndef APP-NVUE
 | |||
|  | 	            transitionDuration: `${this.duration}ms`, | |||
|  | 	            // display: `${this.display ? '' : 'none'}`,
 | |||
|  | 				transitionTimingFunction: this.timingFunction, | |||
|  | 	            // #endif
 | |||
|  | 				// 避免自定义样式影响到动画属性,所以写在viewStyle前面
 | |||
|  | 	            ...uni.$u.addStyle(customStyle), | |||
|  | 	            ...viewStyle | |||
|  | 	        } | |||
|  | 	    } | |||
|  | 	}, | |||
|  | 	// 将mixin挂在到组件中,uni.$u.mixin实际上为一个vue格式对象
 | |||
|  | 	mixins: [uni.$u.mpMixin, uni.$u.mixin, transition, props], | |||
|  | 	watch: { | |||
|  | 		show: { | |||
|  | 			handler(newVal) { | |||
|  | 				// vue和nvue分别执行不同的方法
 | |||
|  | 				// #ifdef APP-NVUE
 | |||
|  | 				newVal ? this.nvueEnter() : this.nvueLeave() | |||
|  | 				// #endif
 | |||
|  | 				// #ifndef APP-NVUE
 | |||
|  | 				newVal ? this.vueEnter() : this.vueLeave() | |||
|  | 				// #endif
 | |||
|  | 			}, | |||
|  | 			// 表示同时监听初始化时的props的show的意思
 | |||
|  | 			immediate: true | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | </script> | |||
|  | 
 | |||
|  | <style lang="scss" scoped> | |||
|  | @import '../../libs/css/components.scss'; | |||
|  | 
 | |||
|  | /* #ifndef APP-NVUE */ | |||
|  | // vue版本动画相关的样式抽离在外部文件
 | |||
|  | @import './vue.ani-style.scss'; | |||
|  | /* #endif */ | |||
|  | 
 | |||
|  | .u-transition {} | |||
|  | </style> |