美文网首页
虚拟滚动-数组平级数据结构

虚拟滚动-数组平级数据结构

作者: 有一个程序媛 | 来源:发表于2021-08-27 17:01 被阅读0次

虚拟滚动平级数据结构

import { onMounted, defineComponent, ref, computed, watch, toRefs } from 'vue'

const Index = defineComponent({

  props: {

    /**

    * 可见区域内显示多少条--区域高度/每一条记录的样式高度

    */

    pageSize: {

      type: Number,

      default: 20

    },

    /**

    * 数组数据

    */

    list: {

      type: Array,

      default: []

    },

    /**

    * 容器高度

    */

    height: {

      type: Number,

      default: 400

    },

    /**

    * 获取接口函数

    */

    getData: {

      type: Function

    },

    /**

    * 获取接口的参数

    */

    params: {

      type: Object,

      default: {}

    }

  },

  name: 'virtualScroll',

  setup(props, ctx) {

    const { pageSize, height, params } = toRefs(props)

    const getData = props.getData

    const list = ref([])

    const startIndex = ref(0) // 当前区域显示的数据起始index

    const endIndex = ref(pageSize.value) // 数据结束index

    const paddingTop = ref(0) // 当前区域下scrollList区域的paddingtop值

    const paddingBottom = ref(0) // 当前区域下scrollList区域的paddingbottom值

    const allHeight = ref(0) // 大量无数条数据的高度

    const itemHeight = ref(22)

    const myRef = ref(null)

    const scrollList = computed(() => list.value.slice(startIndex.value, endIndex.value)) //滚动区域的数据集合

    const defaultStyle = {'overflow-y': 'auto', 'height': height.value + 'px'}

    /**

    * 滚动区域的样式

    */

    const style = computed(() => {

      return {

        paddingTop: paddingTop.value + 'px',

        paddingBottom: paddingBottom.value + 'px'

      }

    })

    /**

    * 监听滚动条的滚动事件

    */

    const scroll = (e) => {

      const container = document.getElementById('container')

      const top = container.scrollTop

      startIndex.value = Math.floor(top / itemHeight.value) // 已经滚走了多少条数据 (当前区域的list start下标)

      endIndex.value = startIndex.value + pageSize.value // 当前区域的list end下标

      paddingTop.value = top

      if (endIndex.value >= list.value.length - 1) { // 最后一条 直接return

        paddingBottom.value = 0

        return

      }

      paddingBottom.value = allHeight.value - height - top // 否则就拿所有数据的高度 - 当前可视区域的高度 - paddingtop值 = paddingbottom值

    }

    /**

    * 获取总高度,padding值

    */

    const getHeightPadding = (val) => {

      list.value = val

      const valLen = val.length

      allHeight.value = valLen * itemHeight.value

      paddingBottom.value = allHeight.value - scrollList.value.length * itemHeight.value

    }

    /**

    * 监听数据的变化,padding值和高度相应变化

    */

    watch(() => list.value, (val) => {

      getHeightPadding(val)

    })

    onMounted(() => {

      getData(params.value).then((res) => {

        getHeightPadding(res)

      })

    })

    return () => (

      <div ref={myRef} id="container" style={defaultStyle} onscroll={(e) => {

        scroll(e)

      }}>

        <div style={style.value}>

          {scrollList.value.map((item) => {

            return <div>{ctx.slots.content?ctx.slots.content(item) : item.name}</div>

          })}

        </div>

      </div>

    )

  },

  // render() {

  // }

})

export default Index

相关文章

  • 虚拟滚动-数组平级数据结构

    import{onMounted,defineComponent,ref,computed,watch,toRef...

  • 数据结构:数组

    00数据结构与算法分析:大纲01数据结构:数组02数据结构:链表03数据结构:栈03数据结构:队列 数组 数组是一...

  • 虚拟滚动

    示意图

  • 2016-07-30

    滚动视图 UIScrollView *scroll;//滚动视图 NSArray *imgArr;//图片数组 U...

  • 2021-09-07编程trick

    动态规划,仅仅与上一状态有关的,可以滚动数组 滚动数组时,一般生成一个新的数组,当作新数组,因为记忆数组需要在外部...

  • 重温:数据结构与算法 - 03数组

    数据结构与算法之美 - 数组 数据结构与算法之美-学习大纲 什么数组? 数组是一种 线性表 数据结构。它用一组 连...

  • 关于HashMap,这篇文章已经总结很详细了

    HashMap的底层数据结构? HashMap 是我们非常常用的数据结构,由 数组和链表组合构成 的数据结构。数组...

  • 剑指offer阅读(一)

    数据结构 面试题二: 数组 数组是一种最简单的数据结构,占据一块连续的数据结构并按照顺序存储数据。创建数组时,我们...

  • HashMap原理基础

    数据结构分析 数据结构:数组+链表(或红黑树) 数组:Entry implements Map.Entr...

  • Kotlin数据容器(1)✔️数组

    对象数组基本数据类型数组   数据容器是基于某种数据结构的,常见的数据结构有数组 (Array)、集 (Set)、...

网友评论

      本文标题:虚拟滚动-数组平级数据结构

      本文链接:https://www.haomeiwen.com/subject/ptehmltx.html