微信小程序实战 (WXML:小程序版HTML)

简介: 微信小程序实战 (WXML:小程序版HTML)

上一篇讲了小程序框架基础,这一篇介绍WXML:小程序版HTML。

1.标签与属性

常用基础标签text view

特征:

text 类似html span标签 行内元素,不换行;

view 类似html div标签 块级元素,换行;

新建页面

<text>text 类似html span标签 行内元素</text>
<text>,不换行</text>
<view>view 类似html div标签 块级元素</view>
<view>view 类似html div标签 换行</view>
复制代码

测试

网络异常,图片无法展示
|
公共属性

所有组件都有以下属性:

网络异常,图片无法展示
|

2.数据绑定

数据绑定功能使得程序在运行过程中,具备动态改变渲染界面的能力,从而达到了更好的用户体验效果。在
WEB开发中,需要借助JavaScript并通过DOM接口来实现界面的动态更新,而在小程序中,则是使用WXML
语言提供的数据绑定功能来实现的。
复制代码

2.1简单数据绑定

data: {
    id:1, message: 'Hello MINA!', 
    number:1234, 
    condition:true, 
    isChecked:true, 
    person:{ name:"张三", age:25, sex:"男" }
  },
复制代码
<view>{{message}}</view> 
<view>{{number}}</view> 
<view>{{condition}}</view> 
<view>{{isChecked}}</view> 
<view>{{person}}</view> 
<view>{{person.name}}</view> 
<view>{{person.age}}</view> 
<view>{{person.sex}}</view> <!-- 自定义属性 data-* --> 
<view data-number="{{number}}">自定义属性</view> <!-- 组件属性(需要在双引号之内) --> 
<view id="item-{{id}}">组件属性</view> <!-- 控制属性(需要在双引号之内) --> 
<view wx:if="{{condition}}">控制属性</view> <!-- 使用布尔类型充当属性 --> 
<checkbox checked="{{isChecked}}"></checkbox>
复制代码

测试:

网络异常,图片无法展示
|

2.2运算

可以在 {{}} 内进行简单的运算,支持的有如下几种方式

2.2.1 三元运算

如果flag条件是true 则hidden =true 如果flag条件是false 则hidden =false

<view hidden="{{flag?true:false}}">三元运算</view>
复制代码

网络异常,图片无法展示
|

2.2.2 算数运算

<view> {{a + b}} + {{c}} + d </view>
复制代码
a: 1, 
    b: 2, 
    c: 3
复制代码

2.2.3 逻辑判断

当length大于5时展示逻辑判断

<view wx:if="{{length > 5}}">逻辑判断</view>
复制代码

网络异常,图片无法展示
|

2.2.4 字符串运算

<view>{{"hello " + name}}</view>
复制代码

2.2.5 数据路径运算

<view>{{object.key}} {{array[0]}}</view>
复制代码
object: { key: ' 数据路径运算 ' },
    array: ['MINA','safsd']
复制代码

3.列表渲染

在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。(就是说数组有多少条数据,他就会渲染该组件多少次)

userArray:[ 
      { id:1, name:"张三" },
      { id:2, name:"李四" },
      { id:3, name:"王五" } 
    ]
复制代码
<view wx:for="{{userArray}}" wx:for-item="item" wx:for-index="index"> {{index}}-{{item.id}}-{{item.name}} </view>
复制代码

测试

网络异常,图片无法展示
|

4.条件渲染

4.1 wx:if

在框架中,使用 wx:if="" 来判断是否需要渲染该代码块:

<view wx:if="{{condition}}"> True </view>
复制代码

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

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

4.2 block wx:if

因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使

用一个  标签将多个组件包装起来(这样避免每个组件都要写一遍 wx:if判断条件),并在上边使用 wx:if 控制属性。

<block wx:if="{{true}}">
<view> view1 </view>
<view> view2 </view>
</block>
复制代码

注意:  并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

4.2 hidden 与 wx:if

使用

<view hidden="{{condition}}">hidden</view>
复制代码

他们有什么区别呢?

wx:if 也是惰性的,如果在初始渲染条件为 false ,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。
hidden 就简单的多,组件始终会被渲染,只是简单的控制显示与隐藏。
复制代码

他们的使用场景

一般来说, wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。
复制代码

5.模板

WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。

5.1定义模版

使用 name 属性,作为模板的名字。然后在 template 内定义代码片段,如:

<!--
index: int
msg: string
time: string
-->
<template name="msgItem">
<view>
<text> {{index}}: {{msg}} </text>
<text> Time: {{time}} </text>
</view>
</template>
复制代码

5.2使用模版

使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入,如:

<template is="msgItem" data="{{...item}}"/>
复制代码
data: {
    item: { 
      index: 0,
       msg: 'this is a template',
        time: '2022-10-07' 
      }
  },
复制代码

网络异常,图片无法展示
|

5.3模版的作用域

模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的  模块。

6.引用

WXML 提供两种文件引用方式 import 和 include 。

6.1 import

import 可以在该文件中使用目标文件定义的 template ,如:

在 item.wxml 中定义了一个叫 item 的 template :

<!-- item.wxml -->
<template name="item">
  <text>{{text}}</text>
</template>
复制代码

在 importTest.wxml 中引用了 item.wxml,就可以使用 item 模板:

<import src="item.wxml"/> 
<view>模板引入</view>
<template is="item" data="{{text: 'forbar'}}"/>
复制代码

import 的作用域

import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 import 目标文件import 的 template。(额,比较绕,就是不能引用引用的引用)

如:C import B,B import A,在C中可以使用B定义的 template ,在B中可以使用A定义的 template ,但是C不能使用A定义的 template 。

6.2 include

include 可以将目标文件除了 template、 wxs 外的整个代码引入,相当于是拷贝到 include

位置,如:

<view>测试include </view>
<!-- index.wxml -->
<include src="header.wxml"/>
<view> body </view>
<include src="footer.wxml"/>
复制代码
<!-- header.wxml -->
<view> header </view>
复制代码
<!-- footer.wxml -->
<view> footer </view>
复制代码

网络异常,图片无法展示
|

7.事件

7.1 什么是事件?

官文

事件是视图层到逻辑层的通讯方式。
事件可以将用户的行为反馈到逻辑层进行处理。
事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
事件对象可以携带额外信息,如 id, dataset, touches。
复制代码

7.2 事件使用方式

<!--pages/eventTest/eventTest.wxml-->
<text>pages/eventTest/eventTest.wxml</text>
<view id="tapTest" data-hi="Weixin"  bindtap="tapName"> 点击事件测试 </view>
复制代码
/**
   * 点击事件处理逻辑
   * @param {*} event 
   */
  tapName: function(event) {
     console.log(event) 
    },
复制代码

网络异常,图片无法展示
|

7.3 事件分类

根据组件触发事件时是否会向父节点传递,将事件分为冒泡事件、非冒泡事件

7.4 绑定并阻止事件冒泡

属性catch 会阻止事件向上冒泡

<view id="outer" bindtap="handleTap1">
  outer view
  <view id="middle" catchtap="handleTap2">
    middle view
    <view id="inner" bindtap="handleTap3">
      inner view
    </view>
  </view>
</view>
复制代码
handleTap1: function(event) {
    console.log("handleTap1:"+event) 
    },
    handleTap2: function(event) {
    console.log("handleTap2:"+event) 
    },
    handleTap3: function(event) {
    console.log("handleTap3:"+event) 
    },
复制代码

测试,点击 inner view 发现控制台打印handleTap3 、handleTap2 说明事件在handleTap2时已经阻止了冒泡传递,因此阻止事件冒泡可以使用catch属性

网络异常,图片无法展示
|

实例1 (实现文本输入框和文本框数据同步)

<input type="text" style="border:1px solid;padding:2px;margin:2px;" bindinput="handleInput" /> <text>文本框的值是:{{num}}</text>
复制代码
handleInput: function(e) {
    console.log(e.detail.value); 
    this.setData({ num:e.detail.value })    
  },
复制代码

测试输入框内容发生改变时,触发handleInput 事件逻辑,执行num赋值操作。

网络异常,图片无法展示
|

实例2 (实现简单加计算器)

<view>-实现简单加计算器-</view>
<input type="number" model:value="{{numA}}" class="inputNumber"/> 
<button>+</button> 
<input type="number" model:value="{{numB}}" class="inputNumber"/> 
<button bindtap="handleTap">=</button> 
<input type="number" disabled value="{{total}}" class="inputNumber"/>
复制代码

