重组件的优化和页面渲染十万条数据

news2024/11/24 20:03:07

重组件的优化和页面渲染十万条数据的优化

  • 重组件的优化
    • vue2写法
    • vue3写法
  • 页面渲染十万条数据的优化
    • 使用虚拟列表的方式

重组件的优化

以下代码原理是使用requestAnimationFrame(callback) 方法在这里插入图片描述

vue2写法

Test01.vue

<template>
  <div class="container">
    <div v-for="n in 100" :key="n">
      <HeavyCom v-if="defer(n)"></HeavyCom>
    </div>
  </div>
</template>

<script>
import HeavyCom from "@/views/HeavyCom";

export default {
  components: { HeavyCom },
  data() {
    return {
      frameCount: 0,
    };
  },
  created() {
    this.updateFrameCount();
  },
  methods: {
    updateFrameCount() {
      const maxCount = 100;
      this.frameCount++;
      if (this.frameCount < maxCount) {
        requestAnimationFrame(this.updateFrameCount);
      }
    },
    defer(n) {
      return this.frameCount >= n;
    },
  },
};
</script>

<style>
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 1em;
}
</style>

子组件HeavyCom.vue

<template>
  <div class="item-container">
    <div class="item" v-for="n in 5000" :key="n"></div>
  </div>
</template>

<script>
export default {
  name: "HeavyCom"
}
</script>

<style lang="scss">
.item-container {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  border: 3px solid #f40;
  width: 600px;
  height: 600px;
  box-sizing: border-box;
  .item {
    width: 4px;
    height: 4px;
    background: #ccc;
    margin: 1px;
  }
}
</style>

vue3写法

Test01.vue

<template>
  <div class="container">
    <div v-for="n in 100" :key="n">
      <HeavyComp v-if="defer(n)"></HeavyComp>
    </div>
  </div>
</template>
<script setup>
import HeavyComp from "@/views/HeavyComp";
import { useDefer } from './useDefer'
const defer = useDefer();
</script>

<style>
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 1em;
}
</style>

子组件HeavyComp.vue

<template>
  <div class="item-container">
    <div class="item" v-for="n in 5000" :key="n"></div>
  </div>
</template>

<style>
.item-container {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  border: 3px solid #f40;
}
.item {
  width: 5px;
  height: 3px;
  background: #ccc;
  margin: 0.1em;
}
</style>

useDefer.js

import {ref, onUnmounted} from "vue";
export function useDefer(maxCount = 100) {
    const frameCount = ref(0);
    let rafId;
    function updateFrameCount() {
        rafId = requestAnimationFrame(() => {
            frameCount.value++
            if (frameCount.value >= maxCount) {
                return;
            }
            updateFrameCount();
        });
    }
    updateFrameCount();
    onUnmounted(() => {
        cancelAnimationFrame(rafId);
    });
    return function defer(n) {
        console.log(frameCount.value, n);
        return frameCount.value >= n;
    }
}

结果:这里为了录制gif不卡顿,只渲染50个重组件
优点: 首屏渲染很快,后续的再依次加载
缺点: 快速滚动时,会出现短暂的白屏
在这里插入图片描述

页面渲染十万条数据的优化

使用虚拟列表的方式

通过这张图来表示虚拟列表,红框代表你的手机,黑条代表一条条数据
在这里插入图片描述

思路:我们只要知道手机屏幕最多能放下几条数据,当下拉滑动时,通过双指针的方式截取相应的数据就可以了。
🚩 PS:为了防止滑动过快导致的白屏现象,我们可以使用预加载的方式多加载一些数据出来。

在Test02.vue

<template>
  <div ref="list" class="v-scroll" @scroll="scrollEvent($event)">
    <div class="infinite-list" :style="{ height: listHeight + 'px' }"></div>

    <div class="scroll-list" :style="{ transform: getTransform }">
      <div ref="items" class="scroll-item" v-for="item in visibleData" :key="item.id" :style="{ height: itemHeight + 'px',lineHeight: itemHeight + 'px' }">{{ item.msg }}</div>
    </div>
  </div>
</template>

