小程序的WXML动态模板语法详解

曾经终败给现在 2023-03-13 06:09 84阅读 0赞

WXML动态模板语法详解

对于WXML的动态语法,简单的分类为:

  1. 数据绑定
  2. 条件渲染
  3. 列表渲染
  4. 事件处理

数据绑定

  • 基础数据绑定
  • 组件值数属性绑定:插值表达式的信息可以插入到属性中
  • 插值表达式内部支持计算
  • 对象操作: 访问对象中的属性值(对象名称.属性名称)

这是wxml的相关代码:

  1. <view> 你好,{ { uname}}
  2. </view> <!-- 属性的值也可以是动态的 --> <view data-uid='{ { uid}}' class='{ { cls}}'>测试属性</view> <!-- 支持简单计算 --> <view>{ { 1 + 1}}</view> <!-- 支持复据展示 --> <view>
  3. { { info.age + '--------' + info.gender}}
  4. </view>

这是wxss的相关代码:

  1. .data-uid{
  2. width:200rpx;
  3. height: 150px;
  4. background:red;
  5. }

这是js的相关代码:

只看data部分即可

  1. // pages/jichu/jichu.js
  2. Page({
  3. /** * 页面的初始数据 */
  4. data: {
  5. background: ['red', 'pink', '#ccc'],
  6. indicatorDots: true,
  7. vertical: false,
  8. autoplay: false,
  9. interval: 2000,
  10. duration: 500,
  11. uname: '张阳光',
  12. cls: 'data-uid',
  13. info: { age: 23, gender:'按钮'}
  14. },
  15. changeIndicatorDots() {
  16. this.setData({
  17. indicatorDots: !this.data.indicatorDots
  18. })
  19. },
  20. changeAutoplay() {
  21. this.setData({
  22. autoplay: !this.data.autoplay
  23. })
  24. },
  25. intervalChange(e) {
  26. this.setData({
  27. interval: e.detail.value
  28. })
  29. },
  30. durationChange(e) {
  31. this.setData({
  32. duration: e.detail.value
  33. })
  34. },
  35. /** * 生命周期函数--监听页面加载 */
  36. onLoad: function (options) {
  37. },
  38. /** * 生命周期函数--监听页面初次渲染完成 */
  39. onReady: function () {
  40. },
  41. /** * 生命周期函数--监听页面显示 */
  42. onShow: function () {
  43. },
  44. /** * 生命周期函数--监听页面隐藏 */
  45. onHide: function () {
  46. },
  47. /** * 生命周期函数--监听页面卸载 */
  48. onUnload: function () {
  49. },
  50. /** * 页面相关事件处理函数--监听用户下拉动作 */
  51. onPullDownRefresh: function () {
  52. },
  53. /** * 页面上拉触底事件的处理函数 */
  54. onReachBottom: function () {
  55. },
  56. /** * 用户点击右上角分享 */
  57. onShareAppMessage: function () {
  58. return {
  59. title: 'swiper',
  60. path: 'page/component/pages/swiper/swiper'
  61. }
  62. }
  63. })

效果:在这里插入图片描述

条件渲染

  • wx-if
  • wx-elif
  • wx-else

本质上用法和vue的v-if v-if else 和 v-else 一样,当对应的分支的值为true就显示
wxml相关代码:

  1. <!--pages/jichu/jichu.wxml--> <view class="container"> <view wx:if='{ { score>=90}}' class="{ { cls}}">优秀</view> <view wx:elif='{ { score<90&&score>=80}}' class="{ { cls}}">良好</view> <view wx:elif='{ { score<80&&score>=60}}' class="{ { cls}}">一般</view> <view wx:else class="{ { cls}}">just so so</view>
  2. </view>

wxss相关代码:

  1. .container{
  2. width: 730rpx;
  3. height: 450rpx;
  4. margin: 10rpx auto;
  5. padding: 5rpx;
  6. border-radius: 20rpx;
  7. background-color: #ccc;
  8. }
  9. .data-uid{
  10. margin: 150rpx auto;
  11. width:200rpx;
  12. height: 50px;
  13. background:red;
  14. text-align: center;
  15. line-height: 100rpx;
  16. color: #ccc;
  17. }

js相关代码:

  1. Page({
  2. /** * 页面的初始数据 */
  3. data: {
  4. score: 40,
  5. cls:'data-uid'
  6. },
  7. })

效果:
分数小于60的:
在这里插入图片描述
良好的,就是数字在90到80之间:
在这里插入图片描述
其它数值只需要改data对应的值就好了。显示效果一样。、

相关补冲:
当你需要同时控制好几个标签一起显示隐藏的时候,可以通过 block 内放置 wx:if ,因为在微信小程序中,block标签类似于vue的template标签不会进行渲染]

hidden属性和wx:if的区别

  • 类似于vue中的中v-if和v-show的区别

    • 内置组件都有一个hidden属性:如果值为false就显示,为true就不显示
    • 通过hidden控制标签渲染的话,无论是否显示内容,实际上都进行了渲染,类似于vue中的v-show
    • 应用场景:如果要频繁的控制组件的显示或者隐藏,那么推荐使用hidden

