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

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

javascript 复制代码
<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。

组件渲染导致使用卡顿

javascript 复制代码
<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事件处理。

回调函数被多次渲染

javascript 复制代码
<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获得点击的标签,进行处理。

javascript 复制代码
<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>
相关推荐
2501_926978332 小时前
“LLM的智能本质--AGI的可能路径--人类的意识本质”三者的统一基底(5.0理论解读)
人工智能·经验分享·笔记·深度学习·机器学习·ai写作·agi
لا معنى له2 小时前
WAM与AC-WM:具身智能时代的世界动作模型与动作条件世界模型
人工智能·笔记·学习
薛先生_0994 小时前
js学习语法第一天
开发语言·javascript·学习
Wilber的技术分享4 小时前
【LeetCode高频手撕题 2】面试中常见的手撕算法题(小红书)
笔记·算法·leetcode·面试
愚昧之山绝望之谷开悟之坡4 小时前
合格境外投资者
笔记
寒秋花开曾相惜6 小时前
(学习笔记)3.8 指针运算(3.8.3 嵌套的数组& 3.8.4 定长数组)
java·开发语言·笔记·学习·算法
攻城狮在此6 小时前
SecureCRT与MobaXterm详细对比:哪个更强、谁更适合你?
windows
是翔仔呐7 小时前
第11章 显示外设驱动:I2C协议OLED屏、SPI协议LCD屏字符/图片/中文显示
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee
_李小白7 小时前
【AI大模型学习笔记之平台篇】第五篇:Trae常用模型介绍与性能对比
人工智能·笔记·学习
承渊政道7 小时前
【优选算法】(实战体会位运算的逻辑思维)
数据结构·c++·笔记·学习·算法·leetcode·visual studio