零基础微信小程序开发——WXML 模板语法之事件绑定(保姆级教程+超详细)

发布于:2024-12-18 ⋅ 阅读:(9) ⋅ 点赞:(0)

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容
🌸个人主页: 长风清留杨的博客
🍃形式准则: 无论成就大小,都保持一颗谦逊的心,尊重他人,虚心学习。
推荐专栏: Python入门到入魔Mysql入门到入魔Python入门基础大全Flink入门到实战
🍂若缘分至此,无法再续相逢,愿你朝朝暮暮,皆有安好,晨曦微露道早安,日中炽热说午安,星河长明寄晚安🍂

WXML 模板语法

事件绑定

什么是事件

在小程序开发中,事件是渲染层(Webview)到逻辑层(JsCore)的通讯方式。简单来说,当用户与小程序界面进行交互时(如点击按钮、滑动页面等),这些交互行为会被捕获并转化为特定的事件。这些事件随后被发送给逻辑层,逻辑层接收到事件后,会根据预定义的回调函数来处理这些事件,并执行相应的业务逻辑。

事件的触发与传递

  1. 触发事件:用户在渲染层与小程序界面进行交互,如点击按钮,这个行为会触发一个事件。
  2. 事件传递:触发的事件会从渲染层被发送到逻辑层。这个过程中,事件携带了触发它的用户行为信息,如点击的位置、点击的元素等。
  3. 逻辑层处理:逻辑层接收到事件后,会根据预定义的回调函数来处理这个事件。回调函数定义了当事件发生时应该执行的操作,这些操作可以是更新界面、调用API等。

小程序中常用的事件

类型 绑定方式 事件描述
tap bindtapbind:tap 用户点击时触发,适用于按钮、图片等可点击元素
longtap bindlongtapbind:longtap 用户长按时触发,适用于需要用户长时间按压的场景
touchstart bindtouchstartbind:touchstart 手指触摸开始时触发
touchmove bindtouchmovebind:touchmove 手指触摸后移动时触发
touchend bindtouchendbind:touchend 手指触摸结束时触发
touchcancel bindtouchcancelbind:touchcancel 手指触摸被打断(如来电)时触发
input bindinputbind:input 文本框内容改变时触发,常用于获取用户输入的内容
change bindchangebind:change 组件状态改变时触发,如单选框、复选框、滑动条等组件的值改变
submit bindsubmitbind:submit 表单提交时触发,常用于收集用户输入的数据
reset bindresetbind:reset 表单重置时触发,常用于清空表单中的数据
confirm bindconfirmbind:confirm 弹出框(如模态框)确认按钮被点击时触发
cancel bindcancelbind:cancel 弹出框(如模态框)取消按钮被点击时触发
scroll bindscrollbind:scroll 页面或组件滚动时触发,常用于实现滚动监听
swipe bindswipebind:swipe 用户快速滑动时触发,常用于实现轮播图等滑动效果

事件对象的属性列表

当事件回调触发的时候,会收到一个事件对象 event,它的详细属性如下

属性名 数据类型 说明
type string 事件类型
timeStamp number 触发事件的时间戳
target object 触发事件的源头组件
currentTarget object 当前绑定事件处理函数的组件
detail object 事件的附加数据,根据具体事件类型不同而不同
touches array 触摸事件时,当前触摸点列表
changedTouches array 触摸事件时,发生变化的触摸点列表
targetTouches array 触摸事件时,目标元素上的触摸点列表

其中targetdetail是比较常用的

target 和 currentTarget 的区别

target 是触发该事件的源头组件,而 currentTarget 则是当前事件所绑定的组件。
首先设置了一个view组件,然后在view组件中嵌套了一个button组件,通过bindtap给view组件绑定了一个outerHandler(手指触摸事件)


点击内部的按钮时,点击事件以冒泡的方式向外扩散,也会触发外层 view 的 tap 事件处理函数。(也就是说当点击按钮的时候,首先触发按钮的事件,然后会进行扩散,触发view组件的事件)
此时,对于外层的 view 来说:

  • e.target 指向的是触发事件的源头组件,因此,e.target 是内部的按钮组件(也就是说先点击的按钮,先触发的是按钮操作,所以按钮是源头组件)
  • e.currentTarget 指向的是当前正在触发事件的那个组件,因此,e.currentTarget 是当前的 view 组件(因为先触发的button组件,然后再粗发view组件,所有当前正在触发的组件是view组件)

bindtap 的语法格式

在小程序中,不存在 HTML 中的 onclick 鼠标点击事件,而是通过 tap 事件来响应用户的触摸行为。

