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 的 v-model用法实例
Nov 23 Vue.js
vue + el-form 实现的多层循环表单验证
Nov 25 Vue.js
vue实现两个区域滚动条同步滚动
Dec 13 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
vue完美实现el-table列宽自适应
May 08 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
vue实现拖拽交换位置
Apr 07 Vue.js
Vue 打包后相对路径的引用问题
Jun 05 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
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
php compact 通过变量创建数组
2016/11/15 PHP
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
2015/03/04 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
python使用chardet判断字符串编码的方法
2015/03/13 Python
python 中split 和 strip的实例详解
2017/07/12 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
python判断完全平方数的方法
2018/11/13 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
Python 学习教程之networkx
2019/04/15 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
python PIL模块的基本使用
2020/09/29 Python
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
公共场所禁烟标语
2014/06/25 职场文书
考试作弊检讨书
2014/10/21 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
新年祝酒词大全
2015/08/11 职场文书
Python如何识别银行卡卡号?
2021/06/10 Python
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android
海弦WR-800F
2022/04/05 无线电
Python中time标准库的使用教程
2022/04/13 Python