186 lines
4.6 KiB
Vue
186 lines
4.6 KiB
Vue
<template>
|
|
<!-- #ifndef MP-WEIXIN || MP-QQ -->
|
|
<view :class="['swiper-slide',slideClass]" :style="[itemStyle,customStyle]" @click.stop="onClickSlide">
|
|
<!-- #endif -->
|
|
<!-- #ifdef MP-WEIXIN || MP-QQ -->
|
|
<view :class="['swiper-slide',slideClass]" :style="[itemStyle,customStyle]" @click.stop="onClickSlide"
|
|
:swiperItemTransform="wxsItemTransform" :change:swiperItemTransform="zSwiperWxs.wxsItemTransformObserver">
|
|
<!-- #endif -->
|
|
<slot></slot>
|
|
</view>
|
|
</template>
|
|
<!-- #ifdef MP-WEIXIN || MP-QQ -->
|
|
<script src="../../wxs/z-swiper-wxs.wxs" module="zSwiperWxs" lang="wxs"></script>
|
|
<!-- #endif -->
|
|
<script>
|
|
import {
|
|
ChildrenMixin
|
|
} from '../../libs/mixins/relation.js';
|
|
import {
|
|
getRect
|
|
} from '../../libs/utils/utils.js';
|
|
export default {
|
|
name: "z-swipe-item",
|
|
// #ifdef MP-WEIXIN
|
|
options: {
|
|
virtualHost: true
|
|
},
|
|
// #endif
|
|
mixins: [ChildrenMixin('zSwipe')],
|
|
props: {
|
|
customStyle: {
|
|
type: Object,
|
|
default: () => {
|
|
return {};
|
|
}
|
|
},
|
|
swiperItemWidth: {
|
|
type: [String, Number],
|
|
default: 0
|
|
},
|
|
swiperItemHeight: {
|
|
type: [String, Number],
|
|
default: 0
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
wxsItemTransform: "",
|
|
itemStyle: {},
|
|
offsetLeft: 0,
|
|
offsetTop: 0,
|
|
itemClass: [],
|
|
width: 0,
|
|
height: 0,
|
|
};
|
|
},
|
|
mounted() {
|
|
this.getSize();
|
|
},
|
|
computed: {
|
|
slideClass() {
|
|
return this.itemClass.join(" ");
|
|
}
|
|
},
|
|
watch: {
|
|
swiperItemWidth: {
|
|
handler(val) {
|
|
if (val) {
|
|
this.$set(this.itemStyle, 'width', this.unitFormat(val, "rpx"))
|
|
}
|
|
},
|
|
immediate: true
|
|
},
|
|
swiperItemHeight: {
|
|
handler(val) {
|
|
if (val) {
|
|
this.$set(this.itemStyle, 'height', this.unitFormat(val, "rpx"))
|
|
}
|
|
},
|
|
immediate: true
|
|
}
|
|
},
|
|
methods: {
|
|
unitFormat(val, type) {
|
|
if (type == "rpx") {
|
|
if (val.includes("rpx") || val.includes("px")) {
|
|
return val;
|
|
} else {
|
|
return val + 'px';
|
|
}
|
|
}
|
|
if (type == "number") {
|
|
if (val.includes("rpx")) {
|
|
return uni.upx2px(parseInt(val.replace("rpx", "")))
|
|
} else if (!val.includes("rpx") && val.includes("px")) {
|
|
return parseInt(val.replace("px", ""))
|
|
} else {
|
|
return val;
|
|
}
|
|
}
|
|
},
|
|
onClickSlide(event) {
|
|
this.$emit("click", {
|
|
event,
|
|
index: this.index
|
|
});
|
|
this.parent.swiper.updateClickedSlide(this.index);
|
|
this.parent.swiper.emit("slideClick", this.index);
|
|
},
|
|
transform(value) {
|
|
// #ifndef MP-WEIXIN || MP-QQ
|
|
this.$set(this.itemStyle, 'transform', value)
|
|
// #endif
|
|
// #ifdef MP-WEIXIN || MP-QQ
|
|
this.wxsItemTransform = value
|
|
// #endif
|
|
},
|
|
transition(value) {
|
|
// #ifdef MP-BAIDU
|
|
this.$set(this.itemStyle, 'transitionDuration', `${value}ms`)
|
|
// #endif
|
|
// #ifndef MP-BAIDU
|
|
this.$set(this.itemStyle, 'transition-duration', `${value}ms`)
|
|
// #endif
|
|
},
|
|
willChange(value) {
|
|
this.$set(this.itemStyle, 'will-change', value)
|
|
},
|
|
css(value) {
|
|
Object.keys(value).forEach((item) => {
|
|
this.$set(this.itemStyle, item, value[item])
|
|
})
|
|
},
|
|
transitionEnd(callback, duration) {
|
|
setTimeout(callback, duration)
|
|
},
|
|
getSize() {
|
|
const query = uni.createSelectorQuery().in(this);
|
|
return new Promise((resolve, reject) => {
|
|
query.select('.swiper-slide').boundingClientRect(data => {
|
|
if (this.swiperItemWidth) {
|
|
this.width = this.unitFormat(this.swiperItemWidth, "number");
|
|
this.height = data.height;
|
|
}
|
|
if (this.swiperItemHeight) {
|
|
this.width = data.width;
|
|
this.height = this.unitFormat(this.swiperItemHeight, "number");
|
|
}
|
|
if (!this.swiperItemWidth && !this.swiperItemHeight) {
|
|
this.width = data.width;
|
|
this.height = data.height;
|
|
}
|
|
resolve({
|
|
width: this.width,
|
|
height: this.height
|
|
})
|
|
}).exec();
|
|
})
|
|
},
|
|
addClass(value) {
|
|
this.itemClass = Array.from(new Set([...this.itemClass, ...value.split(" ")]));
|
|
},
|
|
removeClass(value) {
|
|
this.itemClass = this.itemClass.filter(item => !value.split(" ").includes(item));
|
|
},
|
|
hasClass(value) {
|
|
return this.itemClass.includes(value);
|
|
},
|
|
nextAll() {
|
|
return this.parent.children.filter((item) => {
|
|
return item.index > this.index
|
|
})
|
|
},
|
|
prevAll() {
|
|
return this.parent.children.filter((item) => {
|
|
return item.index < this.index
|
|
}).reverse()
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
@import '../../libs/core.scss';
|
|
</style>
|