• v-for元素绑定事件代理


    题目:

    vue 在 v-for 时给每项元素绑定事件需要用事件代理吗?为什么?

    解析:

    事件代理作用主要是 2 个

    1. 将事件处理程序代理到父节点,减少内存占用率
    2. 动态生成子节点时能自动绑定事件处理程序到父节点

    这里我生成了十万个 span 节点,通过 performance monitor 来监控内存占用率和事件监听器的数量,对比以下 3 种情况

    1、不使用事件代理,每个 span 节点绑定一个 click 事件,并指向同一个事件处理程序

     <div>
          <span 
            v-for="(item,index) of 100000" 
            :key="index" 
            @click="handleClick">
            {{item}}
          </span>
     </div>

    2、不使用事件代理,每个 span 节点绑定一个 click 事件,并指向不同的事件处理程序

      <div>
          <span 
            v-for="(item,index) of 100000" 
            :key="index" 
            @click="function () {}">
            {{item}}
          </span>
      </div>

    3、使用事件代理

    <div  @click="handleClick">
          <span 
            v-for="(item,index) of 100000"  
            :key="index">
            {{item}}
          </span>
     </div>

    可以看到使用事件代理无论是监听器数量和内存占用率都比前两者要少

    同时对比 3 个图中监听器的数量以及我以往阅读 vue 源码的过程中,并没有发现 vue 会自动做事件代理,
    但是一般给 v-for 绑定事件时,都会让节点指向同一个事件处理程序(第二种情况可以运行,但是 eslint 会警告),

    一定程度上比每生成一个节点都绑定一个不同的事件处理程序性能好,但是监听器的数量仍不会变,所以使用事件代理会更好一点。

       

  • 相关阅读:
    完成登录与注册页面的前端
    JavaScript 基础,登录验证
    CSS实例:图片导航块
    导航,头部,CSS基础
    web基础,用html元素制作web页面
    web基础
    timestamp与timedelta,管理信息系统概念与基础
    datetime处理日期和时间
    加载静态文件,父模板的继承和扩展
    开始Flask项目
  • 原文地址:https://www.cnblogs.com/anbozhu7/p/11304144.html
Copyright © 2020-2023  润新知