当前位置: 首页 > news >正文

项目学习笔记 display从none切换成block

跟着视频学做项目的时候,碰到一个多级联动列表,列表元素的display会从none切换成block,切换过程中可能导致资源渲染过多,从而导致卡顿问题。

<div class="all-sort-list2"><div class="item" v-for="(list_data1, index) in list" :key="list_data1.categoryId"@mouseenter="setChooseIndex(index)"><h3 :class="{ chooseNow: nowIndex == index }"><a>{{ list_data1.categoryName }}</a></h3><div class="item-list clearfix" :style="{ display: nowIndex == index ? 'block' : 'none' }"><div class="subitem"><dl class="fore" v-for="list_data2 in list_data1.categoryChild" :key="list_data2.categoryId"><dt><a>{{ list_data2.categoryName }}</a></dt><dd><em v-for="list_data3 in list_data2.categoryChild" :key="list_data3.categoryId"><a>{{ list_data3.categoryName }}</a></em></dd></dl></div></div></div>
</div>

对于这个列表,其内部元素是从服务区获取数据,然后通过v-for显示。

类item-list的disblock会不断从none切换为block。

组件渲染导致使用卡顿

<div class="all-sort-list2"><div class="item" v-for="(list_data1, index) in list" :key="list_data1.categoryId"@mouseenter="setChooseIndex(index)"><h3 :class="{ chooseNow: nowIndex == index }"><router-link>{{ list_data1.categoryName }}</router-link></h3><div class="item-list clearfix" :style="{ display: nowIndex == index ? 'block' : 'none' }"><div class="subitem"><dl class="fore" v-for="list_data2 in list_data1.categoryChild" :key="list_data2.categoryId"><dt><router-link>{{ list_data2.categoryName }}</router-link></dt><dd><em v-for="list_data3 in list_data2.categoryChild" :key="list_data3.categoryId"><router-link>{{ list_data3.categoryName }}</router-link></em></dd></dl></div></div></div>
</div>

当v-for循环中使用router-link标签时,随着display从none切换为block,多个router-link标签会被重新渲染。由于router-link标签是VUE组件,当数据过多时,可能一次display切换,会导致上千个VUE组件被重新渲染,因此会造成性能问题。

一个解决办法是可以把router-link换成a标签,再在a标签上绑定click事件处理。

回调函数被多次渲染

<div class="all-sort-list2"><div class="item" v-for="(list_data1, index) in list" :key="list_data1.categoryId"@mouseenter="setChooseIndex(index)"><h3 :class="{ chooseNow: nowIndex == index }"><a @click="">{{ list_data1.categoryName }}</a></h3><div class="item-list clearfix" :style="{ display: nowIndex == index ? 'block' : 'none' }"><div class="subitem"><dl class="fore" v-for="list_data2 in list_data1.categoryChild" :key="list_data2.categoryId"><dt><a @click="">{{ list_data2.categoryName }}</a></dt><dd><em v-for="list_data3 in list_data2.categoryChild" :key="list_data3.categoryId"><a @click="">{{ list_data3.categoryName }}</a></em></dd></dl></div></div></div>
</div>

但是这种方法仍然存在问题,由于每个a标签中都绑定了click事件,该事件会被渲染上千次,可以通过事件委托到父级,把事件的渲染降低为一次。

(但这里其实我也不太懂,我觉得虽然事件生成了多个,但是其实不click就不会被调用,不调用也会影响性能吗)

解决办法是使用事件委托。

把事件绑定在父级上,然后通过event.target获得点击的标签,进行处理。

<div class="all-sort-list2" @click="goSearch"><div class="item" v-for="(list_data1, index) in list" :key="list_data1.categoryId" ... </div>
</div><script>...goSearch(event){let e = event.target;getAttribute('...');}
</script>

http://www.dtcms.com/a/282471.html

相关文章:

  • AWS ML Specialist 考试备考指南
  • 自学中医笔记(一)
  • AWS WebRTC 并发 Viewer 拉流失败分析:0.3 秒等待为何如此关键?
  • 线上分享:解码eVTOL安全基因,构建安全飞行生态
  • 【docker】将本地镜像打包部署到服务器上
  • 逆功率检测设备防逆流解决方案守护电网安全
  • JavaScript中将JSON对象转换为URL参数格式的字符串
  • java工具类Hutool
  • Python day15
  • pip包报错
  • Java全栈面试实录:从电商支付到AIGC的深度技术考察
  • Thymeleaf 流程控制与迭代详解
  • WebStorm vs VSCode:前端圈的「豆腐脑甜咸之争」
  • 基于JAVA Spring Boot物理实验考核系统设计与实现 (文档+源码)
  • 入门华为数通,HCIA/HCIP/HCIE该怎么选?
  • 如何删除 VSCode 账号的远程同步备份记录数据
  • 大模型-AI生成视频零基础启蒙:从0到1制作AI视频
  • DeepSeek + 通义万相:AI视频创作效率革命与技术实践
  • 【Linux操作系统 | 第19篇-进阶篇】Shell编程(上篇)
  • 英飞凌 | 新兴无线BMS系统解决方案深度分析
  • C语言:动态内存管理
  • 【Docker-Day 6】从零到一:精通 Dockerfile 核心指令 (FROM, WORKDIR, COPY, RUN)
  • 壹脉销客AI电子名片源码核心架构
  • C++11 std::uninitialized_copy_n 原理与实现
  • 计算机网络:(九)网络层(下)超详细讲解互联网的路由选择协议、IPV6与IP多播
  • EVA series系列(上)
  • UltraISO编辑ISO文件
  • XPath注入攻击详解:原理、危害与防御
  • PLC-BMS电力载波通信技术深度解析:智能电网与储能系统的融合创新
  • (nice!!!)(LeetCode 每日一题) 3201. 找出有效子序列的最大长度 I (动态规划dp)