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 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
Vue 3自定义指令开发的相关总结
Jan 29 Vue.js
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
vue+spring boot实现校验码功能
May 27 Vue.js
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
ant design vue的form表单取值方法
Jun 01 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
获取URL文件名后缀
2013/10/24 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
PHP中SESSION过期设置
2021/03/09 PHP
js下弹出窗口的变通
2007/04/18 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
django正续或者倒序查库实例
2020/05/19 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
Django封装交互接口代码
2020/07/12 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
通报表扬范文
2015/01/17 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
Pandas 数据编码的十种方法
2022/04/20 Python