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>
							 |