小程序 事件

目录

一、什么是事件

二、事件分类

三、事件 冒泡

四、事件 捕获

五、事件对象

1、BaseEvent 基础事件对象属性列表:

2、CustomEvent 自定义事件对象属性列表(继承 BaseEvent):

3、TouchEvent 触摸事件对象属性列表(继承 BaseEvent):

4、特殊事件

5、 target 和 currentTarget 的区别

六、WXS响应事件

1、获取dom元素节点

SelectorQuery 查询节点信息的对象

2、WXS响应事件

ComponentDescriptor 实例对象

3、如何定义wxs事件

七、常用WXS事件

1、bindtap点击事件

 


一、什么是事件

 

  • 事件是视图层到逻辑层的通讯方式。
  • 事件可以将用户的行为反馈到逻辑层进行处理。
  • 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
  • 事件对象可以携带额外信息,如 id, dataset, touches。

 


二、事件分类

1、WXS原生事件

bindcatch开头,然后跟上事件的类型,如bindtapcatchtouchstart

2、自定义事件

bindcatch后可以紧跟一个冒号,如bind:tapcatch:touchstart

注意:根据目前我遇到的情况得出一个结论——截止目前版本,所谓的自定义事件,只是把WXS原生事件的bind后加了一个冒号,做形式上的区别,感觉没卵用,净是花拳绣腿。

3、冒泡事件

当一个组件上的事件被触发后,该事件会向父节点传递。

4、非冒泡事件

当一个组件上的事件被触发后,该事件不会向父节点传递。

 


三、事件 冒泡

  • bind事件绑定不会阻止冒泡事件向上冒泡;
  • catch事件绑定可以阻止冒泡事件向上冒泡。

è¿éåå¾çæè¿°

 


四、事件 捕获

  • 触摸类事件支持捕获阶段;
  • 捕获阶段位于冒泡阶段之前;
  • 需要在捕获阶段监听事件时,可以采用capture-bindcapture-catch关键字,后者将中断捕获阶段和取消冒泡阶段。

案列:

在下面的代码中,点击 inner view 会先后调用handleTap2handleTap4handleTap3handleTap1

<view id="outer" bind:touchstart="handleTap1" capture-bind:touchstart="handleTap2">
  outer view
  <view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">
    inner view
  </view>
</view>

如果将上面代码中的第一个capture-bind改为capture-catch,将只触发handleTap2

<view id="outer" bind:touchstart="handleTap1" capture-catch:touchstart="handleTap2">
  outer view
  <view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">
    inner view
  </view>
</view>

 


五、事件对象

1、BaseEvent 基础事件对象属性列表:

属性类型说明
typeString事件类型
timeStampInteger事件生成时的时间戳
targetObject触发事件的组件的一些属性值集合
currentTargetObject当前组件的一些属性值集合
markObject事件标记数据

2、CustomEvent 自定义事件对象属性列表(继承 BaseEvent):

属性类型说明
detailObject额外的信息

3、TouchEvent 触摸事件对象属性列表(继承 BaseEvent):

属性类型说明
touchesArray触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouchesArray触摸事件,当前变化的触摸点信息的数组

4、特殊事件

 canvas 中的触摸事件不可冒泡,所以没有 currentTarget。

5、 target 和 currentTarget 的区别

target 是 触发事件的源组件。

属性类型说明
idString事件源组件的id
datasetObject事件源组件上由data-开头的自定义属性组成的集合

currentTarget 是 事件绑定的当前组件。

属性类型说明
idString当前组件的id
datasetObject当前组件上由data-开头的自定义属性组成的集合

target 和 currentTarget 的使用案列,请戳这里:https://juejin.im/post/59f16ffaf265da43085d4108

 


六、WXS响应事件

1、获取dom元素节点

可以参考这里:https://juejin.im/post/5be7df8ff265da61590b3169

wx.createSelectorQuery() 可以用于获取节点属性、样式、在界面上的位置等信息。

  • 返回值是一个 SelectorQuery 对象实例。
  • 在自定义组件或包含自定义组件的页面中,应使用 this.createSelectorQuery() 来代替。

SelectorQuery 查询节点信息的对象

方法

描述

SelectorQuery SelectorQuery.in(Component component)

将选择器的选取范围更改为自定义组件 component 内。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点)。

NodesRef SelectorQuery.select(string selector)

