wxml数据绑定,列表渲染,条件渲染

学习目标

  1. 小程序生命周期
  2. wxml数据渲染,列表渲染, 条件渲染
  3. 组件事件绑定 (bindtap, bindinput)
  4. 修改this.data的值
  5. Page中的页面事件
  6. 判断场景值

生命周期

生命周期有程序的生命周期和页面的生命周期

程序的生命周期

文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/app.html

在程序入口app.js中调用App(), 而且必须调用且只能调用一次,然后再App()的参数中可以声明生命周期函数

前台,后台的概念

  • 前台:打开微信就进入小程序前台
  • 后台:当用户点击右上角关闭,或者按了设备 Home 键离开微信,此时小程序并没有直接销毁,而是进入了后台;

常用的生命周期:

属性 描述 触发时机
onLaunch 监听小程序初始化 小程序初始化完成时(全局只触发一次)
onShow 监听小程序显示 小程序启动,或从后台进入前台显示时
onHide 监听小程序隐藏 小程序从前台进入后台时

注意:小程序的运行机制

  • 小程序没有重启的概念
  • 当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后(目前是5分钟)会被微信主动销毁

页面的生命周期

页面需要通过Page(Object) 函数用来注册一个页面。接受一个 Object 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等。

文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page.html

常用的生命周期:

属性 描述
onLoad 监听页面加载
onShow 监听页面显示
onReady 监听页面初次渲染完成
onHide 监听页面隐藏

onLoad
页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。

参数说明, 通过query获取当前页面路径中的参数

名称 类型 说明
query Object 打开当前页面路径中的参数
注意:页面需要访问api接口来初始化页面, 都可以在onLoad中调用

总结:

  • 程序的生命周期: app.js中onLaunch在小程序初始化中触发
  • 页面的生命周期: onLoad 只在页面加载的时候执行一次, onShow每次访问页面都会执行, 通常onLoad在onShow之前执行

wxml数据绑定,列表渲染,条件渲染

wxml数据绑定

基本概念
WXML 中的动态数据均来自对应 Page 的 data。

使用方法
数据绑定在wxml模板中使用 双大括号 {{}} 将变量包起来

在组件属性中绑定数据
在组件的属性中绑定数据需要在双引号中使用大括号

// js
Page({
  data: {
    id: "index"
  }
})

// wxml
<view id="{{id}}"></view>

在组件属性中绑定布尔值
布尔值关键字,需要在双引号中使用大括号

<checkbox checked="{{false}}"> </checkbox>
注意:不要直接写 checked="false",其计算结果是一个字符串,转成 boolean 类型后代表真值。

在大括号内运算

// 数字相加
<view>{{1 + 2}}</view>

// 字符串相加
<view>{{"hello" + name}}</view>

列表渲染

重点概念
默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item

基本使用

// wxml
<view wx:for="{{array}}">
  {{index}}: {{item.message}}
</view>

// js
Page({
  data: {
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }]
  }
})

wx:key的使用
如不提供 wx:key,会报一个 warning,循环数组可以把key设置为下标

// wxml
<view wx:for="{{array}}" wx:key="{{index}}">
  {{index}}: {{item.message}}
</view>

for循环嵌套
当for循环嵌套时候,会造成indexitem冲突,这时候需要用到以下两个属性:

  • 使用 wx:for-item 可以指定数组当前元素的变量名,
  • 使用 wx:for-index 可以指定数组当前下标的变量名

例子:

<view wx:for="{{array}}" wx:for-index="subIndex" wx:for-item="subItem">
  {{subIndex}}: {{subItem.message}}
</view>

条件渲染

基本概念
在框架中,使用 wx:if="{{condition}}" 来判断是否需要渲染该代码块

<view wx:if="{{condition}}"> True </view>

wx:elif和wx:else
可以用 wx:elif 和 wx:else 来添加一个 else 块:

<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>

总结

  1. WXML 中的动态数据均来自对应 Page 的 data
  2. WXML 大括号内可以进行运算
  3. wx:for下标变量名默认为 index,数组当前项的默认为 item
  4. wx:for需要加上wx:key, 否则报警告
  5. 无论是数据绑定、循环渲染和条件渲染,都必须使用大括号

事件绑定

  • 点击事件 bindtap
  • 表单input监听输入事件 bindinput

点击事件 bindtap

bindtap类似于html的onClick事件

<view bindtap="tabClick"> Click me! </view>

事件对象event

Page({
tabClick: function(event) {
console.log(event)
}
})

获取事件参数
通过data-*给组件绑定需要的参数,然后再绑定的事件中通过事件对象event.currentTarget.dataset 可以读取参数

参考例子:

// wxml
<view bindtap="tabClick" data-name="myName"> Click me! </view>

