Vue中的事件绑定问题

 更新时间:2023年11月15日 14:47:58   作者:职场007  
这篇文章主要介绍了Vue中的事件绑定问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

何为事件绑定

当我们开发完UI界面后,还需要和用户交互,所谓交互也就是用户可以点击界面上的按钮,文字,链接等以及点击键盘上的按钮,我们开发的程序可以做出对应的反应。

做出的反应会通过UI界面再反馈给用户,或是对话框,或是跳转到新页面。

总之就是响应用户的某个操作。

在VUE3中定义事件绑定可以通过在你想注册点击事件的dom元素中,使用@click = "响应操作的JS函数"的方式来实现,方式不唯一,这种方式是一种简写,感兴趣的可以去官网查看不同的写法,这里主要是为了演示VUE3事件绑定

示例解析

简单情景解析

示例:假设我们要实现一个简单的计数器功能,即点击按钮,计数器会一直加一。

注:此例子用在真实的环境中就可能是统计用户量或者访问量,只是这里做演示用将触发计数的操作用按钮的方式实现。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>event bind</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>
    const app = Vue.createApp({
        data() {
            return {
                counter:0
            }
        },
        methods: {
            //事件修饰符:stop,prevent,capture,self,once,passive
            //按键修饰符:enter,tab,delete,esc,up,down,left,right
            //鼠标事件修饰符:left,right,middle
            handleBtnClick(){
                this.counter+=1;
            },
        },
        template:`
        <div>
           {{counter}}
                <button @click="handleBtnClick()">button</button>
            <input @keydown.enter="handleBtnClick()">点击事件</input>
        </div>
        `
    });
   const vm = app.mount('#root');
</script>
</html>

我们绑定的事件主要大致分为,鼠标点击事件,拖拽事件,键盘事件,在上面的代码示例中主要演示了鼠标,点击事件和键盘事件,默认显示的是0,当我们点击button或者是聚焦输入框后按下键盘上的enter键时,都会调用JS函数handleBtnClick()进行加一操作。

运行截图:

上图中有一个button和一个输入框,以及左上角一个显示计数值的区域,点击button,或者是点击输入框,使其进入到输入状态时,再点击键盘的enter键,计数值都会加一

这里是为了演示点击事件和键盘事件

特殊情景避坑

上面的示例看似实现了我们的需求,但是有种特殊的情况可能会导致我们遇见意外的情况,那就是当我们的button作为子控件并绑定了点击事件,button的父控件,比如一个DIV也绑定了一个事件,这时候我们点击button,会出现什么情况呢?

我们一起看看:

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>event bind</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>
    const app = Vue.createApp({
        data() {
            return {
                counter:0
            }
        },
        methods: {
            //事件修饰符:stop,prevent,capture,self,once,passive
            //按键修饰符:enter,tab,delete,esc,up,down,left,right
            //鼠标事件修饰符:left,right,middle
            handleBtnClick(){
                this.counter+=1;
            },
            handleDivClick(){
                alert('div clicked!')
            }
        },
        template:`
        <div>
            <div @click="handleDivClick()">
                {{counter}}
                <button @click="handleBtnClick()">button</button> 
            </div>
            <input @keydown.enter="handleBtnClick()">点击事件</input>
        </div>
        `
    });
   
   const vm = app.mount('#root');
</script>
</html>

正如代码所示,我们给button加一个父DIV,然后给父DIV也帮定了一个点击事件,点击DIV时让其执行handleDivClick函数显示一个弹窗。

这会出现啥呢?

关键代码如下:

<div @click="handleDivClick()">
    {{counter}}
    <button @click="handleBtnClick()">button</button> 
</div>

结果是,会先响应父DIV的时间,显示一个弹窗

当我们点击了弹窗的确定了后,在响应button的操作进行计数器加一操作。

这种结果很明显是不符合我们预期的,我们想要的效果是点击按钮的时候响应按钮的操作,点击DIV的时候响应DIV的操作,但是这时候两个事件混在一起了,那我们该怎么办呢?

Vue3给出了解决办法那就是加事件修饰符:stop,prevent,capture,self,once,passive。

如下所示:

<div @click.self="handleDivClick()">
    {{counter}}
    <button @click.stop="handleBtnClick()">button</button> 
</div>

这种情况其实可以称为事件冒泡,我们点击按钮的时候,事件先到了DIV,所以响应了DIV的操作,然后又传到了button,所以当执行完DIV的操作后又会继续执行button的操作。

解决这种问题可以给button加一个stop事件修饰符,或者是给父DIV加一个self修饰符就可以了。

这样他们的事件就不会混到一起了。

总结

其实事件绑定就是给用户一个和我们程序交互到接口,让用户可以通过鼠标,键盘,屏幕触摸,手势等输入来执行自己想要的操作,本文只是简单介绍了事件绑定的基本知识和一个小坑,读者若是想深入的了解事件绑定的具体使用,请参考官网的详细API。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决vue单页面应用进入页面加载所有 js 的问题

    解决vue单页面应用进入页面加载所有 js 的问题

    这篇文章主要介绍了解决vue单页面应用进入页面加载所有 js 的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue2封装webSocket的实现(开箱即用)

    vue2封装webSocket的实现(开箱即用)

    在Vue2中,可以使用WebSocket实时通信,本文主要介绍了vue2封装webSocket的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • vue.js实现点击后动态添加class及删除同级class的实现代码

    vue.js实现点击后动态添加class及删除同级class的实现代码

    这篇文章主要介绍了vue.js实现点击后动态添加class及删除同级class的相关资料,需要的朋友可以参考下
    2018-04-04
  • Vue中动态引入图片要是require的原因解析

    Vue中动态引入图片要是require的原因解析

    require是一个node方法,用于引入模块,JSON或本地文件,这篇文章主要介绍了vue中动态引入图片为什么要是require,需要的朋友可以参考下
    2022-10-10
  • vue.js异步上传文件前后端实现代码

    vue.js异步上传文件前后端实现代码

    这篇文章主要为大家详细介绍了vue.js异步上传文件前后端的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Vue如何在CSS中使用data定义的数据浅析

    Vue如何在CSS中使用data定义的数据浅析

    这篇文章主要给大家介绍了关于Vue如何在CSS中使用data定义的数据的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友可以参考下
    2022-05-05
  • Vue组件层级关系详细分析

    Vue组件层级关系详细分析

    这篇文章主要介绍了Vue组件的层级关系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • vue中格式化时间过滤器代码实例

    vue中格式化时间过滤器代码实例

    这篇文章主要介绍了vue格式化时间过滤器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue使用moment如何将时间戳转为标准日期时间格式

    vue使用moment如何将时间戳转为标准日期时间格式

    这篇文章主要介绍了vue使用moment如何将时间戳转为标准日期时间格式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • vue自定义封装按钮组件

    vue自定义封装按钮组件

    这篇文章主要为大家详细介绍了vue自定义封装按钮组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论