通过 bindtap,可以为组件绑定 tap 触摸事件,语法如下:

index.wxml文件

<button type="primary" bindtap="btnTapHandler">按钮</button>

在页面的 .js 文件中定义对应的事件处理函数,事件参数通过形参 event(一般简写成 e) 来接收:

index.js文件

Page({
    btnTapHandler(e){
        console.log(e)
    }
  })

然后再页面上点击按钮,查看Console中捕捉到的事件


捕捉到的事件:

  1. type:
    • 值:“tap”
    • 说明:表示事件类型是点击事件。
  2. timeStamp:
    • 值:13170578
    • 说明:表示事件触发的时间戳,这个值通常用于比较事件的先后顺序。
  3. target:
    • 说明:触发事件的节点对象。
    • 包含字段:
      • id: “”(节点ID,此处为空)
      • offsetLeft: 103(节点相对于其最近的具有定位(positioned)父节点的水平偏移量)
      • offsetTop: 91(节点相对于其最近的具有定位(positioned)父节点的垂直偏移量)
      • dataset: {…}(节点的自定义数据集合)
  4. currentTarget:
    • 说明:绑定事件的当前组件对象。在事件捕获和冒泡阶段,currentTarget始终指向事件绑定的组件,而target指向触发事件的节点。
    • 包含字段与target相同,说明此处事件直接绑定在了触发节点上。
  5. detail:
    • 说明:事件的详细信息。
    • 包含字段:
      • x: 213.66015625(点击事件在组件内的相对X坐标)
      • y: 110.08984375(点击事件在组件内的相对Y坐标)
  6. mark:
    • 值:{}
    • 说明:用于传递一些额外的信息,此处为空。
  7. mut:
    • 值:false
    • 说明:通常用于表示事件是否由用户交互触发,此处表示事件是由用户交互触发的(但这里的命名和常规理解有些出入,常规上应该是true表示由用户触发,具体含义可能依赖于小程序框架的实现)。
  8. changedTouches:
    • 说明:包含了所有触发了当前事件的触摸点(Touch objects)的数组。
    • 包含字段:{…}(具体字段取决于触摸事件的具体实现)
  9. touches:
    • 说明:包含了当前在屏幕上的所有触摸点(Touch objects)的数组。
    • 包含字段:{…}(具体字段取决于触摸事件的具体实现)
  10. _relatedInfo:
    • 说明:这是一个非标准字段,可能是小程序框架或特定组件自定义添加的。
    • 包含字段:
      • anchorTargetText: “按钮”(触发事件的节点文本)
      • anchorRelatedText: “”(与触发事件相关的其他文本,此处为空)
      • anchorTapTime: 1733147444414(触发事件的时间戳,可能是毫秒级时间)
  11. _allowWriteOnly, _requireActive, _userTap:
    • 这些字段可能是框架内部使用的,用于控制事件的处理流程或行为。

在事件处理函数中为 data 中的数据赋值

通过调用 this.setData(dataObject) 方法,可以给页面 data 中的数据重新赋值,示例如下:

index.wxml文件:

<button type="primary" bindtap="changeC">加1</button>
<view class="container">
  <!-- 动态绑定文本 -->
  <text>当前用户名:{{count}}</text>
</view>
  1. 按钮 (<button>):
    • type=“primary”:设置按钮的类型为“primary”,这通常意味着按钮会有一种醒目的样式(如蓝色背景),以突出显示。
    • bindtap=“changeC”:这是一个事件绑定,当用户点击这个按钮时,会触发 changeC 方法。这个方法定义在 index.js 文件中。
  2. 视图容器 (<view>) 和文本 (<text>):
    • <view class="container">:定义了一个类名为 container 的视图容器,用于包裹内部的文本元素。
    • <text>当前用户名:{{count}}</text>:这里使用了数据绑定({{count}}),它会显示 index.js 文件中 data 对象中 count 属性的值。

index.js文件:

Page({
    data:{
        count:0
    },
    changeC(){
        this.setData({
            count:this.data.count+1
        })
    }
  })
  1. 数据 (data):
    • count: 0:定义了一个名为 count 的数据属性,初始值为 0。这个属性用于存储和显示计数器的值。
  2. 事件处理方法 (changeC):
    • changeC() 方法是一个事件处理函数,当按钮被点击时,这个方法会被调用。
    • this.setData({ count: this.data.count + 1 }):这行代码用于更新 count 的值。setData 方法是小程序提供的用于更新页面数据的方法。这里它将 count 的值增加 1。

