Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
DreamLee1997 opened this issue Oct 17, 2019 · 0 comments

Comments

@DreamLee1997
Copy link
Owner

说一下我个人理解,先说结论,可以使用

事件代理作用主要是 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 会警告),一定程度上比每生成一个节点都绑定一个不同的事件处理程序性能好,但是监听器的数量仍不会变,所以使用事件代理会更好一点

源码没有做事件代理

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant