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 相关文章推荐
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
vue数据字典取键值项目的字典问题
Apr 12 Vue.js
解决vue中provide inject的响应式监听
Apr 19 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
当海贼王变成JOJO风
2020/03/02 日漫
php目录管理函数小结
2008/09/10 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
extjs form textfield的隐藏方法
2008/12/29 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
python中entry用法讲解
2020/12/04 Python
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
劲霸男装广告词
2014/03/21 职场文书
护林防火标语
2014/06/27 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
民事辩护词范文
2015/05/21 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
基于angular实现树形二级表格
2021/10/16 Javascript
vue组件vue-esign实现电子签名
2022/04/21 Vue.js