117 lines
2.3 KiB
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>
|