New file |
| | |
| | | <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> |