mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-04 08:06:12 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			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>
 |