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