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 相关文章推荐
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
vue路由实现登录拦截
Mar 24 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
VUE使用draggable实现组件拖拽
Apr 06 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
vue 自定义的组件绑定点击事件
Apr 21 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 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
JavaScript 学习笔记(五)
2009/12/31 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
Bootstrap精简教程
2015/11/27 Javascript
js重写方法的简单实现
2016/07/10 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
python socket 超时设置 errno 10054
2014/07/01 Python
python 读写txt文件 json文件的实现方法
2016/10/22 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
竞争上岗实施方案
2014/03/21 职场文书
体育活动总结
2015/02/04 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书