<script>
export default {
  name: "Test02",
  data() {
    return {
      // 数据
      listData: [],
      // 每项的高度
      itemHeight: 60,
      //可视区域高度
      screenHeight: 600,
      //偏移量
      startOffset: 0,
      //起始索引
      start: 0,
      //结束索引
      end: null,
    };
  },
  computed: {
    //列表总高度
    listHeight() {
      return this.listData.length * this.itemHeight;
    },
    //可显示的列表项数
    visibleCount() {
      return Math.ceil(this.screenHeight / this.itemHeight);
    },
    //偏移量对应的style
    getTransform() {
      return `translate(0,${this.startOffset}px)`;
    },
    //获取真实显示列表数据
    visibleData() {
      return this.listData.slice(this.start, Math.min(this.end, this.listData.length));
    }
  },
  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);
    }
  },
  mounted() {
    for (let i = 1; i <= 100000; i++) {
      this.listData.push({id: i, msg: i})
    }
    this.start = 0;
    this.end = this.start + this.visibleCount;
  }
}
</script>

<style>
.v-scroll {
  height: 600px;
  width: 400px;
  border: 3px solid #000;
  overflow: auto;
  position: relative;
  -webkit-overflow-scrolling: touch;
}

.infinite-list {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  z-index: -1;
}

.scroll-list {
  left: 0;
  right: 0;
  top: 0;
  position: absolute;
  text-align: center;
}

.scroll-item {
  padding: 10px;
  color: #555;
  box-sizing: border-box;
  border-bottom: 1px solid #999;
}
</style>

结果:这里为了录制gif不卡顿,只渲染一万条
优点:页面上只渲染出可视区域的内容,非常丝滑,无白屏现象
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1123391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十届山东省大学生网络安全技能大赛【神秘的base】【小试牛刀】

神秘的base 题目描述 EvAzEwo6E9RO4qSAHq42E9KvEv5zHDt34GtdHGJaHD7NHG42bwd神奇密码&#xff1a; xbQTZqjN8ERuwlzVfUIrPkeHd******LK697o2pSsGDncgm3CBh/Xy1MF4JAWta解题思路 这个题&#xff0c;上午一直零解&#xff0c;后来放出了hint&#xff0c;提示了base64换表。 这…

iOS 配置通用链接(Universal Link)服务端和开发者后台都配置好了,还是跳转不到App

目录 一、什么是 Universal Link&#xff1f; 1.背景介绍 2.特点 3.运行机制原理&流程图 二、配置教程 1.第一步&#xff1a;开启 Associated Domains 服务 1.1 开通 Associated Domains 2.第二步&#xff1a;服务器配置 apple-app-site-association&#xff08;AAS…

binlog 和 redolog 有什么区别

binlog 和 redolog 都是 Mysql 里面用来记录数据库数据变更操作的日志. binlog 其中 binlog 主要用来做数据备份、数据恢复和数据同步&#xff0c;在Mysql 的主从数据同步的场景中&#xff0c;master 节点的数据变更&#xff0c;会写入到 binlog 中&#xff0c;然后再把 binl…

会声会影2024永久破解中文版下载

会声会影2024中文版是一款功能强大的视频编辑软件、大型视频制作软件、专业视频剪辑软件。会声会影专业视频编辑处理软件&#xff0c;可以用于剪辑合并视频&#xff0c;制作视频&#xff0c;屏幕录制&#xff0c;光盘制作&#xff0c;视频后期编辑、添加特效、字幕和配音等操作…

Allegro在走线时如何隐藏其它网络的飞线

Allegro在走线时,自动隐藏其它网络的飞线,在走线的过程中不会被其它飞线干扰,从而方便快速的走线。 在走线过程中,其它飞线自动隐藏。 操作方法如下: 先激活走线命令,然后在Options选项卡上勾选Auto-blank other rats 则在走线时,其它网络的预拉线全部自动隐藏。

Mybatis plus中的逻辑删除源码跟踪

网上搜了一堆文章&#xff0c;都没有贴出源码&#xff1a; 疑问&#xff1a; 逻辑删除&#xff0c;到底是在哪改变的sql&#xff1f;&#xff1f;&#xff1f; 跟踪方法——DeleteById 说明&#xff1a;逻辑删除&#xff0c;实质用的update语句&#xff1b; 组装逻辑删除字段…

分享画PAD图的软件-PADFlowChart

软件的可执行文件下载&#xff1a;PADFlowChart-exe.zip 如果有帮助望三联

第63讲:MySQL存储过程变量传参的核心概念与案例

文章目录 1.存储过程传参2.存储过程传参的语法结构3.存储过程传参经典案例3.1.IN类型的传参3.2.IN和OUT同时使用的传参3.3.INOUT类型的传参 1.存储过程传参 在创建存储过程时&#xff0c;存储过程名称后面的括号里是可以传入一些参数的&#xff0c;例如传入一个变量&#xff0…

毕业三年,月薪30K,我想跟你聊聊