样式文件

/* pages/eventTest/eventTest.wxss */
.inputNumber{ 
  border:1px solid gray; 
  padding:2px; 
  margin:1px 20px 1px 20px; 
}
复制代码
data: {
    numA:'', 
    numB:'', 
    total:''
  },
  /** 处理按钮点击事件 
   * @param {} e 事件源 
   **/ 
  handleTap(e){ 
    console.log(e); 
    console.log(this.data.numA); 
    console.log(this.data.numB); 
    this.setData({ total:parseInt(this.data.numA)+parseInt(this.data.numB) }) 
  },
复制代码

进阶,事件传参功能 使用data-*

data-*
自定义属性
组件上触发的事件时,会发送给事件处理
复制代码

按钮修改为data-action="=" ,设置action 参数为 =

<button bindtap="handleTap" data-action="=">=</button> 
复制代码

在handleTap 逻辑中获取自定义action参数 ,进行判断

/** 处理按钮点击事件 
   * @param {} e 事件源 
   **/ 
  handleTap(e){ 
    let action=e.currentTarget.dataset.action;
    console.log("获取自定义参数action :"+action);
    console.log(e); 
    console.log(this.data.numA); 
    console.log(this.data.numB); 
    if(action =="="){
      this.setData({ total:parseInt(this.data.numA)+parseInt(this.data.numB) }) 
    }else{
      console.log("获取自定义参数action获取失败")
    }
  },
复制代码

至此WXML:小程序版HTML结束

下一篇: WXSS:小程序版CSS


相关文章
|
11月前
|
缓存 小程序 前端开发
商城/点餐/家政类小程序源码合集_微信抖音小程序源码开发从入门到精通实战
本文系统讲解如何利用现有源码快速开发商城、点餐、家政类微信/抖音小程序,涵盖环境搭建、核心功能实现、多平台部署与优化,提供完整技术方案。实战导向,助力开发者高效入门与落地。
|
11月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
JSON 监控 小程序
微信百度字节小程序包过大解决方案(实战经验总结)-优雅草卓伊凡|果果|小无
微信百度字节小程序包过大解决方案(实战经验总结)-优雅草卓伊凡|果果|小无
1772 14
微信百度字节小程序包过大解决方案(实战经验总结)-优雅草卓伊凡|果果|小无
|
人工智能 自然语言处理 小程序
让小程序拥有“视觉之眼“:DeepSeek图像识别实战指南
本文介绍如何通过DeepSeek计算机视觉技术,赋予小程序“看懂世界”的能力。从构建视觉感知系统、训练专属视觉词典到创造会思考的界面,详细讲解了实现智能相册、植物识别器和老旧照片修复等功能的步骤。最后探讨性能优化与安全合规要点,展望未来视觉智能应用的无限可能。
|
JavaScript
jQuery+HTML5实现的微信大转盘抽奖源码
这是一款基于jQuery+HTML5实现的微信大转盘抽奖效果源码,是一款可配置奖品抽奖的jQuery大转盘抽奖代码,可实现点击按钮转轮旋转实现抽奖功能,效果逼真自然,代码里面有详细的注释,可以修改文字或者二次开发都可以
494 11
|
小程序 测试技术 数据安全/隐私保护
微信公众号接口测试实战指南
微信公众号接口测试是确保系统稳定性和功能完整性的重要环节。本文详细介绍了测试全流程,包括准备、工具选择(如Postman、JMeter)、用例设计与执行,以及常见问题的解决方法。通过全面测试,可以提前发现潜在问题,优化用户体验,确保公众号上线后稳定运行。内容涵盖基础接口、高级接口、微信支付和数据统计接口的测试,强调了功能验证、性能优化、安全保护及用户体验的重要性。未来,随着微信生态的发展,接口测试将面临更多挑战和机遇,如小程序融合、AI应用和国际化拓展。
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
4103 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
JavaScript 小程序 开发者
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
3665 0
|
移动开发 API C++
微信小程序 vs html5 :能力及限制
最后更新时间:2017-08-25 能力 生物识别。一般是指纹识别。基础库版本1.5.0 手机号快速填写组件(需用户主动点击,并确认授权,且小程序主体非个人),获得微信绑定的手机号。
2076 0
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中