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