事件绑定和事件委托整理

一、事件绑定

测试代码:
<div class="hierarchy-1">
    <p class="hierarchy-2">
        <a class="hierarchy-3">
            <span class="hierarchy-4">4</span>
            3
        </a>
        2
    </p>
    1
</div>

<script type="text/javascript">
    document.querySelector('.hierarchy-1').addEventListener('click',function (e) {
        console.log(e.currentTarget);
    },false);
    document.querySelector('.hierarchy-2').addEventListener('click',function (e) {
        console.log(e.currentTarget);
    },false);
    document.querySelector('.hierarchy-3').addEventListener('click',function (e) {
        console.log(e.currentTarget);
    },false);
    document.querySelector('.hierarchy-4').addEventListener('click',function (e) {
        console.log(e.currentTarget);
        e.stopPropagation();
        e.preventDefault()
    },false);
</script>
示意图:

这里写图片描述

1、target和currentTarget

为每一层绑定一个点击事件,观察target和currentTarget的异同。

点击hierarchy-1
响应元素targetcurrentTarget
1hierarchy-1hierarchy-1

点击hierarchy-2
响应元素targetcurrentTarget
1hierarchy-2hierarchy-1
2hierarchy-2hierarchy-2

点击hierarchy-3
响应元素targetcurrentTarget
1hierarchy-3hierarchy-1
2hierarchy-3hierarchy-2
3hierarchy-3hierarchy-3

点击hierarchy-4
响应元素targetcurrentTarget
1hierarchy-4hierarchy-1
2hierarchy-4hierarchy-2
3hierarchy-4hierarchy-3
4hierarchy-4hierarchy-4

由上述测试可知,target为点击所响应的最底层的元素,而currentTarget则为点击所响应的当前元素,只有当被点击元素为最底层元素时,target才等于currentTarget。

2、stopPropagation()

我们在开发的时候可能有这样一种需求,比如有一个用户消息列表,点击列表可以查看消息详情,同时点击用户头像可以前往用户个人主页,我们分别对列表item和item中的头像增加点击事件,这是点击用户头像时还是会跳转到消息详情,因为列表的点击事件是后响应的,所以此时我们应该响应了头像点击事件后,禁止事件继续传递下去。js提供了一个e.stopPropagation()方法,可以阻止事件冒泡。

<script type="text/javascript">
    document.querySelector('.hierarchy-1').addEventListener('click',function (e) {
        console.log(e.currentTarget);
    },false);
    document.querySelector('.hierarchy-2').addEventListener('click',function (e) {
        console.log(e.currentTarget);
    },false);
    document.querySelector('.hierarchy-3').addEventListener('click',function (e) {
        console.log(e.currentTarget);
    },false);
    document.querySelector('.hierarchy-4').addEventListener('click',function (e) {
        console.log(e.currentTarget);
        e.stopPropagation();
    },false);
</script>

还是上述例子,在hierarchy-4增加了一个e.stopPropagation()。点击hierarchy-4,hierarchy-1、hierarchy-2、hierarchy-3都不会响应点击事件。有时我们还需要阻止元素的默认事件,比如a标签的href,我们可以使用e.preventDefault()方法。

二、事件委托

来看一个简单的示例:

<style>
    ul {
        background-color: red;
    }

    li {
        height: 60px;
        line-height: 60px;
        background-color: green;
        border-bottom: 1px solid #000;
    }
</style>

<ul>
    <li>我是一号</li>
    <li>我是二号</li>
    <li>我是三号</li>
    <li>我是四号</li>
    <li>我是五号</li>
    <li>我是六号</li>
</ul>
示意图:

这里写图片描述

我们希望点击li标签,alert出对应的文字,这时我们可能会采用获取所有的li标签,然后为每个li标签绑定一个点击事件。代码如下:

        var list = document.querySelectorAll('li');
            for (var i = 0; i < list.length; i++) {
                list[index].onclick = function (e) {
                    alert(list[index].innerHtml);
                }
            }
        }

这种实现方式主要有2个缺点:
1、li标签过多时,绑定了太多的点击事件,会对浏览器增加很多开销。
2、当我们想插入一个li标签时,还需要为新的li标签增加点击事件。

为了解决这两个问题,我们可以采用事件代理的方式解决,将所有的li的点击通过父级标签ul来处理,这样既可以大大减少事件绑定的个数,同时新增li标签也无需单独绑定事件。代码如下:

    document.querySelector('ul').onclick = function (e) {
        var event = e || window.event;
        var target = event.target || event.srcElement;
        if (target.nodeName.toLowerCase() === 'li') {
            alert(target.innerHTML);
        }
    }

over…

