-
Notifications
You must be signed in to change notification settings - Fork 3.3k
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 时给每项元素绑定事件需要用事件代理吗?为什么? #145
Comments
不需要,因为vue源码里已经做了处理 |
在vue 中 vue 做了处理 |
之前好像看过 react / vue 这些框架都自己实现了一套事件,把事件都代理到document上面了,所以不需要自己手动再去代理了,如果不用框架需要代理到父级元素 |
哪位大佬能给段代码 0.0 |
说一下我个人理解,先说结论,可以使用 事件代理作用主要是 2 个
这里我生成了十万个 span 节点,通过 performance monitor 来监控内存占用率和事件监听器的数量,对比以下 3 种情况
<div>
<span
v-for="(item,index) of 100000"
:key="index"
@click="handleClick">
{{item}}
</span>
</div>
<div>
<span
v-for="(item,index) of 100000"
:key="index"
@click="function () {}">
{{item}}
</span>
</div>
<div @click="handleClick">
<span
v-for="(item,index) of 100000"
:key="index">
{{item}}
</span>
</div> 可以看到使用事件代理无论是监听器数量和内存占用率都比前两者要少 同时对比 3 个图中监听器的数量以及我以往阅读 vue 源码的过程中,并没有发现 vue 会自动做事件代理,但是一般给 v-for 绑定事件时,都会让节点指向同一个事件处理程序(第二种情况可以运行,但是 eslint 会警告),一定程度上比每生成一个节点都绑定一个不同的事件处理程序性能好,但是监听器的数量仍不会变,所以使用事件代理会更好一点 |
嗯,看了楼上的那篇文章,和我的结论大致相同,只有在非常非常多的节点中,使用事件代理会提高一点性能,否则绑定在每个节点中几乎没有差别 |
快三年了,真的没有做优化吗? |
react好像跟vue不一样,react好像所有事件都委托到document上了吧,然后进行派发 |
react 是委托到 document 上, 然后自己生成了合成事件, 冒泡到 document 的时候进入合成事件, 然后他通过 getParent() 获取该事件源的所有合成事件, 触发完毕之后继续冒泡 |
vue本身不做事件代理
|
对的,react 代理到了 document 上 |
vue自身没有做事件代理,如果需要,则直接代理到父节点。对于mpvue写小程序来说,还是很有必要的,毕竟安卓机小程序性能太差。 <ul @click="meths">
<li v-for="(item,key) in 10" :key="key" :data-index="key">{{item}}</li>
</ul>
// vue
meths(e) {
if (e.target.nodeName.toLowerCase() === 'li') {
console.log(e.target.dataset.index)
}
}
// mpvue
meths(e) {
console.log(e.target.dataset.index)
} |
上面有回答说react/vue框架已经帮我们实现了统一的事件代理,为何说这里的第1,2种写法属于非事件代理(vue中)? |
// react-dom/src/events/EventListener.js
export function addEventBubbleListener(
element: Document | Element,
eventType: string,
listener: Function,
): void {
element.addEventListener(eventType, listener, false);
}
// 调用处
addEventBubbleListener(element, getRawEventName(topLevelType) |
首先我们需要知道事件代理主要有什么作用?
从vue的角度上来看上面两点
|
每个dom都有的事件都代理到document上,但是一些特殊的比如focus这种必须放在input这些dom上。 |
|
No description provided.
The text was updated successfully, but these errors were encountered: