uv-vtabs-item.vue 1.5 KB
<template>
		<view 
			class="uv-vtabs-item"
			:id="`content_${index}`"
			ref="uv-vtabs-item"
		>
			<slot />
		</view>
</template>
<script>
	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js';
	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js';
	// #ifdef APP-NVUE
	const dom = uni.requireNativePlugin('dom');
	// #endif
	export default {
		name: 'uv-vtabs-item',
		mixins: [mpMixin, mixin],
		props: {
			index: {
				type: [Number,String],
				default: 0
			}
		},
		data(){
			return {
				// 记录item的离顶部的距离
				top: 0,
				// 记录item的高度
				height: 0
				// 是否为联动
			}
		},
		mounted() {
			this.init();
		},
		methods: {
			async init(){
				this.getParentData('uv-vtabs');
				if (!this.parent) {
					return this.$uv.error('uv-vtabs必须要搭配uv-vtabs-item组件使用')
				}
				if(!this.parent.chain) return;
				await this.$uv.sleep();
				this.getItemRect().then(size=>{
					// 由于对象的引用特性,此处会同时生效到父组件的children数组的本实例的top属性中,供父组件判断读取
					this.top = size.top;
					this.height = size.height;
				});
			},
			getItemRect(){
				return new Promise(resolve => {
					// #ifndef APP-NVUE
					this.$uvGetRect('.uv-vtabs-item').then(size => {
						resolve(size)
					})
					// #endif
					// #ifdef APP-NVUE
					const ref = this.$refs['uv-vtabs-item']
					dom.getComponentRect(ref, res => {
						resolve(res.size)
					})
					// #endif
				})
			}
		}
	}
</script>