<think>好的,用户想了解Vue.js中事件绑定的使用方法或相关问题的解决。首先,我需要回忆一下Vue的事件处理机制。记得在Vue中,事件绑定通常使用v-on指令,或者简写为@符号。比如@click或者v-on:click。 接下来,我应该整理基本用法。比如在模板中直接绑定方法,是否需要传递参数?还有内联语句的处理,比如直接执行一些简单的表达式。用户可能还需要知道如何访问原始DOM事件,这时候可能需要使用$event变量。 然后,常见的事件修饰符。比如阻止默认行为用.prevent,停止冒泡用.stop,还有像.once这样的修饰符,只触发一次。还有按键修饰符,比如.enter、.esc等,这些都是常见的需求点。 另外,用户可能会问到如何自定义事件,也就是子组件向父组件通信的情况。这部分需要说明在子组件中使用$emit触发事件,父组件用v-on监听。这可能涉及到组件间通信的知识,但用户的问题集中在事件绑定,所以应该重点放在父组件如何处理子组件的事件。 性能方面的问题,比如事件处理函数是否会导致重复渲染,或者内存泄漏?不过这可能属于进阶内容,用户当前的问题可能更关注基础用法,但如果有常见问题的话,应该提及。比如在组件销毁前移除事件监听,或者使用.once修饰符来避免多次触发。 还需要考虑示例代码的正确性。比如在方法中修改数据,是否会触发响应式更新。比如在handleClick方法中改变message的值,这应该没有问题,因为Vue的响应式系统会自动处理。 用户的问题可能还包括事件绑定的动态性,比如动态事件名。Vue 2不支持动态事件名,但Vue 3可能支持,需要确认版本差异。不过可能用户没有指定版本,所以应该以Vue 2为主,或者同时说明两者的差异。 另外,关于事件委托,Vue是否自动处理?实际上,Vue的事件绑定是直接绑定到元素上的,没有使用事件委托,所以在大量元素的情况下可能需要自己优化,但这不是事件绑定的基础内容,可能属于高级话题。 然后,检查参考的引用内容。引用[1]提到了计算属性、指令、生命周期钩子,这里事件绑定属于指令的一部分,应该结合v-on指令来讲解。引用[2]提到组件化,可以关联到自定义事件的使用。引用[3]是关于安装打包,可能不太相关,但可以忽略。 用户可能需要示例代码,比如点击事件、传递参数、修饰符的使用,以及自定义事件的示例。确保这些示例符合Vue的语法,比如使用methods选项定义方法,正确使用修饰符的语法。 最后,生成相关问题的时候,要考虑用户可能的后续问题,比如事件修饰符有哪些、如何传递参数、组件间的事件通信、性能优化等。确保问题覆盖用户可能遇到的下一步疑问。</think>### Vue.js事件绑定使用方法及示例 #### 一、基础事件绑定 Vue.js使用`v-on`指令或`@`简写形式绑定事件,语法为: ```html <button v-on:click="handleClick">点击</button> <!-- 简写形式 --> <button @click="handleClick">点击</button> ``` 在Vue实例中定义方法: ```javascript methods: { handleClick() { alert('点击事件触发'); } } ``` #### 二、事件修饰符 Vue提供了多个事件修饰符实现特定功能: 1. **阻止默认行为**:`.prevent` ```html <form @submit.prevent="onSubmit"></form> ``` 2. **阻止事件冒泡**:`.stop` ```html <div @click.stop="doThis"></div> ``` 3. **只触发一次**:`.once` ```html <button @click.once="doThis"></button> ``` 4. **按键修饰符**:`.enter`、`.esc` ```html <input @keyup.enter="submit"> ``` #### 三、参数传递与事件对象 1. **传递自定义参数**: ```html <button @click="handleParam('参数', $event)">传参</button> ``` ```javascript methods: { handleParam(msg, event) { console.log(msg, event.target); } } ``` #### 四、组件自定义事件 子组件通过`$emit`触发事件: ```javascript // 子组件 this.$emit('custom-event', 参数); ``` 父组件监听事件: ```html <child-component @custom-event="handleCustom"></child-component> ``` #### 五、应用场景示例 ```html <template> <div> <!-- 计数器 --> <button @click="count++">{{ count }}</button> <!-- 表单提交 --> <form @submit.prevent="submitForm"> <input type="text" v-model="inputText"> <button type="submit">提交</button> </form> <!-- 自定义组件事件 --> <child-component @update-data="handleUpdate"></child-component> </div> </template> <script> export default { data() { return { count: 0, inputText: '' } }, methods: { submitForm() { console.log('提交内容:', this.inputText); }, handleUpdate(data) { this.receivedData = data; } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值