VueBloghyhero6

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

2020-11-26 / 2020-11-26 / 340次浏览

我大概的查阅了JavaScript 高级程序设计的第三版

对于事件委托它是这样描述的。事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。例, click 事件会一直冒泡到document层次。也就是说,我们可以为整个页面指定一个onclick 事件处理程序,而不必给每个可单机的元素分别添加事件处理程序。以下面的HTML代码为例:

<ul id="myLinks">
    <li id="goSomewhere">Go somewhere</li>
    <li id="doSomething">Do something</li>
    <li id="sayHi">Say hi</li>
</ul>

传统的做法分别添加多个点击事件,

var item1 = document.getElementById("goSomewhere")
var item2 = document.getElementById("doSomething")
var item3 = document.getElementById("sayHi")
EventUtil.addHandler(item1, "click", function(event){
    location.href = "http://www.wrox.com"
})

EventUtil.addHandler(item2, "click", function(event){
    document.title = "I changed the document's title"
})

EventUtil.addHandler(item3, "click", function(event){
    alert('hi')
})

在没有进行使用的框架的常规页面,尤其是动态的 li 标签情况下,不知道有多少个,且如果每个标签都进行绑定,那么绑定函数将不可计数。

关于 EventUtil.addHandle
EventUtil.addHandle:
addHandler 方法,职责是 分别视情况而定使用DOM0级方法、DOM2级方法或IE方法来添加事件。
这个方法属于 一个名字为 EventUtil 的对象。
该方法接收三个参数:要操作的元素、 事件名称和事件处理函数
这里有篇博客来自于2014年(这个位置不在进行扩展讨论)
https://www.cnblogs.com/hykun/p/EventUtil.html

所以就有了事件委托这种解决方法:

var list = document.getElementById("myLinks")
EventUtil.addHandler(list, "click", function(event){
    event = EventUtil.getEvent(event)
    var target = EventUtil.getEvent(event)
    switch(target.id){
        case "doSomething":
            document.title = "I changed the document's title"
            break
        case "goSomewhere":
            location.href = "http://www.wrox.com"
            break
        case "sayHi":
            alery("hi");
            break
    }
})

在这段代码中,我们使用事件委托只为

    元素添加了一个onclick 事件处理程序。由于所有列表项都是这个元素的子节点,而且它们的事件会冒泡,所以单击事件最终会被这个函数处理。

    回过来我们再看,vue react 这个框架均在框架中做了相应的继承处理,所以我们不需要对它进行二次处理。所以答案是不用。

    然鹅,并没有完,真正完善的代码程序最后还会添加一个解绑函数,留个坑放在这我们后续在进行讨论。