基于vue2.0前端多条数据实现虚拟列表

实现原理:

测试多条数据是随机的,后续可以自行从父组件传入子元素的高度和数组;源码如下:

<template>
    <!-- 可视区域的容器 -->
    <div ref="list" class="list-container" @scroll="scrollEvent($event)">
        <!-- 容器内的占位,高度为总列表高度,用于形成滚动条 -->
        <div class="scroll-area" :style="{ height: listHeight + 'px' }"></div>
        <!-- 为列表项的渲染区域 -->
        <div class="view-area" :style="{ transform: getTransform }">
            <div ref="items"
                class="list-item"
                v-for="item in visibleData"
                :key="item.key"
                :style="{ height: itemHeight + 'px',lineHeight: itemHeight + 'px' }"
            >{{ item.value }}</div>
        </div>
    </div>
</template>
<script>
export default {
    data(){
        return{
            itemHeight:200,
            listData:[],
            screenHeight:0,//可视区域高度
            startOffset:0,//偏移量
            start:0,//起始索引
            end:null,//结束索引
        }
    },
    beforeMount(){
        this.listData = new Array(100);
        // 生成随机整数并赋值给数组的每个元素
        for (let i = 0; i < this.listData.length; i++) {
            this.listData[i] = {value:Math.floor(Math.random() * 100),key:i};
        }
    },
    computed:{
        listHeight(){//列表总高度
            return this.listData.length * this.itemHeight;
        },
        visibleCount(){//可显示列表数据量
            return Math.ceil(this.screenHeight / this.itemHeight)
        },
        getTransform(){ //偏移量style
            return `translate3d(0,${this.startOffset}px,0)`;
        },
        visibleData(){//可视列表数据
            return this.listData.slice(this.start, Math.min(this.end,this.listData.length));
        }
    },
    mounted() {
        this.screenHeight = this.$el.clientHeight;
        this.start = 0;
        this.end = this.start + this.visibleCount;
    },
  methods: {
    scrollEvent() {
      let scrollTop = this.$refs.list.scrollTop;//当前滚动所在位置
      this.start = Math.floor(scrollTop / this.itemHeight);//当前开始索引
      this.end = this.start + this.visibleCount;//当前结束索引
      this.startOffset = scrollTop - (scrollTop % this.itemHeight);//此时的偏移量
    }
  }
}
</script>
<style scoped>
.list-container {
  height: 100%;
  overflow: auto;
  position: relative;
}

.scroll-area {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
}

.view-area {
  left: 0;
  right: 0;
  top: 0;
  position: absolute;
  text-align: center;
}

.list-item {
  padding: 10px;
  color: red
}
</style>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建项目文件夹,使用npm init初始化项目,生成package.json文件。 2. 安装Vue.js和Vue CLI(命令行界面)。 npm install vue npm install -g vue-cli 3. 使用Vue CLI创建项目。 vue init webpack my-project 4. 进入项目文件夹,安装依赖。 cd my-project npm install 5. 启动项目,查看是否成功。 npm run dev 6. 添加路由管理器vue-router。 npm install vue-router 7. 在src文件夹中创建views文件夹,存放所有页面组件。 8. 在src文件夹中创建components文件夹,存放所有公共组件。 9. 在src文件夹中创建assets文件夹,存放所有图片、样式和字体文件。 10. 在src文件夹中创建utils文件夹,存放所有工具函数。 11. 在src文件夹中创建config文件夹,存放所有配置文件。 12. 在src文件夹中创建store文件夹,存放所有状态管理文件。 13. 在src文件夹中创建App.vue文件,作为根组件,包含所有其他组件。 14. 在src文件夹中创建main.js文件,作为项目入口文件,配置路由、状态管理、插件等。 15. 在src文件夹中创建router文件夹,存放所有路由配置文件。 16. 在src文件夹中创建store文件夹,存放所有状态管理文件。 17. 在src文件夹中创建plugins文件夹,存放所有插件文件。 18. 在src文件夹中创建filters文件夹,存放所有过滤器文件。 19. 在src文件夹中创建mixins文件夹,存放所有混入文件。 20. 在src文件夹中创建directives文件夹,存放所有指令文件。 21. 在src文件夹中创建services文件夹,存放所有服务文件。 22. 在src文件夹中创建mock文件夹,存放所有mock数据文件。 23. 在根目录下创建vue.config.js文件,配置webpack,例如添加别名、打包选项等。 24. 在根目录下创建.babelrc文件,配置babel转码规则,例如添加ES6转ES5的插件。 25. 在根目录下创建.postcssrc.js文件,配置postcss转码规则,例如添加autoprefixer插件。 26. 在根目录下创建.editorconfig文件,配置编辑器格式化规则。 27. 在根目录下创建.eslint.js文件,配置eslint规则。 28. 在根目录下创建.prettierrc文件,配置prettier规则。 29. 在根目录下创建README.md文件,编写项目介绍、使用方法等文档。 30. 在根目录下创建LICENSE文件,添加开源协议。 这样,一个基于vue2.0前端框架就搭建好了。在实际开发过程中,可以根据项目需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值