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