大家好&#xff0c;我是冰河~~ 很多读者私信问我&#xff0c;自己工作三年多了&#xff0c;随着工作年限的不断增长&#xff0c;感觉自己的技术水平与自己的工作年限严重不符。想跳槽出去换个新环境吧&#xff0c;又感觉自己的能力达不到心仪公司的标准&#xff0c;即使投了简…

蔚蓝科技推BabyAlpha阿尔法机器狗,表象之下是否会重蹈虚假覆辙

最近笔者在朋友圈又刷到这样一条广告&#xff1a;关于一个叫蔚蓝阿尔法机器狗的推广。颇有刷着刷着刷出一条机器狗来的既视感。 经过了解&#xff0c;这是蔚蓝科技公司为旗下新机器狗BabyAlpha推出&#xff0c;投放的朋友圈销售广告。为什么说又呢&#xff0c;因为印象中这家公…

单链表(第二部分)单链表的实现!!!

1.单链表的头文件 #pragma once #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include"contact.h"typedef struct PersonInfo SLTDataType; typedef struct SListNode {…

技术文档工具『Writerside』抢鲜体验

前言 2023 年 10 月 16 日&#xff0c;JetBrains 宣布以早期访问状态推出 Writerside&#xff0c;基于 IntelliJ 平台的 JetBrains IDE&#xff0c;开发人员可使用它编写、构建、测试和发布技术文档&#xff0c;可以作为 JetBrains IDE 中的插件使用&#xff0c;也可以作为独立…

2023年中国汽车塑料模具市场规模、竞争格局及行业趋势分析[图]

汽车注塑模具主要用来制造汽车内外饰件以及座椅等其他塑料零部件&#xff0c;其中又以汽车内外饰件模具最多。汽车内外饰件主要由各类塑料、表皮、织物或复合材料制成&#xff0c;用到的模具主要是塑料模具。从现代汽车使用的材料来看&#xff0c;无论是外装饰件、内装饰件&…

【剑指Offer】36.二叉搜索树与双向链表

题目 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 数据范围&#xff1a;输入二叉树的节点数 0≤n≤1000&#xff0c;二叉树中每个节点的值 0≤val≤1000 要求&#xff1a;O(1)&#xff08;即在原树上操作&#xff09;&#xff0c;时间…

爱尔眼科眼底病论坛糖网病变智能(AI)监测防治培训举办!

为推动四川省眼科学领域的学科建设、规范诊疗行为、提高学术水平&#xff0c;促进国内眼底病学学术交流。由成都高新医学会主办&#xff0c;爱尔眼科集团、爱尔眼科四川省区承办的成都高新医学会第二届眼科学术会议一一爱尔眼科眼底病论坛暨糖尿病视网膜病变智(AI)终生监测防治…

读卡器+芯片

RFID Reader 产品参数 产品型号 RFID Reader 尺寸(mm) 104*70*11.7mm 外观颜色 黑 材质 ABS 接口 MINI 功率 0.1W 电源 5V/1A 读卡距离 40mm 工作温度 -40~85℃ 工作频率 13.56Mhz 串口功能 支持 支持协议 ISO/IEC 14443、ISO/IEC 15693 产品参数 …

2023年中国石英矿资源现状及行业市场供需分析[图]

石英矿为常见的非金属矿物质&#xff0c;具有储量大、分布广、易开采等特点&#xff0c;根据不同成矿特性和理化特性&#xff0c;石英矿物可分为岩浆岩型、变质型、热液型、沉积型&#xff0c;对应的石英岩分别为花岗伟晶岩、脉石英岩、石英岩和石英砂岩。 石英矿物类型和特点…

关于在公众号刷到自己博客这件事

微信公众号 探索云原生 正式启用了&#xff0c;欢迎大家关注。 吐槽&#xff1a;竟然在微信公众号刷到自己的文章&#x1f923;&#xff0c;这也太巧了吧。 吐槽&#xff1a;这也太巧了吧 周五&#xff0c;开心的下班回到家&#xff0c;刷会微信。 发现关注的某大佬的公众号又…

laravel框架介绍(二) composer命令下载laravel报错

1.composer命令下载laravel报如下错 &#xff1a; curl error 18 while downloading https://repo.packagist.org/p2/symfony/uid.j son: transfer closed with 3808 bytes remaining to read&#xff0c;具体为 解决方案&#xff1a;执行以下命令切换镜像 >composer con…

滚动条样式美化

css手搓 <script setup> import { ref } from "vue"; </script><template><div class"ii"><div>ssssssssssssss</div><div>ssssssssssssss</div><div>ssssssssssssss</div><div>sssss…