列表渲染

  • wx:for
  • wx:key 的作用:保证兄弟节点被唯一区分,主要用于提高性能

wx:for和vue的v-for一样
都是基于数据对标签进行对应的重复渲染,数据多少标签渲染多少,对象和数组都可以渲染

  1. <view class="container" wx:for='{ {examination}}' wx:key='{ {index}}'>
  2. <view class="{ {cls}}">{ { index}} { { item}}</view>
  3. <!-- 默认item表示其中一项数据 -->
  4. <!-- 默认index表示数据项的索引 -->
  5. </view>

可以对 index 和item起别名:

  • wx:for-index 给索引起别名为num
  • wx:for-item 给数据项起别名为 name


    { { num}} { { name}}

    .container{
    width: 730rpx;
    height: 450rpx;
    margin: 10rpx auto;
    padding: 5rpx;
    border-radius: 20rpx;
    background-color: #ccc;
    }
    .data-uid{
    margin: 150rpx auto;
    width:200rpx;
    height: 50px;
    background:red;
    text-align: center;
    line-height: 100rpx;
    color: #ccc;
    }

    Page({

    /* 页面的初始数据 */
    data: {

    1. score:85,
    2. cls:'data-uid',
    3. examination: ['优秀', '良好', '一般','just so so']

    },

  1. })

效果:
在这里插入图片描述

事件处理
支持的事件类型

事件的绑定方式:bind:【事件名称】, bindchange=“changeAutoplay”
js文件中定义事件的处理函数

  1. <view class="tab">
  2. <!-- bandleChange 表示 change事件 tap是事件名称 -->
  3. <view class="title" bind:tap='handleChange'>
  4. <button wx:key='{ {item.id}}' wx:for='{ {tabData}}' data-id='{ {item.id}}' class="{ {currentId === item.id? 'bj active': ''}}">{ { item.name}}</button>
  5. </view>
  6. <view wx:key='{ {item.id}}' wx:for='{ {tabData}}' class=" content { {currentId === item.id?'active container': 'show'}}">
  7. <view class="{ {cls}}">{ { item.content}}</view>
  8. <!-- 默认item表示其中一项数据 -->
  9. <!-- 默认index表示数据项的索引 -->
  10. </view>
  11. <!-- <view wx:key='{ {item.id}}' wx:for='{ {tabData}}' class="content { {currentId === item.id?'active': ''}}">{ { item.content}}</view> -->
  12. </view>
  13. .title{
  14. display: flex;
  15. }
  16. button{
  17. flex: 1;
  18. }
  19. .bj{
  20. background: #ccc;
  21. }
  22. .show{
  23. display: none;
  24. }
  25. .container{
  26. width: 730rpx;
  27. height: 450rpx;
  28. margin: 10rpx auto;
  29. padding: 5rpx;
  30. border-radius: 20rpx;
  31. background-color: #ccc;
  32. }
  33. .data-uid{
  34. margin: 150rpx auto;
  35. width:200rpx;
  36. height: 50px;
  37. background:pink;
  38. text-align: center;
  39. line-height: 100rpx;
  40. }
  41. Page({
  42. /** * 页面的初始数据 */
  43. data: {
  44. score:85,
  45. cls:'data-uid',
  46. examination: ['优秀', '良好', '一般','just so so'],
  47. // 选项卡当前选中的ID
  48. currentId: '1',
  49. tabData: [{
  50. id: '1',
  51. name: '张阳光',
  52. content: '优秀'
  53. }, {
  54. id: '2',
  55. name: 'tom',
  56. content: '良好'
  57. }, {
  58. id: '3',
  59. name: 'spike',
  60. content: '一般'
  61. }, {
  62. id: '4',
  63. name: 'kitty',
  64. content: 'just so so'
  65. }]
  66. },
  67. handleChange(e) {
  68. // console.log(e.target.dataset.id)
  69. this.setData({
  70. // 通过自定义属性获取按钮的id,进而更新当前的选中状态,进而影响类名的变化
  71. currentId: e.target.dataset.id
  72. })
  73. },
  74. })

效果:
在这里插入图片描述
在这里插入图片描述
绑定事件方式

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

控制事件捕获

  • capture-bind 不阻止捕获事件向内部传递
  • capture-catch 阻止捕获事件向内部传递


    点击

事件对象:可以通过事件函数获取

  • currentTarget和target的区别:

    • 如果是事件源的话,currentTarget和target相同
    • 需要区分事件源和冒泡发生的事件行为
    • target表示事件源,就是实际触发事件的组件
    • currentTarget表示当前触发事件的组件,有可能是冒泡触发的事件
    • 如果要获取触发组件的data-数据,要使用event.target.dataset获取属性的数据

发表评论

表情:
评论列表 (有 0 条评论,84人围观)

还没有评论,来说两句吧...

相关阅读

    相关 WXML 模板语法

    WXML wxml是框架设计的一套标签语言,结合基础组件,事件系统,可以构建出页面的结构 1、数据绑定 在js文件中data里加入我们需要的数据,这里如图所示加入error