让前端飞WEB学习笔记Web 前端开发

小程序学习笔记-触控事件和数据绑定

2019-01-15  本文已影响200人  赵客缦胡缨v吴钩霜雪明

微信小程序之触控事件

什么是事件

事件分类

事件分为冒泡事件和非冒泡事件:

WXML的冒泡事件列表:

类型 触发条件
touchstart 手指触摸动作开始
touchmove 手指触摸后移动
touchcancel 手指触摸动作被打断,如来电提醒,弹窗
touchend 手指触摸动作结束
tap 手指触摸后马上离开
longtap 手指触摸后,超过350ms再离开

注:除上表之外的其他组件自定义事件如无特殊申明都是非冒泡事件,如<form/>的submit事件,<input/>的input事件,<scroll-view/>的scroll事件,(详见各个组件)

事件绑定

事件绑定的写法同组件的属性,以 key、value 的形式。

注:bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。

在编写代码中,使用频率高的事件方式是

细心的读者可能会发现,点击事件中,还有一个很重要的事件——双击,小程序竟然没有实现,真是神奇。不过可以通过单击事件模拟双击时间实现。查阅资料发现,电脑或者手机的双击事件都是300ms内连续点击,所以本文也采用300ms以内连续点击视为双击事件。

<!--index.wxml-->
<view>
    <button bindtap="binddoubletap">点击</button>
</view>
//index.js
Page({
  data: {
    //上一次点击的时间
    lastTapTime:0
  },
  binddoubletap:function(e){
    //获取点击当前时间
    var curTime = e.timeStamp
    //上一次点击的时间
    var lastTime = this.data.lastTapTime
    if(lastTime > 0){
       //电脑双击事件间隔为300ms以内,这里也用300ms间隔吧
      if(curTime - lastTime <300){
        console.log("双击事件触发")
      }else{
        console.log("单击事件触发")
      }
    }else{
      console.log("单击事件触发")
    }
     //保存本次点击的时间
    this.setData({
      lastTapTime: curTime
    })
  }
})

小程序学习笔记之数据绑定

微信小程序是通过状态模式-单向数据流来实现数据绑定。

状态模式定义一个对象,改对象可以通过管理其状态的变化,从而实现应用程序做出相应的变化。

img

简单的讲,对象状态化,只要对象状态发送变化,就通知页面更新视图元素。 通过以下三个步骤实现:

注意数据流向是单向的,即视图变化不会影响对象状态。

index.wxml:
<view> {{ message }} </view>
index.js:
Page({
 data: {
   message: 'Hello MINA!'
 }
})

通过以上代码,就可以完成简单的数据绑定。

以下将展示小程序提供的更加多元化的复杂的数据绑定方式。

index.wxml
 <!--数据绑定--内容-->
<view>{{message}}</view>

<!--数据绑定--组件属性-->
<view id="item-{{id}}">组件属性id-{{id}}</view>

<!--数据绑定---控制属性-->
<view wx:if="{{condition}}">控制属性{{condition}}</view>

<!--数据绑定---三元运算-->
<view hidden="{{flag ? true : false}}">Hidden--{{flag}}</view>

<!--数据绑定---算数运算-->
<view>{{a + b}} + {{c}} + d</view>

<!--数据绑定---逻辑判断-->
<view wx:if="{{length > 5}}">6</view>

<!--数据绑定---字符串运算-->
<view>{{"Hello  " + name}}</view>

<!--数据绑定---数组组合-->
<view wx:for="{{[zero, 1, 2, 3, 4, 5, 6]}}">{{item}}</view>

<!--数据绑定---对象-->
<!--最终组合成的对象是{for: 1, bar: 2}-->
<template is="objectCombine" data="{{for: x, bar: y}}"></template>

<!--数据绑定---扩展运算符 ... 来将一个对象展开-->
<!--最终组合成的对象是{a: 1, b: 2, c: 3, d: 4, e: 5}-->
<template is="objectCombine" data="{{...obj1, ...obj2, e: 5}}"></template>

<!--数据绑定---对象的 key 和 value 相同-->
<!--最终组合成的对象是{foo: 'my-foo', bar:'my-bar'}-->
<template is="objectCombine" data="{{foo, bar}}"></template>
index.js
Page({
  data:{
    //内容
    message:'Hello MINA!',

    //组件属性
    id: 0,

    //控制属性
    condition: true,

    //三元运算
    flag:false,

    //算数运算
    a: 1,
    b: 2,
    c: 3,

    //逻辑判断
    length: 6,

    //字符串运算
    name: 'MINA',

    //数组组合
    zero: 0,

    //对象
    x: 0,
    y: 1,

    //对象展开
    obj1: {
        a: 1,
        b: 2
    },
    obj2: {
        c: 3,
        d: 4
    },
    e: 5,

    //对象key和value相同
    foo: 'my-foo',
    bar: 'my-bar'
  },
})

仅仅通过绑定数据实现视图的展示是不够的,一旦用户操作或者数据更新引起数据变化,视图需要同步更新。

所以视图上的数据都必须用过事件传递给对象,只有用户操作视图,才能获取到数据,并更新对象状态。

调用this.setData()方法实现视图的部分渲染。如下图:

img

视图-对象

index.wxml:
<view bindtap="changeText"> {{ message }} </view>
index.js:
Page({
 data: {
   message: 'Hello MINA!'
 },
changeText: function(){
    this.setData({
      message:'changed data'
    })
  }
})
上一篇下一篇

猜你喜欢

热点阅读