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