¶Ô±ÈÐÂÎļþ |
| | |
| | | // å®ä¹ä¸ä¸ªä¸å®æ¶é´åèªå¨æåçpromiseï¼è®©è°ç¨nextTickæ¹æ³å¤ï¼è¿å
¥ä¸ä¸ä¸ªthenæ¹æ³ |
| | | const nextTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 50)) |
| | | // nvueå¨ç»æ¨¡åå®ç°ç»èæ½ç¦»å¨å¤é¨æä»¶ |
| | | import animationMap from './nvue.ani-map.js' |
| | | |
| | | // #ifndef APP-NVUE |
| | | // å®ä¹ç±»åï¼éè¿ç»å
ç´ å¨æåæ¢ç±»åï¼èµäºå
ç´ ä¸å®çcsså¨ç»æ ·å¼ |
| | | const getClassNames = (name) => ({ |
| | | enter: `u-${name}-enter u-${name}-enter-active`, |
| | | 'enter-to': `u-${name}-enter-to u-${name}-enter-active`, |
| | | leave: `u-${name}-leave u-${name}-leave-active`, |
| | | 'leave-to': `u-${name}-leave-to u-${name}-leave-active` |
| | | }) |
| | | // #endif |
| | | |
| | | // #ifdef APP-NVUE |
| | | // å¼å
¥nvue(weex)çanimationå¨ç»æ¨¡åï¼ææ¡£è§ï¼ |
| | | // https://weex.apache.org/zh/docs/modules/animation.html#transition |
| | | const animation = uni.requireNativePlugin('animation') |
| | | const getStyle = (name) => animationMap[name] |
| | | // #endif |
| | | |
| | | export default { |
| | | methods: { |
| | | // ç»ä»¶è¢«ç¹å»ååºäºä»¶ |
| | | clickHandler() { |
| | | this.$emit('click') |
| | | }, |
| | | // #ifndef APP-NVUE |
| | | // vueçæ¬çç»ä»¶è¿åºå¤ç |
| | | vueEnter() { |
| | | // å¨ç»è¿å
¥æ¶çç±»å |
| | | const classNames = getClassNames(this.mode) |
| | | // å®ä¹ç¶æåååºå¨ç»è¿å
¥åäºä»¶ |
| | | this.status = 'enter' |
| | | this.$emit('beforeEnter') |
| | | this.inited = true |
| | | this.display = true |
| | | this.classes = classNames.enter |
| | | this.$nextTick(async () => { |
| | | // #ifdef H5 |
| | | await uni.$u.sleep(20) |
| | | // #endif |
| | | // æ è¯å¨ç»å°æªç»æ |
| | | this.$emit('enter') |
| | | this.transitionEnded = false |
| | | // ç»ä»¶å¨ç»è¿å
¥å触åçäºä»¶ |
| | | this.$emit('afterEnter') |
| | | // èµäºç»ä»¶enter-toç±»å |
| | | this.classes = classNames['enter-to'] |
| | | }) |
| | | }, |
| | | // å¨ç»ç¦»åºå¤ç |
| | | vueLeave() { |
| | | // 妿䏿¯å±ç¤ºç¶æï¼æ éæ§è¡é»è¾ |
| | | if (!this.display) return |
| | | const classNames = getClassNames(this.mode) |
| | | // æ 记离å¼ç¶æåååºäºä»¶ |
| | | this.status = 'leave' |
| | | this.$emit('beforeLeave') |
| | | // è·å¾ç±»å |
| | | this.classes = classNames.leave |
| | | |
| | | this.$nextTick(() => { |
| | | // å¨ç»æ£å¨ç¦»åºçç¶æ |
| | | this.transitionEnded = false |
| | | this.$emit('leave') |
| | | // ç»ä»¶æ§è¡å¨ç»ï¼å°äºæ§è¡çæ§è¡æ¶é´åï¼æ§è¡ä¸äºé¢å¤å¤ç |
| | | setTimeout(this.onTransitionEnd, this.duration) |
| | | this.classes = classNames['leave-to'] |
| | | }) |
| | | }, |
| | | // #endif |
| | | // #ifdef APP-NVUE |
| | | // nvueçæ¬å¨ç»è¿åº |
| | | nvueEnter() { |
| | | // è·å¾æ ·å¼çåç§° |
| | | const currentStyle = getStyle(this.mode) |
| | | // ç»ä»¶å¨ç»ç¶æåååºäºä»¶ |
| | | this.status = 'enter' |
| | | this.$emit('beforeEnter') |
| | | // å±ç¤ºçæç»ä»¶å
ç´ |
| | | this.inited = true |
| | | this.display = true |
| | | // å¨nvueå®åä¸ï¼ç±äºæ¸²æé度æ
¢ï¼å¨å¼¹çªï¼é®çï¼æ¥åçç»ä»¶ä¸ï¼æ¸²æå
¶ä¸çå
容éè¦æ¶é´ |
| | | // 导è´åºç°å¼¹çªå¡é¡¿ï¼è¿é让å
¶ä¸å¼å§ä¸ºéæç¶æï¼çä¸å®æ¶é´æ¸²æå®æåï¼å让å
¶éèèµ·æ¥ï¼å让å
¶ææ£å¸¸é»è¾åºç° |
| | | this.viewStyle = { |
| | | opacity: 0 |
| | | } |
| | | // çå¾
å¼¹çªå
容渲æå®æ |
| | | this.$nextTick(() => { |
| | | // åå¹¶æ ·å¼ |
| | | this.viewStyle = currentStyle.enter |
| | | Promise.resolve() |
| | | .then(nextTick) |
| | | .then(() => { |
| | | // ç»ä»¶å¼å§è¿å
¥åçäºä»¶ |
| | | this.$emit('enter') |
| | | // nvueçtransitionå¨ç»æ¨¡åéè¦éè¿refè°ç¨ç»ä»¶ï¼æ³¨ææ¤å¤çrefä¸åäºvueçthis.$refs['u-transition']ç¨æ³ |
| | | animation.transition(this.$refs['u-transition'].ref, { |
| | | styles: currentStyle['enter-to'], |
| | | duration: this.duration, |
| | | timingFunction: this.timingFunction, |
| | | needLayout: false, |
| | | delay: 0 |
| | | }, () => { |
| | | // å¨ç»æ§è¡å®æ¯ï¼ååºäºä»¶ |
| | | this.$emit('afterEnter') |
| | | }) |
| | | }) |
| | | .catch(() => {}) |
| | | }) |
| | | }, |
| | | nvueLeave() { |
| | | if (!this.display) { |
| | | return |
| | | } |
| | | const currentStyle = getStyle(this.mode) |
| | | // å®ä¹ç¶æåäºä»¶ |
| | | this.status = 'leave' |
| | | this.$emit('beforeLeave') |
| | | // åå¹¶æ ·å¼ |
| | | this.viewStyle = currentStyle.leave |
| | | // æ¾å°promiseä¸å¤çæ§è¡è¿ç¨ |
| | | Promise.resolve() |
| | | .then(nextTick) // çå¾
å åms |
| | | .then(() => { |
| | | this.transitionEnded = false |
| | | // å¨ç»æ£å¨ç¦»åºçç¶æ |
| | | this.$emit('leave') |
| | | animation.transition(this.$refs['u-transition'].ref, { |
| | | styles: currentStyle['leave-to'], |
| | | duration: this.duration, |
| | | timingFunction: this.timingFunction, |
| | | needLayout: false, |
| | | delay: 0 |
| | | }, () => { |
| | | this.onTransitionEnd() |
| | | }) |
| | | }) |
| | | .catch(() => {}) |
| | | }, |
| | | // #endif |
| | | // å®æè¿æ¸¡å触å |
| | | onTransitionEnd() { |
| | | // å¦æå·²ç»æ¯ç»æçç¶æï¼æ éåå¤ç |
| | | if (this.transitionEnded) return |
| | | this.transitionEnded = true |
| | | // ååºç»ä»¶å¨ç»æ§è¡åçäºä»¶ |
| | | this.$emit(this.status === 'leave' ? 'afterLeave' : 'afterEnter') |
| | | if (!this.show && this.display) { |
| | | this.display = false |
| | | this.inited = false |
| | | } |
| | | } |
| | | } |
| | | } |