<!-- wxml --><view> {{message}} </view>
// page.jsPage({data: {message: 'Hello MINA!'}})
<!--wxml--><view wx:for="{{array}}"> {{item}} </view>
<!--wxml--><view wx:if="{{view == 'WEBVIEW'}}"> WEBVIEW </view><view wx:elif="{{view == 'APP'}}"> APP </view><view wx:else="{{view == 'MINA'}}"> MINA </view>
// page.jsPage({data: {view: 'MINA'}})
<!--wxml--><template name="staffName"><view>FirstName: {{firstName}}, LastName: {{lastName}}</view></template><template is="staffName" data="{{...staffA}}"></template><template is="staffName" data="{{...staffB}}"></template><template is="staffName" data="{{...staffC}}"></template>
// page.jsPage({data: {staffA: {firstName: 'Hulk', lastName: 'Hu'},staffB: {firstName: 'Shang', lastName: 'You'},staffC: {firstName: 'Gideon', lastName: 'Lin'}}})
display: -webkit-flex
属性。设备 | 屏幕宽度 | rpx 换算 px(屏幕宽度/750) | px 换算 rpx (750/屏幕宽度) |
iPhone5 | 320px | 1rpx = 0.42px | 1px = 2.34rpx |
iPhone6 | 375px | 1rpx = 0.5px | 1px = 2rpx |
iPhone6 Plus | 414px | 1rpx = 0.552px | 1px = 1.81rpx |
@import
语句可以导入外联样式表,@import
后跟需要导入的外联样式表的相对路径,用;
表示语句结束。/** common.wxss **/.small-p {padding:5px;}
/** app.wxss **/@import "common.wxss";.middle-p {padding:15px;}
/** common.wxss **/.small-p {padding:5px;}
<view class="normal_view" />
选择器 | 样例 | 样例描述 |
.class | .intro | 选择所有拥有 class="intro" 的组件 |
#id | #firstname | 选择拥有 id="firstname" 的组件 |
element | view | 选择所有 view 组件 |
element,element | view, checkbox | 选择所有文档的 view 组件和所有的 checkbox 组件 |
::after | view::after | 在 view 组件后边插入内容 |
::before | view::before | 在 view 组件前边插入内容 |
<!--wxml--><wxs module="m1">var msg = "hello world";module.exports.message = msg;</wxs><view> {{m1.message}} </view>
hello world
// page.jsPage({data: {array: [1, 2, 3, 4, 5, 1, 2, 3, 4]}})
<!--wxml--><!-- 下面的 getMax 函数,接受一个数组,且返回数组中最大的元素的值 --><wxs module="m1">var getMax = function(array) {var max = undefined;for (var i = 0; i < array.length; ++i) {max = max === undefined ?array[i] :(max >= array[i] ? max : array[i]);}return max;}module.exports.getMax = getMax;</wxs><!-- 调用 wxs 里面的 getMax 函数,参数为 page.js 里面的 array --><view> {{m1.getMax(array)}} </view>
5
bindtap
,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。<view id="tapTest" data-hi="Weixin" bindtap="tapName"> Click me! </view>
Page
定义中写上相应的事件处理函数,参数是event
。Page({tapName: function(event) {console.log(event)}})
{"type":"tap","timeStamp":895,"target": {"id": "tapTest","dataset": {"hi":"Weixin"}},"currentTarget": {"id": "tapTest","dataset": {"hi":"Weixin"}},"detail": {"x":53,"y":14},"touches":[{"identifier":0,"pageX":53,"pageY":14,"clientX":53,"clientY":14}],"changedTouches":[{"identifier":0,"pageX":53,"pageY":14,"clientX":53,"clientY":14}]}
event.instance
对象,第二个参数是ownerInstance
和event.instance
一样是一个ComponentDescriptor
对象。具体使用如下:<wxs module="wxs" src="./test.wxs"></wxs><view id="tapTest" data-hi="Weixin" bindtap="{{wxs.tapName}}"> Click me! </view>**注:绑定的WXS函数必须用{{}}括起来**
function tapName(event, ownerInstance) {console.log('tap Weixin', JSON.stringify(event))}module.exports = {tapName: tapName}
var wxsFunction = function(event, ownerInstance) {var instance = ownerInstance.selectComponent('.classSelector') // 返回组件的实例instance.setStyle({"font-size": "14px" // 支持rpx})instance.getDataset()instance.setClass(className)// ...return false // 不往上冒泡,相当于调用了同时调用了stopPropagation和preventDefault}
event
是小程序事件对象基础上多了 event.instance
来表示触发事件的组件的 ComponentDescriptor
实例。ownerInstance
表示的是触发事件的组件所在的组件的 ComponentDescriptor
实例,如果触发事件的组件是在页面内的,则 ownerInstance
表示的是页面实例。ComponentDescriptor
目前支持的 API 如下:方法 | 参数 | 描述 |
selectComponent | selector 对象 | 返回组件的 ComponentDescriptor 实例。 |
selectAllComponents | selector对象数组 | 返回组件的 ComponentDescriptor 实例数组。 |
setStyle | Object/string | 设置组件样式,支持 rpx 。设置的样式优先级比组件 wxml 里面定义的样式高。不能设置最顶层页面的样式。 |
addClass/removeClass/hasClass | string | 设置组件的 class。设置的 class 优先级比组件 wxml 里面定义的 class 高。不能设置最顶层页面的 class。 |
getDataset | 无 | 返回当前组件/页面的 dataset 对象。 |
callMethod | (funcName:string, args:object) | 调用当前组件/页面在逻辑层(App Service)定义的函数。funcName 表示函数名称,args 表示函数的参数。 |
getState | 无 | 返回一个 object 对象,当有局部变量需要存储起来后续使用的时候用这个方法。 |
triggerEvent | (eventName, detail) | 和组件的triggerEvent一致。 |
<wxs module="test" src="./test.wxs"></wxs><viewchange:prop="{{test.propObserver}}"prop="{{propValue}}"bindtouchmove="{{test.touchmove}}"class="movable"></view>
change:
前缀)是在 prop 属性被设置的时候触发 WXS 函数,值必须用{{}}
括起来。类似 Component 定义的 properties 里面的 observer 属性,在 setData({propValue: newValue})
调用之后会触发。{{}}
括起来。当 prop 的值被设置 WXS 函数就会触发,而不只是值发生改变,所以在页面初始化的时候会调用一次 WxsPropObserver 的函数。test.wxs
里面定义并导出事件处理函数和属性改变触发的函数:module.exports = {touchmove: function(event, instance) {console.log('log event', JSON.stringify(event))},propObserver: function(newValue, oldValue, ownerInstance, instance) {console.log('prop observer', newValue, oldValue)}}
类型 | 触发条件 |
touchstart | 手指触摸动作开始 |
touchmove | 手指触摸后移动 |
touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 |
touchend | 手指触摸动作结束 |
tap | 手指触摸后马上离开 |
longpress | 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap 事件将不被触发 |
longtap | 手指触摸后,超过350ms再离开(推荐使用 longpress 事件代替) |
transitionend | 会在 WXSS transition 或 wx.createAnimation 动画结束后触发 |
animationstart | 会在一个 WXSS animation 动画开始时触发 |
animationiteration | 会在一个 WXSS animation 一次迭代结束时触发 |
animationend | 会在一个 WXSS animation 动画完成时触发 |
touchforcechange | 在支持 3D Touch 的 iPhone 设备,重按时会触发 |
<view bindtap="handleTap">Click here!</view>
handleTap
会被调用。<view bindtap="{{ handlerName }}">Click here!</view>
this.data.handlerName
必须是一个字符串,指定事件处理函数名;如果它是个空字符串,则这个绑定会失效(可以利用这个特性来暂时禁用一些事件)。bind
后可以紧跟一个冒号,其含义不变,如 bind:tap
bind
外,也可以用catch
来绑定事件。与bind
不同,catch
会阻止事件向上冒泡。handleTap3
和handleTap2
(因为 tap 事件会冒泡到 middle view,而 middle view 阻止了 tap 事件冒泡,不再向父节点传递),单击 middle view 会触发handleTap2
,单击 outer view 会触发handleTap1
。<view id="outer" bindtap="handleTap1">outer view<view id="middle" catchtap="handleTap2">middle view<view id="inner" bindtap="handleTap3">inner view</view></view></view>
bind
和 catch
外,还可以使用 mut-bind
来绑定事件。一个 mut-bind
触发后,如果事件冒泡到其他节点上,其他节点上的 mut-bind
绑定函数不会被触发,但 bind
绑定函数和 catch
绑定函数依旧会被触发。mut-bind
是“互斥”的,只会有其中一个绑定函数被触发。同时,它完全不影响 bind
和 catch
的绑定效果。handleTap3
和 handleTap2
,单击 middle view 会调用 handleTap2
和 handleTap1
。<view id="outer" mut-bind:tap="handleTap1">outer view<view id="middle" bindtap="handleTap2">middle view<view id="inner" mut-bind:tap="handleTap3">inner view</view></view></view>
capture-bind
、capture-catch
关键字,后者将中断捕获阶段和取消冒泡阶段。handleTap2
、handleTap4
、handleTap3
、handleTap1
。<view id="outer" bind:touchstart="handleTap1" capture-bind:touchstart="handleTap2">outer view<view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">inner view</view></view>
<view id="outer" bind:touchstart="handleTap1" capture-catch:touchstart="handleTap2">outer view<view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">inner view</view></view>
属性 | 类型 | 说明 |
type | String | 事件类型 |
timeStamp | Integer | 事件生成时的时间戳 |
target | Object | 触发事件的组件的一些属性值集合 |
currentTarget | Object | 当前组件的一些属性值集合 |
属性 | 类型 | 说明 |
detail | Object | 额外的信息 |
属性 | 类型 | 说明 |
touches | Array | 触摸事件,当前停留在屏幕中的触摸点信息的数组 |
changedTouches | Array | 触摸事件,当前变化的触摸点信息的数组 |
属性 | 类型 | 说明 |
id | String | 事件源组件的 id |
dataset | Object | 事件源组件上由 data - 开头的自定义属性组成的集合 |
属性 | 类型 | 说明 |
id | String | 当前组件的 id |
Object | 当前组件上由 data - 开头的自定义属性组成的集合 |
<view data-alpha-beta="1" data-alphaBeta="2" bindtap="bindViewTap"> DataSet Test </view>
Page({bindViewTap:function(event){event.currentTarget.dataset.alphaBeta === 1 // - 会转为驼峰写法event.currentTarget.dataset.alphabeta === 2 // 大写会转为小写}})
属性 | 类型 | 说明 |
identifier | Number | 触摸点的标识符 |
pageX, pageY | Number | 距离文档左上角的距离,文档的左上角为原点,横向为X轴,纵向为Y轴 |
clientX, clientY | Number | 距离页面可显示区域(屏幕除去导航条)左上角距离,横向为X轴,纵向为Y轴 |
属性 | 类型 | 说明 |
identifier | Number | 触摸点的标识符 |
x, y | Number | 距离 Canvas 左上角的距离,Canvas 的左上角为原点 ,横向为X轴,纵向为Y轴 |
detail
带有的 x, y 同 pageX, pageY 代表距离文档左上角的距离。开始标签
和结束标签
,属性
用来修饰这个组件,内容
在两个标签之内。<tagname property="value">Content goes here ...</tagname>
类型 | 描述 | 注解 |
Boolean | 布尔值 | 组件写上该属性,不管是什么值都被当作 true ;只有组件上没有该属性时,属性值才为false 。
如果属性值为变量,变量的值会被转换为 Boolean 类型。 |
Number | 数字 | 1, 2.5 |
String | 字符串 | "string" |
Array | 数组 | [ 1, "string" ] |
Object | 对象 | { key: value } |
EventHandler | 事件处理函数名 | |
Any | 任意属性 | - |
属性名 | 类型 | 描述 | 注解 |
id | String | 组件的唯一标示 | 保持整个页面唯一 |
class | String | 组件的样式类 | 在对应的 WXSS 中定义的样式类 |
style | String | 组件的内联样式 | 可以动态设置的内联样式 |
hidden | Boolean | 组件是否显示 | 所有组件默认显示 |
data-* | Any | 自定义属性 | 组件上触发的事件时,会发送给事件处理函数 |
bind* / catch* | EventHandler | 组件的事件 |
const query = wx.createSelectorQuery()query.select('#the-id').boundingClientRect(function(res){res.top // #the-id 节点的上边界坐标(相对于显示区域)})query.selectViewport().scrollOffset(function(res){res.scrollTop // 显示区域的竖直滚动位置})query.exec()
.target-class
指定)每次进入或离开页面显示区域时,触发回调函数。Page({onLoad: function(){wx.createIntersectionObserver().relativeToViewport().observe('.target-class', (res) => {res.id // 目标节点 idres.dataset // 目标节点 datasetres.intersectionRatio // 相交区域占目标节点的布局区域的比例res.intersectionRect // 相交区域res.intersectionRect.left // 相交区域的左边界坐标res.intersectionRect.top // 相交区域的上边界坐标res.intersectionRect.width // 相交区域的宽度res.intersectionRect.height // 相交区域的高度})}})
Page({onLoad: function(){wx.createIntersectionObserver(this, {thresholds: [0.2, 0.5]}).relativeTo('.relative-class').relativeToViewport().observe('.target-class', (res) => {res.intersectionRatio // 相交区域占目标节点的布局区域的比例res.intersectionRect // 相交区域res.intersectionRect.left // 相交区域的左边界坐标res.intersectionRect.top // 相交区域的上边界坐标res.intersectionRect.width // 相交区域的宽度res.intersectionRect.height // 相交区域的高度})}})
this.createIntersectionObserver
来代替 wx.createIntersectionObserver ,这样可以确保在正确的范围内选择节点。app.json
的 window
段中设置 "pageOrientation": "auto"
,或在页面 json 文件中配置 "pageOrientation": "auto"
。{"pageOrientation": "auto"}
pageOrientation
还可以被设置为 landscape
,表示固定为横屏显示。{"resizable": true}
.my-class {width: 40px;}@media (min-width: 480px) {/* 仅在 480px 或更宽的屏幕上生效的样式规则 */.my-class {width: 200px;}}
Page({onResize(res) {res.size.windowWidth // 新的显示区域宽度res.size.windowHeight // 新的显示区域高度}})
Component({pageLifetimes: {resize(res) {res.size.windowWidth // 新的显示区域宽度res.size.windowHeight // 新的显示区域高度}}})
bindtransitionend
bindanimationstart
bindanimationiteration
bindanimationend
来监听动画事件。事件名 | 含义 |
transitionend | CSS 渐变结束或 wx.createAnimation 结束一个阶段 |
animationstart | CSS 动画开始 |
animationiteration | CSS 动画结束一个阶段 |
animationend | CSS 动画结束 |
本页内容是否解决了您的问题?