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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
Vue+element-ui添加自定义右键菜单的方法示例
Dec 08 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
vue实现按钮切换图片
Jan 20 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
在vue中import()语法不能传入变量的问题及解决
Apr 01 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
vue实现登陆页面开发实践
May 30 Vue.js
Vue router配置与使用分析讲解
Dec 24 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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
php上传图片类及用法示例
2016/05/11 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
js常用代码段收集
2011/10/28 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
vue的mixins属性详解
2018/03/14 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
python装饰器代替set get方法实例
2019/12/19 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
建筑设计所实习生自我鉴定
2013/09/25 职场文书
求职简历自荐信范文
2013/10/21 职场文书
日化店促销方案
2014/03/26 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
无罪辩护词范文
2015/05/21 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
解除合同协议书范本
2016/03/21 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python