| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | 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,                    });                }            },        },    });}
 |