<template> 
 | 
    <!-- #ifdef APP-NVUE --> 
 | 
    <cell> 
 | 
        <!-- #endif --> 
 | 
        <view 
 | 
            class="u-list-item" 
 | 
            :ref="`u-list-item-${anchor}`" 
 | 
            :anchor="`u-list-item-${anchor}`" 
 | 
            :class="[`u-list-item-${anchor}`]" 
 | 
        > 
 | 
            <slot /> 
 | 
        </view> 
 | 
        <!-- #ifdef APP-NVUE --> 
 | 
    </cell> 
 | 
    <!-- #endif --> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
    import props from './props.js'; 
 | 
    // #ifdef APP-NVUE 
 | 
    const dom = uni.requireNativePlugin('dom') 
 | 
    // #endif 
 | 
    /** 
 | 
     * List 列表 
 | 
     * @description 该组件为高性能列表组件 
 | 
     * @tutorial https://www.uviewui.com/components/list.html 
 | 
     * @property {String | Number}    anchor    用于滚动到指定item 
 | 
     * @example <u-list-ite v-for="(item, index) in indexList" :key="index" ></u-list-item> 
 | 
     */ 
 | 
    export default { 
 | 
        name: 'u-list-item', 
 | 
        mixins: [uni.$u.mpMixin, uni.$u.mixin,props], 
 | 
        data() { 
 | 
            return { 
 | 
                // 节点信息 
 | 
                rect: {}, 
 | 
                index: 0, 
 | 
                show: true, 
 | 
                sys: uni.$u.sys() 
 | 
            } 
 | 
        }, 
 | 
        computed: { 
 | 
  
 | 
        }, 
 | 
        inject: ['uList'], 
 | 
        watch: { 
 | 
            // #ifndef APP-NVUE 
 | 
            'uList.innerScrollTop'(n) { 
 | 
                const preLoadScreen = this.uList.preLoadScreen 
 | 
                const windowHeight = this.sys.windowHeight 
 | 
                if(n <= windowHeight * preLoadScreen) { 
 | 
                    this.parent.updateOffsetFromChild(0) 
 | 
                } else if (this.rect.top <= n - windowHeight * preLoadScreen) { 
 | 
                    this.parent.updateOffsetFromChild(this.rect.top) 
 | 
                } 
 | 
            } 
 | 
            // #endif 
 | 
        }, 
 | 
        created() { 
 | 
            this.parent = {} 
 | 
        }, 
 | 
        mounted() { 
 | 
            this.init() 
 | 
        }, 
 | 
        methods: { 
 | 
            init() { 
 | 
                // 初始化数据 
 | 
                this.updateParentData() 
 | 
                this.index = this.parent.children.indexOf(this) 
 | 
                this.resize() 
 | 
            }, 
 | 
            updateParentData() { 
 | 
                // 此方法在mixin中 
 | 
                this.getParentData('u-list') 
 | 
            }, 
 | 
            resize() { 
 | 
                this.queryRect(`u-list-item-${this.anchor}`).then(size => { 
 | 
                    const lastChild = this.parent.children[this.index - 1] 
 | 
                    this.rect = size 
 | 
                    const preLoadScreen = this.uList.preLoadScreen 
 | 
                    const windowHeight = this.sys.windowHeight 
 | 
                    // #ifndef APP-NVUE 
 | 
                    if (lastChild) { 
 | 
                        this.rect.top = lastChild.rect.top + lastChild.rect.height 
 | 
                    } 
 | 
                    if (size.top >= this.uList.innerScrollTop + (1 + preLoadScreen) * windowHeight) this.show = 
 | 
                        false 
 | 
                    // #endif 
 | 
                }) 
 | 
            }, 
 | 
            // 查询元素尺寸 
 | 
            queryRect(el) { 
 | 
                return new Promise(resolve => { 
 | 
                    // #ifndef APP-NVUE 
 | 
                    this.$uGetRect(`.${el}`).then(size => { 
 | 
                        resolve(size) 
 | 
                    }) 
 | 
                    // #endif 
 | 
  
 | 
                    // #ifdef APP-NVUE 
 | 
                    const ref = this.$refs[el] 
 | 
                    dom.getComponentRect(ref, res => { 
 | 
                        resolve(res.size) 
 | 
                    }) 
 | 
                    // #endif 
 | 
                }) 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
    @import "../../libs/css/components.scss"; 
 | 
  
 | 
    .u-list-item {} 
 | 
</style> 
 |