96 lines
2.8 KiB
Vue
96 lines
2.8 KiB
Vue
|
<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';
|
|||
|
import mpMixin from '../../libs/mixin/mpMixin.js';
|
|||
|
import mixin from '../../libs/mixin/mixin.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: '', // 应用的类名
|
|||
|
}
|
|||
|
},
|
|||
|
emits: ['click', 'beforeEnter', 'enter', 'afterEnter', 'beforeLeave', 'leave', 'afterLeave'],
|
|||
|
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: [mpMixin, 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>
|