// js
Page({
  tabClick: function(event) {
    const data = event.currentTarget.dataset;
    console.log(data)
    console.log(data.name)
  }
})

input监听输入事件 bindinput

bindinput类似于html的oninput事件

bindinput的event事件对象
键盘输入时触发,可以通过访问event.detail.value获取input的value

// wxml
<input bindinput="bindKeyInput" placeholder="输入同步到view中"/>

// js
Page({
  bindKeyInput: function(event) {
    console.log(event.detail);
    console.log(event.detail.value);
  },
})
注意: 小程序所有的事件获取参数都是上例的bindtap中的一样,通过data-*来绑定

总结

  • bindtap类似于html的onClick事件, 普通的点击事件
  • bindinput类似于html的oninput事件, 可以通过event
  • 获取input的值

修改page中data的值

使用this.setData修改data的值

基本使用

// wxml
<view>{{text}}</view>
<button bindtap="changeText"> 
    修改 
</button>

// js
Page({
  data: {
    text: '默认的文字',
  },

  changeText: function() {
    // 错误使用: this.data.text = '修改后的文字'
    this.setData({
      text: '修改后的文字'
    })
  },
}

this指向问题
注意在某个闭包中使用时候导致this没有指向当前的page,需要先声明this的变量,供闭包内部使用

Page({
    data: {
        text: "默认的文字"
    },
    changeText: function(){
        const that = this;
        setTimeout(function(){
            that.setData({
                text: "修改后的文字"
            })
        },2000)
    }
})

注意:

  • 切记不要使用this.data.* = ""的方式修改data的值,一定要是this.setData
  • 请不要把 data 中属性的值设为 undefined

小程序页面事件

监听用户下拉刷新事件

文档的地址: https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page.html#onShareAppMessage

Page中设置onPullDownRefresh函数

Page({
    onPullDownRefresh: function(){
        console.log("下拉刷新")
    }
})
注意:需要在app.json的window选项中或页面配置中开启enablePullDownRefresh。

监听用户上拉触底事件

文档的地址: https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page.html#onShareAppMessage

Page中设置onReachBottom函数

// wxml 需要高度可以滚动
Page({
    onReachBottom: function(){
        console.log("上拉触底事件")
    }
})
注意:在触发距离内滑动期间,距离大概是50px以内,本事件不会再次出发

页面分享事件

文档的地址: https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page.html#onShareAppMessage

Page中蛇设置onShareAppMessage函数,
转发事件由设置了 open-type="share" 的按钮来触发

此事件需要 return 一个 Object,用于自定义转发内容,返回内容如下:

字段 说明 默认值
title 标题 当前小程序名称
path 转发路径 当前页面 path ,必须是以 / 开头的完整路径
imageUrl 自定义图片路径 使用默认截图
Page({
  onShareAppMessage: function (res) {
    return {
      title: '自定义转发标题',
      path: '/page/user?id=123'
    }
  }
})
注意:只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮

总结:

  • 实现类似微信朋友圈的刷新朋友圈使用onPullDownRefresh
  • 无限滚动加载使用 onReachBottom
  • 右上角菜单才会显示“转发”按钮需要定义onShareAppMessage

判断场景值

场景值说明:https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/scene.html

在 App 的 onLaunch 和 onShow 中获取上述场景值

tab页面的路由管理

程序路由的 Tab 切换,Tab 切换页面全部出栈,只留下新的 Tab 页面

vscode开发小程序

vsCode中安装wxml和wxss插件,只需要安装vscode搜索wxml结果的前两项就可以了

第二天内容知识点总结:

  1. 能通过微信开发者工具的“预览“功能,在自己手机上预览小程序
  2. 掌握小程序的数据绑定语法 {{}}
  3. 掌握小程序列表渲染语法 wx:for
  4. 掌握小程序条件渲染语法 wx:if,wx:else
  5. 掌握小程序事件绑定 bindtap 基本用法
  6. 了解小程序事件传参 data-* 与 事件对象中 e.currentTarget.dataset 获取参数
  7. 了解表单事件 bindinput 与普通事件 bindtap 区别,bindtap 的事件对象不能获取表单值
  8. 掌握通过 this.setData() 接口实现数据渲染到视图层
  9. 了解小程序的上拉事件,下拉事件,分享事件
  10. 了解小程序生命周期函数,能通过控制台输出查看各生命周期函数的执行顺序
  11. 能区别 onLoad 和 onShow 生命周期函数,onLoad 只在加载的时候执行一次
  12. 了解小程序场景值的应用场景,通过判断场景值,执行不同的 console.log
  13. 了解小程序路由的 Tab 切换,Tab 切换页面全部出栈,只留下新的 Tab 页面
  14. 使用 VSCode 关联 wxml,wxss 文件实现语法高亮提示
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容