微信小程序基础(二)事件&渲染

事件绑定

事件处理函数要写在Page({})里.

<input bindinput="handleBindInput"></input>
事件类型绑定手法说明
tapbindtap / bind:tap触屏点击
inputbindinput / bind:input文本框输入
changebindchange / bind:change状态改变

共性是, 这些事件会返回一个对象, 里面包含有关本次事件的信息, 以下为这个返回对象中的内容:

属性类型说明
typeString事件的类型
timeStampInteger页面打开到触发该事件经历的毫秒数
targetObject事件函数所绑定的组件的属性值集合
currentTargetObject当前组件的属性值集合(不常用)
detailObject额外信息, 比如input的值
touchesArray当前停留在屏幕中的触摸点信息的数组
changeTouchesArray当前变化的触摸点信息的数组

事件传参

虽然事件绑定像Vue那样方便, 但是传参要另外写出, 像Vue那样把参数直接写在事件处理函数上会被解析成函数名的一部分而报错:

data-参数名="参数值"  //传String/Number
data-参数名="{{参数值}}"  //传变量, 不加双括号不解析
//多参直接传数组, 在插值表达式里传对象会报错

这个例子通过给第一个button的事件函数handleBindTap传参canshu, 改变第二个button的内容

<!-- 参数为String/Number时 -->
<button bindtap="handleBindTap" data-canshu="someParams">changeText</button>
<button>{{text}}</button>
Pages({
  data: {
    text: "原始Text"
  },
  handleBindTap(event) {  //event为返回的事件对象
    this.setData({
      text: event.target.dataset.canshu
    })
  }
})

在这里插入图片描述
另外部分参数可以直接从返回的事件对象中获取, 比如input的value:

<input 
  bindinput="handleBindTap" 
  placeholder="pleaseInput"
>
</input>
<button>{{text}}</button>
Page({
  data: {
    text: ""
  }
  handleBindTap(event) {
    this.setData({
      text: event.detail.value
    })
  },
})

在这里插入图片描述


数据绑定

同样的效果也可以用数据双向绑定来实现, 会稍微麻烦一点:
官方提供的简单实现双向绑定的方法是:

model:某属性="{{data中的某个参数}}" 
//将该元素的某属性绑定到data中的某个参数

比如下面将input的value绑定到data的msg
然后通过输入事件函数的处理方法实时将msg的值赋给text.
对比v-model

<input 
  model:value="{{msg}}" 
  bindinput="handleBindInput" 
  placeholder="input"
/>
<text>{{text}}</text>
Page({
  data:{
    msg: "",
    text: ""
  },
  handleBindInput(e) {
    this.setData({
      text: this.data.msg
    })
  },
})

条件渲染

主要使用

  wx:if="{{表达式}}"

来实现, 这就跟v-if一样的…
写的时候想到能不能像Vue的computed一样在外部进行运算, 然后直接返回结果到条件渲染判断?
这个例子把info的运算放到justice()中进行:

<input 
  model:value="{{msg}}" 
  bindinput="handleBindInput" 
  placeholder="Please input..." 
/>
<view wx:if="{{text}}">text:{{text}}</view>
<view wx:elif="justice">info:{{info}}</view>
<view wx:else>msg:{{msg}}</view>
<!-- else不需要加判定 -->
Page({
  data: {
    info: 'Hello World',
    text: "",
    msg: ""
  }
  justice() {
    if (info === 'Hello World') {
      return true;
    } else {
      return false;
    } 
  }
})

可见初始情况下info的判定是有效的, 在text存在后又展示了text.
在这里插入图片描述
小程序的条件渲染增加了<block>, 一个不会被渲染的标签, 可以把条件渲染判别式写在block上来操控block内标签的渲染, 终于不用再拿个div去套了…

<input model:value="{{msg}}" bindinput="handleBindInput" placeholder="Please input..." />

<block wx:if="{{msg}}">
  <text>if:</text>
  <view>msg:{{msg}}</view>
</block>

<block wx:elif="justice">
  <text>elif:</text>
  <view>info:{{info}}</view>
</block>

<block wx:else>
  <text>else:</text>
  <view>text:{{text}}</view>
</block>
Page({
  data: {
    info: 'Hello World',
    text: "",
    msg: ""
  }
  justice() {
    if (info === 'Hello World') {
      return true;
    } else {
      return false;
    } 
  }
})

在这里插入图片描述

hidden
并非控制渲染与否, 仅仅控制显示, 其与wx:if的区别如同v-show和v-if, opacity:0display: none:

hidden="{{表达式}}"
<!-- justice返回true -->
<view>msg:{{msg}}</view>
<view hidden="justice">info:{{info}}</view>
<view>text:{{text}}</view>

在这里插入图片描述
hidden不能和block标签配合食用, 会报错.

但是加了block之后记得一定要把wx:if写到block标签上, 不然WXML会报错.


遍历渲染

参考v-for, 不过它甚至连item和index都可以不写…
但还是要通过wx:key=""绑定key, 不然会警告:

<view wx:for="{{数组名}}" wx:key="绑定到key的项">
<view wx:for="{{anArray}}" wx:key="index">
<text>index: {{index}} </text>
<text>item: {{item}}</text>
</view>
Page({
  data: {
    anArray: [1, 2, 3, 4, 5]
  },
})

在这里插入图片描述
也支持通过wx:for-index=""wx:for-item=""手动设定item和index:

<view 
  wx:for="{{anArray}}" 
  wx:key="index" 
  wx:for-index="ind" 
  wx:for-item="ite">
</view>
<view 
  v-for="(ite, ind) in anArray" 
  >
</view>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值