qa-deu-tv/components/unitv-item/unitv-item.vue

117 lines
2.3 KiB
Vue

<template>
<view :id="id" :class="`${selected?selectClass:''} ${hovered?hoverClass:''}`">
<slot></slot>
</view>
</template>
<script>
import {
mapActions,
mapState
} from 'vuex';
export default {
name: "unitvPage",
inject: ['pageId', 'zoneId', 'zoneState', 'zoneItems'],
props: {
item: {
type: Number
},
hoverClass: {
type: String,
default: 'hover'
},
selectClass: {
type: String,
default: 'active'
},
isSelctByClick: {
type: Boolean,
default: false
},
isSelect: {
type: Boolean,
default: false
}
},
updated() {
this.zoneItems[this.item] = this;
},
created() {
this.zoneItems[this.item] = this;
this.selected=this.isSelect;
},
mounted() {
if (this.zoneState.curZone && this.zoneState.curItem == this.item) {
this.handleHover();
this.refreshScroll();
this.refreshState();
}
},
data() {
return {
selected: false,
hovered: false
}
},
computed: {
...mapState(['currentZone', 'currentPage']),
id: function() {
return this.zoneId + '_' + this.item;
}
},
methods: {
clientRect(callback) {
let view = uni.createSelectorQuery().in(this).select("#" + this.id);
view.boundingClientRect(data => {
callback(data);
}).exec();
},
refreshScroll() {
this.clientRect((clientRect) => {
this.currentPage.RefreshScrollTop(clientRect);
if (this.zoneState.curScroll != null) {
this.zoneState.curScroll.RefreshScrollLeft(clientRect);
}
});
},
refreshState() {
if (!this.isSelctByClick) {
if (!this.zoneState.curZone && this.zoneState.curItem == this.item) {
this.selected = true;
} else {
this.selected = false;
}
}
if (this.zoneState.curZone && this.zoneState.curItem == this.item) {
this.hovered = true;
} else {
this.hovered = false;
}
},
handleHover() {
this.$emit("hover", this.item);
},
handleClick() {
if (this.isSelctByClick) {
this.zoneItems.forEach(item => {
item.selected = false
})
this.selected = true
}
this.$emit("click", this.item);
}
},
watch: {
hovered: function(newValue) {
if (newValue != "") {
this.handleHover();
this.refreshScroll();
}
}
}
}
</script>
<style scoped>
</style>