微信小程序实战 (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: intmsg: stringtime: 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
微信小程序实战 (WXML:小程序版HTML)相关推荐
- 前端《Vue.js从入门到项目实战》PDF课件+《微信小程序实战入门第2版》PDF代码调试
JS进行开发,正如一切的编程语言都立足于电元信号的正负极,即01码,可为什么软件都不采用二进制编码来 进行开发呢?这里面牵扯到一个成本的问题,这正是影响项目领导者进行决策的关键因素.Vue项目与原生J ...
- 微信小程序实战 (WXSS:小程序版CSS、WXS:小程序版JavaScript)
上一篇讲了WXML:小程序版HTML,这一篇介绍WXSS:小程序版CSS. 1. WXSS:小程序版CSS. WXSS是一套样式语言,为了便于前端开发的上手,WXSS同HTML的CSS样式文件大部分特 ...
- 微信小程序实战通:小程序结合flask后台实现身份证智能识别
最近在工作上需要在微信上开发小程序.作为一个熟练于电脑客户端开发,网页前后台全栈开发,驱动开发,系统底层开发等多年经验的老鸟而言,刚开始接触小程序任务时居然一时有点懵逼,这是任何人面对全新领域时的正常 ...
- java注销对话框_【java小程序实战】小程序注销功能实现
小程序实战中,如何实现程序的注销功能呢?后端代码只要删除用户的redi缓存即可.小程序端在成功返回消息后,进行登陆页面的跳转. 文章目录 小程序的mine.wxml代码 mine.wxss代码 注销事 ...
- 【java小程序实战】小程序注销功能实现
小程序实战中,如何实现程序的注销功能呢?后端代码只要删除用户的redi缓存即可.小程序端在成功返回消息后,进行登陆页面的跳转. 文章目录 小程序的mine.wxml代码 mine.wxss代码 注销事 ...
- 微信小程序实战之百思不得姐精简版
为什么80%的码农都做不了架构师?>>> 微信小程序基本组件和API已撸完,总归要回到正题的,花了大半天时间做了个精简版的百思不得姐,包括段子,图片,音频,视频,四个模块.这篇 ...
- 微信社交小程序服务器,Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端...
要搞一个小型的cms内容发布系统 因为小程序上线之后,直接对数据库进行操作的话,慧出问题的,所以一般都会做一个管理系统,让工作人员通过这个管理系统来对这个数据库进行增删改查 微信小程序其实给我们提供了 ...
- 耗时一个月,前端开发之小程序实战-----虎牙小程序
文章目录 前言 一.小程序是什么? 二.知识储备 1.CSS 声明 基础知识 2.JavaScript 3.React React简介 React概述 React框架的优点 我谈React React ...
- 【java小程序实战】小程序短视频后台项目之MD5加密工具类
对字符串进行简单加密,直接上代码: package com.imooc.utils;import org.apache.commons.codec.binary.Base64;import java. ...
最新文章
- mysql+xml+注释,springboot整合mybatis完整示例, mapper注解方式和xml配置文件方式实现(我们要优雅地编程)...
- [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积
- Qt QML页面翻转控件封装
- centos 安装 telnet
- HarmonyOS之组件布局的创建和使用
- oracle with check option 的作用
- 文件指针和文件描述符之间的相互转换 fd----fp 和 fp----fd
- 2021年美食类短视频及直播营销趋势洞察
- 微软:“不好意思,我们还不够Cool,不能运行”
- PHP 获取访问来源
- 洛谷 [P1387] 最大正方形
- MFC最详细入门教程[转载]
- Arduino框架下合宙ESP32C3 +1.8“TFT液晶屏通过TFT_eSPI库驱动显示
- 龙芯3U板卡学习资料第706篇: GEC-2K1000 龙芯3U板卡
- 2022低压电工操作证考试题及模拟考试
- 【中国人口金字塔2019,python,pandas,matplotlib,numpy 】
- 经典影视剧《大宋提刑官》——老剧重看,再添心得
- 什么是 Scale.js ?
- C语言学习笔记第十天
- 有了这个sku分析!老板再也不用担心我不会选款备货了
热门文章
- redis系列之哨兵模式
- python进行机器学习(四)之模型验证与参数选择
- c++屏蔽Win10系统快捷键
- 利用PaddleDetection自制自己的图像预测项目(二)摄像头检测获得坐标
- uni-app聊天功能输入框删除emoji表情
- C Primer Plus NO.8
- 【Java8】函数式接口
- evo测试工具错误: evo module evo.main_traj crashed - no logfile written (disabled)
- 虚拟服务器hydra,使用hydra构建六大服务器及混合服务器
- 结合若依框架实现微信小程序授权登录