quanyawei
2023-11-10 0a24ffeb3eff074c8f11e9f94fdf2c2cb4929799
uni_modules/uview-ui/components/u-transition/u-transition.vue
New file
@@ -0,0 +1,92 @@
<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>