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.
		
		
		
		
		
			
		
			
				
					
					
						
							92 lines
						
					
					
						
							2.6 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							92 lines
						
					
					
						
							2.6 KiB
						
					
					
				
								<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>
							 |