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-cli 创建模板项目
Nov 19 Vue.js
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
利用Vue实现简易播放器的完整代码
Dec 30 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
Vue详细的入门笔记
May 10 Vue.js
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
vue中使用mockjs配置和使用方式
Apr 06 Vue.js
vue 给数组添加新对象并赋值
Apr 20 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
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
php 类自动载入的方法
2015/06/03 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
深入理解Python中的元类(metaclass)
2015/02/14 Python
Python执行时间的计算方法小结
2017/03/17 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
Python基于内置函数type创建新类型
2020/10/22 Python
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
团购业务员岗位职责
2014/03/15 职场文书
服务标语口号
2014/07/01 职场文书
2014年度培训工作总结
2014/11/27 职场文书
教师工作决心书
2015/02/04 职场文书
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript