| import config from '../common/config'; | 
| const { prefix } = config; | 
| export default function transition() { | 
|     return Behavior({ | 
|         properties: { | 
|             visible: { | 
|                 type: Boolean, | 
|                 value: null, | 
|                 observer: 'watchVisible', | 
|             }, | 
|             appear: Boolean, | 
|             name: { | 
|                 type: String, | 
|                 value: 'fade', | 
|             }, | 
|             durations: { | 
|                 type: Number, | 
|                 optionalTypes: [Array], | 
|             }, | 
|         }, | 
|         data: { | 
|             transitionClass: '', | 
|             transitionDurations: 300, | 
|             className: '', | 
|             realVisible: false, | 
|         }, | 
|         created() { | 
|             this.status = ''; | 
|             this.transitionT = 0; | 
|         }, | 
|         attached() { | 
|             this.durations = this.getDurations(); | 
|             if (this.data.visible) { | 
|                 this.enter(); | 
|             } | 
|             this.inited = true; | 
|         }, | 
|         detached() { | 
|             clearTimeout(this.transitionT); | 
|         }, | 
|         methods: { | 
|             watchVisible(curr, prev) { | 
|                 if (this.inited && curr !== prev) { | 
|                     curr ? this.enter() : this.leave(); | 
|                 } | 
|             }, | 
|             getDurations() { | 
|                 const { durations } = this.data; | 
|                 if (Array.isArray(durations)) { | 
|                     return durations.map((item) => Number(item)); | 
|                 } | 
|                 return [Number(durations), Number(durations)]; | 
|             }, | 
|             enter() { | 
|                 const { name } = this.data; | 
|                 const [duration] = this.durations; | 
|                 this.status = 'entering'; | 
|                 this.setData({ | 
|                     realVisible: true, | 
|                     transitionClass: `${prefix}-${name}-enter ${prefix}-${name}-enter-active`, | 
|                 }); | 
|                 setTimeout(() => { | 
|                     this.setData({ | 
|                         transitionClass: `${prefix}-${name}-enter-active ${prefix}-${name}-enter-to`, | 
|                     }); | 
|                 }, 30); | 
|                 if (typeof duration === 'number' && duration > 0) { | 
|                     this.transitionT = setTimeout(this.entered.bind(this), duration + 30); | 
|                 } | 
|             }, | 
|             entered() { | 
|                 this.customDuration = false; | 
|                 clearTimeout(this.transitionT); | 
|                 this.status = 'entered'; | 
|                 this.setData({ | 
|                     transitionClass: '', | 
|                 }); | 
|             }, | 
|             leave() { | 
|                 const { name } = this.data; | 
|                 const [, duration] = this.durations; | 
|                 this.status = 'leaving'; | 
|                 this.setData({ | 
|                     transitionClass: `${prefix}-${name}-leave  ${prefix}-${name}-leave-active`, | 
|                 }); | 
|                 clearTimeout(this.transitionT); | 
|                 setTimeout(() => { | 
|                     this.setData({ | 
|                         transitionClass: `${prefix}-${name}-leave-active ${prefix}-${name}-leave-to`, | 
|                     }); | 
|                 }, 30); | 
|                 if (typeof duration === 'number' && duration > 0) { | 
|                     this.customDuration = true; | 
|                     this.transitionT = setTimeout(this.leaved.bind(this), duration + 30); | 
|                 } | 
|             }, | 
|             leaved() { | 
|                 this.customDuration = false; | 
|                 this.triggerEvent('leaved'); | 
|                 clearTimeout(this.transitionT); | 
|                 this.status = 'leaved'; | 
|                 this.setData({ | 
|                     transitionClass: '', | 
|                 }); | 
|             }, | 
|             onTransitionEnd() { | 
|                 if (this.customDuration) { | 
|                     return; | 
|                 } | 
|                 clearTimeout(this.transitionT); | 
|                 if (this.status === 'entering' && this.data.visible) { | 
|                     this.entered(); | 
|                 } | 
|                 else if (this.status === 'leaving' && !this.data.visible) { | 
|                     this.leaved(); | 
|                     this.setData({ | 
|                         realVisible: false, | 
|                     }); | 
|                 } | 
|             }, | 
|         }, | 
|     }); | 
| } |