在小程序(如微信小程序)的开发中,this.setData({}) 是一个非常重要的方法,它用于更新页面数据并触发页面的重新渲染。

当你调用 this.setData(object) 时,你实际上是在告诉小程序框架:“我想更新这些数据,并且希望页面能够反映出这些变化。

this.data.count表示获取到当前页面上count的值

下面结果图中注意页面上的数字变化,和右下角中的AppData中count的变化

在这里插入图片描述

事件传参(错误示范)

小程序中的事件传参比较特殊,不能在绑定事件的同时为事件处理函数传递参数。例如,下面的代码将不能正常工作

<button type="primary" bindtap="btnHandler(666)">事件传参</button>

定义了一个按钮,在按钮中定义了一个点击事件,事件中直接给btnHandler加上括号里面加入了666这个参数,这样是不可以的!小程序会把btnHandler(666)当做事件的名称,不会把括号里面的当成参数

事件传参(正确示范)

可以为组件提供 data-* 自定义属性传参,其中 * 代表的是参数的名字,示例代码如下:

<button type="primary" bindtap="btnHandler" data-age="{{2}}">事件传参</button>

定义了一个按钮(button),设置了一个点击事件,名称为btnHandler,然后定义了一个参数,参数的名称是age,值是2,设置参数的时候使用的是Mustache 语法的格式{{}},如果不使用Mustache 语法的格式那么参数就是字符串的格式,使用了在里面写一个2,那么就是数字格式

事件传参(获取事件参数的值)

在事件处理函数中,通过 event.target.dataset.参数名 即可获取到具体参数的值,示例代码如下:

index.wxml文件

<button type="primary" bindtap="user_age" data-age="{{2}}">查看年龄</button>

index.js文件

Page({
    user_age(event){
        console.log("获取所有参数:",event.target.dataset)
        console.log("当前用户的年龄是:",event.target.dataset.age)
    }
  })

bindinput 的语法格式

在小程序中,通过 input 事件来响应文本框的输入事件

index.wxml文件
定义一个bindinput,绑定文本框的输入事件,名称为input_username

<input bindinput="input_username"></input>

index.js文件

Page({
    input_username(e){
        // e.detail.value 每次都会获取文本框中最新的值
        console.log(e.detail.value)
    }
  })

我先输入一个张,然后输入一个三,然后再输入一个李,然后再输入一个四,可以看到,每次都是获取到最新的输入内容

实现文本框和 data 之间的数据同步

(1)定义数据:

在小程序页面的data对象中,我们需要定义一个属性来存储文本框中的值。这个属性可以是任意名称,但最好能够反映其用途,比如inputValue。

Page({
  data: {
    inputValue: '' // 初始化为空字符串
  }
})
(2)渲染结构:

在WXML文件中,我们使用<input>标签来创建一个文本框,并通过value属性绑定到data对象中的inputValue属性。同时,我们需要为<input>标签添加一个bindinput事件监听器,用于捕获用户的输入事件。

<input type="text" value="{{inputValue}}" bindinput="handleInputChange" />

这里,{{inputValue}}是WXML模板语法中的插值表达式,用于将data对象中的inputValue属性值渲染到文本框中。bindinput="handleInputChange"表示当文本框的内容发生变化时,会调用handleInputChange方法来处理这个事件。

(3)美化样式:

虽然这一步不是实现数据同步所必需的,但为了使文本框更加美观,我们可以在WXSS文件中为其添加一些样式。例如,可以设置文本框的宽度、高度、边框、内边距等属性。

input {
  width: 100%;
  height: 40px;
  border: 1px solid #ccc;
  padding: 5px;
  box-sizing: border-box;
}
(4)绑定 input 事件处理函数:

在页面的JavaScript文件中,我们需要定义一个名为handleInputChange的方法来处理bindinput事件。这个方法会接收一个事件对象作为参数,我们可以通过这个对象的detail.value属性来获取文本框中的当前值。然后,我们使用this.setData方法来更新data对象中的inputValue属性。

Page({
  data: {
    inputValue: ''
  },
  handleInputChange: function(e) {
    this.setData({
      inputValue: e.detail.value
    });
  }
})

在这里,this.setData是一个非常重要的方法,它用于更新页面的数据并触发页面的重新渲染。当我们调用this.setData时,小程序框架会比较新旧数据之间的差异,并只更新那些发生变化的部分,从而提高页面的渲染效率。

(5)结果:

注意看AppData中的内容,变量的值会随着我们的输入实时变化
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到