You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							107 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							107 lines
						
					
					
						
							3.2 KiB
						
					
					
				
								// @ts-nocheck
							 | 
						|
								import { requestAnimationFrame } from '../common/utils';
							 | 
						|
								import { isObj } from '../common/validator';
							 | 
						|
								const getClassNames = (name) => ({
							 | 
						|
								  enter: `van-${name}-enter van-${name}-enter-active enter-class enter-active-class`,
							 | 
						|
								  'enter-to': `van-${name}-enter-to van-${name}-enter-active enter-to-class enter-active-class`,
							 | 
						|
								  leave: `van-${name}-leave van-${name}-leave-active leave-class leave-active-class`,
							 | 
						|
								  'leave-to': `van-${name}-leave-to van-${name}-leave-active leave-to-class leave-active-class`,
							 | 
						|
								});
							 | 
						|
								export function transition(showDefaultValue) {
							 | 
						|
								  return Behavior({
							 | 
						|
								    properties: {
							 | 
						|
								      customStyle: String,
							 | 
						|
								      // @ts-ignore
							 | 
						|
								      show: {
							 | 
						|
								        type: Boolean,
							 | 
						|
								        value: showDefaultValue,
							 | 
						|
								        observer: 'observeShow',
							 | 
						|
								      },
							 | 
						|
								      // @ts-ignore
							 | 
						|
								      duration: {
							 | 
						|
								        type: null,
							 | 
						|
								        value: 300,
							 | 
						|
								        observer: 'observeDuration',
							 | 
						|
								      },
							 | 
						|
								      name: {
							 | 
						|
								        type: String,
							 | 
						|
								        value: 'fade',
							 | 
						|
								      },
							 | 
						|
								    },
							 | 
						|
								    data: {
							 | 
						|
								      type: '',
							 | 
						|
								      inited: false,
							 | 
						|
								      display: false,
							 | 
						|
								    },
							 | 
						|
								    methods: {
							 | 
						|
								      observeShow(value, old) {
							 | 
						|
								        if (value === old) {
							 | 
						|
								          return;
							 | 
						|
								        }
							 | 
						|
								        value ? this.enter() : this.leave();
							 | 
						|
								      },
							 | 
						|
								      enter() {
							 | 
						|
								        const { duration, name } = this.data;
							 | 
						|
								        const classNames = getClassNames(name);
							 | 
						|
								        const currentDuration = isObj(duration) ? duration.enter : duration;
							 | 
						|
								        this.status = 'enter';
							 | 
						|
								        this.$emit('before-enter');
							 | 
						|
								        requestAnimationFrame(() => {
							 | 
						|
								          this.checkStatus('enter');
							 | 
						|
								          this.$emit('enter');
							 | 
						|
								          this.setData({
							 | 
						|
								            inited: true,
							 | 
						|
								            display: true,
							 | 
						|
								            classes: classNames.enter,
							 | 
						|
								            currentDuration,
							 | 
						|
								          });
							 | 
						|
								          requestAnimationFrame(() => {
							 | 
						|
								            this.checkStatus('enter');
							 | 
						|
								            this.transitionEnded = false;
							 | 
						|
								            this.setData({ classes: classNames['enter-to'] });
							 | 
						|
								          });
							 | 
						|
								        });
							 | 
						|
								      },
							 | 
						|
								      leave() {
							 | 
						|
								        if (!this.data.display) {
							 | 
						|
								          return;
							 | 
						|
								        }
							 | 
						|
								        const { duration, name } = this.data;
							 | 
						|
								        const classNames = getClassNames(name);
							 | 
						|
								        const currentDuration = isObj(duration) ? duration.leave : duration;
							 | 
						|
								        this.status = 'leave';
							 | 
						|
								        this.$emit('before-leave');
							 | 
						|
								        requestAnimationFrame(() => {
							 | 
						|
								          this.checkStatus('leave');
							 | 
						|
								          this.$emit('leave');
							 | 
						|
								          this.setData({
							 | 
						|
								            classes: classNames.leave,
							 | 
						|
								            currentDuration,
							 | 
						|
								          });
							 | 
						|
								          requestAnimationFrame(() => {
							 | 
						|
								            this.checkStatus('leave');
							 | 
						|
								            this.transitionEnded = false;
							 | 
						|
								            setTimeout(() => this.onTransitionEnd(), currentDuration);
							 | 
						|
								            this.setData({ classes: classNames['leave-to'] });
							 | 
						|
								          });
							 | 
						|
								        });
							 | 
						|
								      },
							 | 
						|
								      checkStatus(status) {
							 | 
						|
								        if (status !== this.status) {
							 | 
						|
								          throw new Error(`incongruent status: ${status}`);
							 | 
						|
								        }
							 | 
						|
								      },
							 | 
						|
								      onTransitionEnd() {
							 | 
						|
								        if (this.transitionEnded) {
							 | 
						|
								          return;
							 | 
						|
								        }
							 | 
						|
								        this.transitionEnded = true;
							 | 
						|
								        this.$emit(`after-${this.status}`);
							 | 
						|
								        const { show, display } = this.data;
							 | 
						|
								        if (!show && display) {
							 | 
						|
								          this.setData({ display: false });
							 | 
						|
								        }
							 | 
						|
								      },
							 | 
						|
								    },
							 | 
						|
								  });
							 | 
						|
								}
							 |