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