在当前页面下选择第一个匹配选择器 selector 的节点。返回一个 NodesRef 对象实例,可以用于获取节点信息。

NodesRef SelectorQuery.selectAll(string selector)

在当前页面下选择匹配选择器 selector 的所有节点。

NodesRef SelectorQuery.selectViewport()

选择显示区域。可用于获取显示区域的尺寸、滚动位置等信息。

NodesRef SelectorQuery.exec(function callback)

执行所有的请求。请求结果按请求次序构成数组,在callback的第一个参数中返回。

 案例

const query = wx.createSelectorQuery()
query.select('#the-id').boundingClientRect()
query.selectViewport().scrollOffset()
query.exec(function(res){
  res[0].top       // #the-id节点的上边界坐标
  res[1].scrollTop // 显示区域的竖直滚动位置
})

2、WXS响应事件

引自:https://developers.weixin.qq.com/miniprogram/dev/framework/view/interactive-animation.html

  • 使用 WXS 函数用来响应小程序事件,目前只能响应内置组件的事件,不支持自定义组件事件。
  • WXS 函数的除了纯逻辑的运算,还可以通过封装好的 ComponentDescriptor 实例来访问以及设置组件的 class 和样式,对于交互动画,设置 style 和 class 足够了。

案例:

var wxsFunction = function(event, ownerInstance) {
    console.log('----------event', JSON.stringify(event));

    var instance = ownerInstance.selectComponent('.classSelector') // 返回组件的实例
    instance.setStyle({
        "font-size": "14px" // 支持rpx
    })
    instance.getDataset()
    instance.setClass(className)
    // ...
    return false // 不往上冒泡,相当于调用了同时调用了stopPropagation和preventDefault
}
  • 入参 event:是小程序事件对象基础上多了 event.instance 来表示触发事件的组件的 ComponentDescriptor 实例。
  • 入参ownerInstance:是触发事件的组件所在的组件的 ComponentDescriptor 实例,如果触发事件的组件是在页面内的,ownerInstance 表示的是页面实例。

ComponentDescriptor 实例对象

方法参数描述
selectComponentselector对象返回组件的 ComponentDescriptor 实例。
selectAllComponentsselector对象数组返回组件的 ComponentDescriptor 实例数组。
setStyleObject/string设置组件样式,支持rpx。设置的样式优先级比组件 wxml 里面定义的样式高。不能设置最顶层页面的样式。
addClass/removeClass/ hasClassstring设置组件的 class。设置的 class 优先级比组件 wxml 里面定义的 class 高。不能设置最顶层页面的 class。
getDataset返回当前组件/页面的 dataset 对象
callMethod(funcName:string, args:object)调用当前组件/页面在逻辑层(App Service)定义的函数。funcName表示函数名称,args表示函数的参数。
requestAnimationFrameFunction和原生 requestAnimationFrame 一样。用于设置动画。
getState返回一个object对象,当有局部变量需要存储起来后续使用的时候用这个方法。
triggerEvent(eventName, detail)和组件的triggerEvent一致。

3、如何定义wxs事件

<wxs module="test" src="./test.wxs"></wxs>
<view change:prop="{{test.propObserver}}" prop="{{propValue}}" bindtouchmove="{{test.touchmove}}" class="movable"></view>
// test.wxs

module.exports = {
    touchmove: function(event, instance) {
        console.log('log event', JSON.stringify(event))
    },
    propObserver: function(newValue, oldValue, ownerInstance, instance) {
        console.log('prop observer', newValue, oldValue)
    }
}

上面的change:prop(属性前面带change:前缀)是在 prop 属性被设置的时候触发 WXS 函数,值必须用{{}}括起来。类似 Component 定义的 properties 里面的 observer 属性,在setData({propValue: newValue})调用之后会触发。

注意:WXS函数必须用{{}}括起来。当 prop 的值被设置 WXS 函数就会触发,而不只是值发生改变,所以在页面初始化的时候会调用一次WxsPropObserver的函数。

 

七、常用WXS事件

1、bindtap点击事件

案例:

// index.wxml

<view>
    <view class="tab_btn " bindtap="tabClick">标签1</view>
</view>
// index.wxs

Page({

    /**
     * 页面的初始数据
     */
    data: {
      
    },
    
    /**
    * 自定义函数
    */ 
    tabClick(){
      console.log('1111111111111111111');
      
    },
})

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值