上一篇:
uni-app 跨端开发 H5、小程序、IOS、Android(五):uni-app 数据绑定
大家好,我是黑马腾云。
这是一个原创系列连载文章,基于企业真实项目案例分享经验,带你快速入门 uni-app 开发!欢迎点击头像关注,避免迷路!
上一篇文章分析了数据绑定,本文来讨论 uni-app 事件绑定。
用户与界面进行交互,自然是要通过事件,因此我们来看看事件绑定的办法以及 uni-app 提供的一些事件。
一、事件监听指令
事件监听使用 v-on 指令。
语法格式:
v-on:事件名,也可以简写为 @
示例:
<template> <view> <button v-on:click="counter += 1">点击计数</button> <!--<button @click="counter += 1">点击计数</button>--> <!--简写--> <text>我被点击了{{ counter }} 次.</text> </view></template><script> export default { data() { return { counter: 0 } } }</script>
复制代码
监听 DOM 事件,并在触发时运行一些 JavaScript 代码。
二、事件处理方法
然而许多事件处理逻辑会更为复杂,如上示例,直接把 JavaScript 代码写在 v-on 指令中是不可行的。
因此 v-on 还可以接收一个需要调用的方法名称。
示例
<template> <view> <button v-on:click="greet">问好</button> <!--函数名加不加括号都可以--> </view></template><script> export default { data() { return { name: '黑马腾云' } }, methods: { greet(event) { // event 是原生 DOM 事件 console.log(event); uni.showToast({ title: 'Hello ' + this.name + '!' }); } } }</script>
复制代码
内联处理器中的方法
除了直接绑定到一个方法,也可以在内联 JavaScript 语句中调用方法:
<template> <view> <button v-on:click="say('hi 黑马腾云')">问好</button> </view></template><script> export default { methods: { say(message) { uni.showToast({ title: message }); } } }</script>
复制代码
有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法:
<template> <view> <button v-on:click="warn('表单不能提交了.', $event)"> 提交 </button> </view></template><script> export default { methods: { warn(message, event) { // 现在我们可以访问原生事件对象 if (event) { event.preventDefault() //阻止表单提交 } uni.showToast({ title: message }); } } }</script>
复制代码
preventDefault() 方法,取消事件的默认动作。
该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。例如,如果 type 属性是 "submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调用该方法,可以阻止提交表单。注意,如果 Event 对象的 cancelable 属性是 fasle,那么就没有默认动作,或者不能阻止默认动作。无论哪种情况,调用该方法都没有作用。
三、事件修饰符
1、常用事件修饰符
修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()
v-on 提供了事件修饰符:
.stop: 各平台均支持, 使用时会阻止事件冒泡,在非 H5 端同时也会阻止事件的默认行为
.native: 监听原生事件,仅在 H5 平台支持
.prevent: 仅在 H5 平台支持
.capture: 仅在 H5 平台支持
.self: 仅在 H5 平台支持
.once: 仅在 H5 平台支持
.passive: 仅在 H5 平台支持
使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。
注意事项
为兼容各端,事件需使用 v-on 或 @ 的方式绑定,请勿使用小程序端的 bind 和 catch 进行事件绑定。
若需要禁止蒙版下的页面滚动,可使用 @touchmove.stop.prevent="moveHandle",moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数。
<view class="mask" @touchmove.stop.prevent="moveHandle"></view>
复制代码
按键修饰符:uni-app 运行在手机端,没有键盘事件,所以不支持按键修饰符。
2、阻止事件冒泡
<!-- 阻止单击事件继续传播 --><view v-on:click.stop="doThis"></view>
复制代码
stop 可以阻止事件冒泡,那什么是事件冒泡?
当一个元素接收到事件的时候,会把他接收到的事件传给自己的父级,一直到 window。
事件捕获和事件冒泡属于两个相反的过程,见下图:
有时候根据业务需要,我们要阻止冒泡事件
示例:
<template> <view class="father" @click="fatherClick()"> <button class="children" @click.stop="childrenClick"> <!--添加.stop即可阻止事件冒泡--> 事件冒泡 </button> </view></template><script> export default { methods: { childrenClick() { alert("children"); }, fatherClick(){ alert("father"); } } }</script><style> .father{ background-color: #0A98D5; height: 200rpx; } .children{ margin: 30rpx; width: 500rpx; }</style>
复制代码
如上示例,单击按钮后,只会执行按钮指定的事件。
如果把 button 事件后的.stop 去掉,则会发生事件冒泡,当点击 button 后,它父级事件 fatherClick 也会执行。
四、uni-app 的事件映射表
// 事件映射表,左侧为 WEB 事件,右侧为 uni-app 对应事件 { click: 'tap', touchstart: 'touchstart', touchmove: 'touchmove', touchcancel: 'touchcancel', touchend: 'touchend', tap: 'tap', longtap: 'longtap', //推荐使用longpress代替 input: 'input', change: 'change', submit: 'submit', blur: 'blur', focus: 'focus', reset: 'reset', confirm: 'confirm', columnchange: 'columnchange', linechange: 'linechange', error: 'error', scrolltoupper: 'scrolltoupper', scrolltolower: 'scrolltolower', scroll: 'scroll' }
复制代码
以 input 为例,演示常见事件使用
<template> <view> <input type="text" class="txt" @focus="focus" @blur="blur" @confirm="confirm" @click="click" @tap="tap" @longpress="longpress" @longtap="longtap" @touchstart="touchstart" @touchend="touchend" @touchmove="touchmove" @touchcancle="touchcancle" /> </view></template>
<script> export default { data() { return {} }, methods: { focus() { console.log("获得焦点") }, blur() { console.log("失去焦点") }, confirm() { console.log("点击完成按钮/回车键") //pc端按回车键触发、手机端键盘完成按钮触发 }, click() { console.log("组件单击事件") }, tap() { console.log("组件被触摸") //如果click和tap同时存在,在pc端和手机端都只有tap被触发;如果只任意写一个,则也能触发 }, longpress() { console.log("长时间按住") }, longtap() { console.log("长时间触摸") //longpress和longtap同时存在,pc端和手机端都是longtap覆盖longpress;如果只任意写一个,则也能触发 }, touchstart() { console.log("触摸开始") }, touchend() { console.log("触摸结束") }, touchmove() { console.log("手指移动") }, touchcancle() { console.log("触摸被打断") } },
}</script>
<style> .txt { border: 1px solid #000000; width: 400rpx; margin: 20rpx; }</style>
复制代码
事件相关知识就写到这里,下一篇演示 uni-app 中组件的渲染,欢迎持续关注。
讨论时间:
既然大多数情况下我们都要阻止事件冒泡,那为什么 js 设计的时候要默认有事件冒泡机制呢?
评论区见。
作者介绍:
黑马腾云,码农、创业者、终身学习者!
乐于分享技术、创业、人生思考。关注我,一起为人生喝彩!
上一篇:
uni-app 跨端开发 H5、小程序、IOS、Android(五):uni-app 数据绑定
评论