vue 自定义组件添加原生事件


Posted in Vue.js onApril 21, 2022

自定义组件如何添加使用原生事件

自定义组件(Components)是vue的重要知识块之一,使用中不少人会发现一个问题:为什么我在组件里绑定click事件不起作用?这里先看看原因吧。

在自定义组件中直接绑定原生事件vue可是"不待见"的,它会认为你没有定义这个事件,所以没有任何反应。

哪些是原生事件?

例如click单击、mouseover鼠标移入、mouseout鼠标移出、keyup键盘按下抬起、keydown键盘按下…等等一系列由官方提供的事件都是原生事件。那么咋办?

. $emit()传递

<body>
   <div id="app">
       <Jsxj :jsxj="message" @click="JsxjChange"></Jsxj>
   </div>
</body>
<script>
   var vm = new Vue({
       el:"#app",
       data:{
           message:"Hello World"
       },
       components:{
           Jsxj:{
               props:['jsxj'],
               template:`<p @click="pChange">{{jsxj}}</p>`,
               methods: {
                   pChange(){
                       this.$emit("click")
                   }
               },
           }
       },
       methods: {
           JsxjChange(){
               this.message="Hi, Jsxj"
           }
       },
   })
</script>

第一种方法是通过$emit()传递事件。如代码:我们在自定义组件Jsxj中设置模板,在模板中<p>原生元素上触发原生click事件,调用函数pChange(),函数用$emit()向上传递自定义事件click,父组件Jsxj接收到这个事件,于是便可以正常触发click。

. native属性

<body>
   <div id="app">
       <Jsxj :jsxj="message" @click.native="JsxjChange"></Jsxj>
   </div>
</body>
<script>
   var vm = new Vue({
       el:"#app",
       data:{
           message:"Hello World"
       },
       components:{
           Jsxj:{
               props:['jsxj'],
               template:`<p>{{jsxj}}</p>`  
           }
       },
       methods: {
           JsxjChange(){
               this.message="Hi, Jsxj"
           }
       },
   })
</script>

第二种方法相对简单。

代码大同小异,不过我们不再用$emit()从子向父传递自定义事件,太麻烦了,而是用native属性帮忙@click.native="JsxjChange",这样组件就会知道这是原生事件click,调用相应的函数。 

vue使用原生事件

在项目中用到element ui 这个ui框架,有些组件没有封装的事件,例如click事件 ,我在使用时感觉不起作用,后来查看vue官方文档,发现有些原生事件是不提供,还有我们自定义的组件也是不能直接使用click事件的 ,需要在click事件后写上.native才能生效

即 例如:

<el-card @click.native = "enter"></el-card>
Vue.js 相关文章推荐
详解vue实现坐标拾取器功能示例
Nov 18 Vue.js
详解Vue的mixin策略
Nov 19 Vue.js
Vue使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
全面解析Vue中的$nextTick
Dec 24 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
Vue实现下拉加载更多
May 09 Vue.js
vue-router中hash模式与history模式的区别
Jun 23 Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 Vue.js
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
vue 自定义的组件绑定点击事件
Apr 21 #Vue.js
vue组件vue-esign实现电子签名
Apr 21 #Vue.js
vue动态绑定style样式
Apr 20 #Vue.js
Vue OpenLayer测距功能的实现
vue 给数组添加新对象并赋值
Apr 20 #Vue.js
vue 数字翻牌器动态加载数据
Apr 20 #Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 #Vue.js
You might like
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
QQ登录简单实现代码
2021/03/09 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
几个SQL的面试题
2014/03/08 面试题
网上书店创业计划书
2014/01/12 职场文书
新春联欢会主持词
2014/03/24 职场文书
工地质量标语
2014/06/12 职场文书
授权委托书格式
2014/07/31 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL